Как переключаться на другую задачу после прерывания?
есть фоновая задача, мигает лампочкой. есть более приоритетная задача для работы с UART. Задача для уарта ждет появления байта в очереди
Код
void taskRS232(void *pvParameters)
{
alt_u8 byte;
for(;;)
{
xQueueReceive(uart232Queue, &byte, portMAX_DELAY);
handler232();
}
vTaskDelete( NULL );
}
посылаю в устройство байт. попадаю в прерывание по приему. в конце прерывания проверяю нет ли более приоритетной задачи чем прерванная и если есть то переключаю контекст
Код
void UartPC::uartInt(void *context)//прерывание по RS-232 от bawdc
{
static alt_u8 byte;
static portBASE_TYPE xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;
alt_u16 status = IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);
if(status & ALTERA_AVALON_UART_STATUS_RRDY_MSK)
{//прерывание по приему
byte = IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);
xQueueSendFromISR(uart232Queue, &byte, &xHigherPriorityTaskWoken);
}
if(xHigherPriorityTaskWoken == pdTRUE)
taskYIELD();
}
задача ожидавшая появление в очереди uart232Queue байта разблокируется и начинает работать. После обработки ожидает следующий байт в очереди. Почему то попав в ожидание xQueueReceive(uart232Queue, &byte, portMAX_DELAY) после taskYIELD() управление задаче по миганию лампочки не передается. выполняется пустая задача. мигание лампочки в состоянии блокировки.
Убрал из обработчика прерывания переключение контекста taskYIELD();. Всё заработало, но медленно. видно что после прерывания задача уарта не сразу получает управление, наверно по тикам. Дальше стал ковырять исходники и нашел vTaskSwitchContext(). Вставил в конце обработчика прерывания vTaskSwitchContext() вместо taskYIELD() - всё заработало как надо. переключение происходит сразу по выходу из обработчика-прерывания.
Что за функция vTaskSwitchContext()? Как правильно ею пользоваться? Почему taskYIELD() блокирует прерванную задачу?
Как правильно сделать так, чтоб при выходе из обработчика прерывания управление передавалось не прерванной задаче, а задаче готовой к выполнению с самым большим приоритетом?