реклама на сайте
подробности

 
 
> Переключение задачи по прерыванию.
juvf
сообщение Dec 1 2011, 08:51
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Как переключаться на другую задачу после прерывания?

есть фоновая задача, мигает лампочкой. есть более приоритетная задача для работы с 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() блокирует прерванную задачу?

Как правильно сделать так, чтоб при выходе из обработчика прерывания управление передавалось не прерванной задаче, а задаче готовой к выполнению с самым большим приоритетом?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.05661 секунд с 7
ELECTRONIX ©2004-2016