Доброго дня, ардуинщики
помогите пожалуйста разобраться с семафорами:
по прочтеному в нете полагал, что если в коде таска встретился xSemaphoreTake( stD_Sem, portMAX_DELAY); то пока таск не получит этот семафор - код выполняться не будет, но по факту - код выполняется
код который должен ждать пока не закончат вращаться двигатели
код который вращает двигатели:
помогите пожалуйста разобраться с семафорами:
по прочтеному в нете полагал, что если в коде таска встретился xSemaphoreTake( stD_Sem, portMAX_DELAY); то пока таск не получит этот семафор - код выполняться не будет, но по факту - код выполняется
код который должен ждать пока не закончат вращаться двигатели
Код:
void Task_run(void *pvParameters) // This is a task.
{
for (;;)
{
xSemaphoreTake( run_Sem, portMAX_DELAY);
for (int n = 0; n < 3; n++) {
Serial.print("loop 1 # "); Serial.println(String(n));
int steps = 1000;
xQueueSend( d_Steps_Queue, &steps, 0 );
xSemaphoreTake( stD_Sem, portMAX_DELAY);// должно приостановиться здесь до выполнения таска прочитавшего из очереди d_Steps_Queue, по факту не останавливается
vTaskDelay(5000 / portTICK_PERIOD_MS);
}
Serial.println("run finished");
}
}
Код:
if (xQueueReceive(d_Steps_Queue, &steps, portMAX_DELAY)) // берет из очереди количество шагов
{
for (int i = 0; i < steps; i++) {
digitalWrite(MOTOR__enable_r, LOW); // enable stepper
for (int pos = 0; pos < steps; pos++) {
digitalWrite(MOTOR_STEP_PIN_r, HIGH);
vTaskDelay(delayms / portTICK_PERIOD_MS); // delay x 1ms
digitalWrite(MOTOR_STEP_PIN_r, LOW);
vTaskDelay(delayms / portTICK_PERIOD_MS); // delay x 1ms
//Serial.println("pos = " + String(pos));
}
digitalWrite(MOTOR__enable_r, HIGH); // disable stepper
xSemaphoreGive(stD_Sem);
}
}