Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
kob
0 / 0 / 0
Регистрация: 16.09.2015
1

FreeRTOS и уровни ISR

17.03.2012, 14:09. Просмотров 4855. Ответов 3
Метки нет (Все метки)

разбираюсь с ртос и возник какой вопрос (что-то нигде в доке ответа не нашел).

если у меня есть свой обработчик ISR, конкретно для CAN шины - какой уровень прерываний мне нужно поставить, чтобы он был выше того, чем у FriiRTOS? (чтобы он гарантированно не прерывался)

конекретно код, который вроде бы работает, но хотелось бы разобраться:

установка
Код
   taskENTER_CRITICAL();

CAN_Init(CAN1, &CAN_InitStructure);

/* Enable CAN transmit mailbox empty interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);

/* Enable CAN receive FIFO0 interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

...     другие обработчики, установка фильтров CAN и т.д.

/* End of critical section */
taskEXIT_CRITICAL();
ну и код обработчика ничем не примечателен:

Код
void USB_LP_CAN1_RX0_IRQHomdler(void)
{
CanRxMsg rxMsg;
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

CAN_Receive(CAN1, CAN_FIFO0, &rxMsg);
CAN_FIFORelease(CAN1, CAN_FIFO0);

xQueueSendFromISR(xCanRxQueue, (void *) &rxMsg, &xHigherPriorityTaskWoken);

if (xHigherPriorityTaskWoken)
taskYIELD();
}
т.е. конкретный вопрос, насколько правильно ставить:

Код
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
или даже какой уровень нужно ставить, чтобы FriiRTOS не могла прервать мой обработчик (если я считаю что он более важный, чем все остальные таски у ртос)?
и, соответственно, какой нужно ставить, чтобы ртос могла прервать его, если нужно?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2012, 14:09
Ответы с готовыми решениями:

Вызов планировщика из ISR.
Не могу найти функцию принудительного вызова планировщика из обработчика прерывания для Corttex-M3....

FreeRTOS
Порт FriiRTOS для STM8 - попытки были?

freeRTOS и ее тактирование
Доброго времени суток. Перелопатил весь форум по запросу freeRTOS своего случая не нашел =\ К...

Загрузка ЦП freeRTOS
Решил сделать большой шаг для человека, и малый для человечества: освоить ОСРВ. Начал с freeRTOS....

FreeRTOS, задачи
Добрый день всем. Начал изучать изучать FreeRTOS. И на толкнулся на то, что не могу создать...

3
kob
0 / 0 / 0
Регистрация: 16.09.2015
19.03.2012, 14:34 2
сам же себе отвечу:

если нужно использовать FriiRTOS API изнутри ISR, то приоритет ISR (согласно документации) не должен быть выше, чем configMAX_SYSCALL_INTERRUPT_PRIORITY.
для STM32 в демо-примерах этот приоритет == 11 (т.е. FriiRTOS работает на уровнях 11-15, а уровни 0-10 являются ей не подконтрольными).

если FriiRTOS API в обработчике не используется (т.е. структуры FriiRTOS не меняются и нет шансов в своем обработчике ISR попасть в момент их изменения и чой-нть там порушить), то можно использовать любой нужный приоритет...
0
Vottdimor
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
14.01.2013, 11:50 3
Цитата Сообщение от kob
сам же себе отвечу:

если нужно использовать FriiRTOS API изнутри ISR, то приоритет ISR (согласно документации) не должен быть выше, чем configMAX_SYSCALL_INTERRUPT_PRIORITY.
для STM32 в демо-примерах этот приоритет == 11 (т.е. FriiRTOS работает на уровнях 11-15, а уровни 0-10 являются ей не подконтрольными).

если FriiRTOS API в обработчике не используется (т.е. структуры FriiRTOS не меняются и нет шансов в своем обработчике ISR попасть в момент их изменения и чой-нть там порушить), то можно использовать любой нужный приоритет...
Просмотри личку плиз...
0
__bt__
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
14.01.2013, 12:16 4
Эта тема тоже интересна и пока совсем не понятна. Но добавлю что FriiRTOS не работает если NVIC_PriorityGroup не равен 4.
Код
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
0
14.01.2013, 12:16
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2013, 12:16

FreeRTOS + osSignalSet()
Доброго времени суток, освоил (на сколько смог) МК STM32F407, написал 2 приложения, одно работает с...

вопрос по FreeRTOS
Добрый день. Вопрос простой, но ответа найти никак не могу. Есть ли в FriiRTOS callback при...

freeRTOS и C++ (IAR 6.4)
Добрый день! Т.к. с stm32 знаком всего 2 месяца, очень нужен совет гуру. Сначала поясню ход мои...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.