Хотя portMAX_DELAY везде в официальной документации FreeRTOS упоминается как значение таймаута, соответствующее "бесконечному ожиданию", на самом же деле бесконечно длинная задержка будет только тогда, когда разрешена опция INCLUDE_vTaskSuspend в конфигурации FreeRTOS.
Константа portMAX_DELAY обычно определена как 0xFFFFFFFF т. е. 232-1:
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
Примечание: если разрешена опция 16-битных тиков configUSE_16_BIT_TICKS, то portMAX_DELAY будет определена как 0xFFFF (216-1).
В случае, когда In case INCLUDE_vTaskSuspend разрешена, значение portMAX_DELAY обрабатывается как специальное, и тогда задержка действительно бесконечная. Если же опция INCLUDE_vTaskSuspend не определена, то ожидание будет только лишь ждать 0xFFFFFFFF тиков (если подразумевать, что системные тики 32-разрядные). Другими словами задержка составит только около 7 недель, если длительность тика FreeRTOS определена в 1 миллисекунду.
[Ссылки]
1. How long does portMAX_DELAY actually wait in FreeRTOS? site:techoverflow.net. |