Jump to content

    

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Ясно. Всем спасибо за ответы.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this