У меня проблема с функцией vTaskDelayUntil(), не делая задержки, но заканчивая немедленно. Вот код:FreeRTOS vTaskDelayUntil() сразу заканчивается
TickType_t xLastWakeTime = xTaskGetTickCount();
while(1){
if (xSemaphoreTake(xSemaphoreRS485, portMAX_DELAY) == pdTRUE) {
printf("S display data %d\n", xTaskGetTickCount());
sendDisplayData();
printf("E display data %d\n", xTaskGetTickCount());
xSemaphoreGive(xSemaphoreRS485);
printf("W display data %d\n", xLastWakeTime);
vTaskDelayUntil(&xLastWakeTime, 2000);
}
}
От этого я получаю следующий вывод:
S display data 29928
E display data 30534
W display data 3919
S display data 30534
E display data 31140
W display data 5919
S display data 31140
E display data 31746
W display data 7919
S display data 31746
E display data 32352
W display data 9919
Функция sendDisplayData() занимает около 670 мс для выполнения и xTaskGetTickCount() это подтверждает. Затем задача должна подождать около 1230 мс, поэтому вся итерация может занять 2000 мс. Но vTaskDelayUntil() заканчивается немедленно. Первое исполнение закончилось на 30534, а второе - 30534. Значение, возвращаемое xTaskGetTickCount(), доказывает отсутствие задержки, введенной vTaskDelayUntil(). Я также вижу его по частоте вывода sendDisplayData().
Вторая забавная вещь: xLastWakeTime показывает совершенно разные значения, и эти значения фактически увеличиваются на 2000. Не следует ли хранить такое же значение, как и возвращаемое xTaskGetTickCount()?
У вас есть #define INCLUDE_vTaskDelayUntil 1 в вашем файле конфигурации? И вы уверены, что не переопределили TickType_t, допустим, подписали 16 бит? Попробуйте переместить TickType_t xLastWakeTime = xTaskGetTickCount(); после того, как при семафоре возьмут, теперь он покажет правильные значения? (Я знаю, что это не сделает то, что вы хотите, просто для простой проверки, если это вызвано тем, что в первый раз вы попадаете в vTaskDelay. Если вы уже превысили xLastWakeTime + 2000. – koper89
Да, у меня есть этот define и TickType_t - 32-разрядный тип. и инициализация xLastWakeTime помогает! Интересно, как. Конечно, мой оригинальный код не был идеальным, потому что получение semphore может занять до 10 секунд, а первый vTaskDelayUntil() немедленно выйдет. Но я до сих пор не знаю, почему на второй итерации эта переменная была установлена на 5919 не 30534. – grzegorz