Порт FreeRTOS для stm32 IAR. Обнаружил зависание одной самой приоритетной задачи. Статус READY, но на неё переключения нет.
Оставил одну задачу в проекте с приоритетом 3. запускаю в дебаге.... задача в блокированном состоянии, ждет байт в очереди.
в прерывании выдаю посылаю байт в очередь.
Код
void USART1_IRQHandler(void)
{
static uint8_t byte;
static portBASE_TYPE xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;
if(USART1_SR_bit.RXNE == 1)
{ //прерывание по приему
byte = USART1_DR; //флаг прерывания сбрасывается при чтении регистра USART1_DR
xQueueSendToBackFromISR(uart485Queue, &byte, &xHigherPriorityTaskWoken);
}
//portEND_SWITCHING_ISR(xHigherPriorityTaskWoken == pdTRUE );
}
До первого входа в прерывание задача в блокированном состоянии. После выдачи байта в очередь xQueueSendToBackFromISR(uart485Queue...) задача сразу переходит в состояние READY. Если в конце прерывания вызвать принудительное переключение контекста, то переключение происходит. Если не вызывать, то теоретически, переключение контекста должно произойти во время системного тика, но переключения не происходит. Всегда крутится задача IDLE, а моя задача находится в состоянии готовности и не выполняется. Посмотрел исходник обработчика системного тика - там только переключение на задачи, которые задержаны функциями delay. А где вызов планировщика и проверка приоритетных задач на готовность? Где переключение контекста?