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

 
 
> Вопросик по приоритетам прерываний, порт под Cortex-M3
Nikitoc
сообщение Apr 4 2012, 13:50
Сообщение #1


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Уважаемые коллеги.
Я запутался в некоторых особенностях порта FreeRTOS под Cortex-M3. А именно: в файле freertosconfig.h есть следующие мароопределения:
Код
/* 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
  #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. */

Насколько я понимаю, configKERNEL_INTERRUPT_PRIORITY соответствует наименьшему приоритету NVIC - 15-му. А configMAX_SYSCALL_INTERRUPT_PRIORITY - 11-му.
Никак не могу разобраться как и где эти константы используются. Где именно происходит назначение приоритета этими константами.
И еще в доках сказано, что нельзя использовать ф-ции FreeRTOS в прерываниях с приоритетом большим чем configMAX_SYSCALL_INTERRUPT_PRIORITY (т.е. как я понял с приоритетами 0-10 в данном случае). Объясните, пожалуйста, почему?
Просьба сильно не пинаться, я недавно работаю с данной ОС.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
sysel
сообщение Apr 5 2012, 10:58
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 3-07-07
Пользователь №: 28 852



Про использование констант приоритетов:
Смотрите исходники порта. Для Cortex-M3 эти константы должны записываться в регистр ядра BASEPRI.

Будет что-то типа (на Си):
Код
__set_BASEPRI(configMAX_SYSCALL_INTERRUPT_PRIORITY)


или же конструкция типа (на Асме)
Код
LDR r0,#configMAX_SYSCALL_INTERRUPT_PRIORITY
MSR BASEPRI, r0


Прерывания с приоритетом выше чем "configMAX_SYSCALL_INTERRUPT_PRIORITY" нельзя использовать, потому что для своей корректной работы ядро FreeRTOS и Ваш код (если пожелаете) входит в "критические секции". Во время нахождения в критической секции блокируются структуры ядра на запись только из "критической секции". Для того, чтобы внезапно возникщее прерывание не испортило работу ядра ОС.
Фактически вход в критическую секцию - запрет всех прерываний с приоритетом <= configMAX_SYSCALL_INTERRUPT_PRIORITY, а выход из КС - разрешение прерываний.
Если Ваш обработчик прерывания использует вызовы FreeRTOS-овских функций - приоритет должен быть ниже или равен configMAX_SYSCALL_INTERRUPT_PRIORITY.

Если же Вы не задействуете FreeRTOS-овские функции в обработчике прерывания (например, реализуете какой-то свой механизм синхронизации потоков с прерываниями) - можете делать приоритет выше чем configMAX_SYSCALL_INTERRUPT_PRIORITY. В этом случае FreeRTOS никогда не запретит Вашему обработчику вызов.
Go to the top of the page
 
+Quote Post
diwil
сообщение Apr 5 2012, 13:14
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



здесь - http://electronix.ru/forum/index.php?showtopic=96139 было
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Apr 5 2012, 20:12
Сообщение #4


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Ясно. Всем спасибо за ответы.
Go to the top of the page
 
+Quote Post

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

 


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


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