Перейти к содержанию
    

Вопросик по приоритетам прерываний

Уважаемые коллеги.

Я запутался в некоторых особенностях порта 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 в данном случае). Объясните, пожалуйста, почему?

Просьба сильно не пинаться, я недавно работаю с данной ОС.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про использование констант приоритетов:

Смотрите исходники порта. Для 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 никогда не запретит Вашему обработчику вызов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...