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

 
 
> Переключение контекста
juvf
сообщение Dec 14 2013, 19:53
Сообщение #1


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

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



Порт 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. А где вызов планировщика и проверка приоритетных задач на готовность? Где переключение контекста?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Lagman
сообщение Dec 15 2013, 15:01
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Не увидел где очередь создается!

Приоритет вашего прерывания USART1_IRQHandler должен быть меньше configMAX_SYSCALL_INTERRUPT_PRIORITY, насколько я знаю в cortex m3 число должно быть больше. Какой приоритет (в ядре cortex m3) у прерывания USART1_IRQHandler ?
Вот на эту часть обратите внимание
Код
/* This is the raw value as per the Cortex-M3 NVIC.  Values can be 255
(lowest) to 0 (1?) (highest). */
#define configKERNEL_INTERRUPT_PRIORITY         255
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY     191 /* equivalent to 0xb0, or priority 11. */


/* This is the value being used as per the ST library which permits 16
priority values, 0 to 15.  This must correspond to the
configKERNEL_INTERRUPT_PRIORITY setting.  Here 15 corresponds to the lowest
NVIC value of 255. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY    15

http://microsin.net/programming/ARM/freertos-part3.html
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:35
Рейтинг@Mail.ru


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