IRQ + FreeRTOS.md 3.3 KB

  • В микроконтроллерах ARM возможное число приоритетов прерываний может быть различным. В stm32 оно равное 16, определяется количеством доступных бит приоритетов константой:

    #define __NVIC_PRIO_BITS          4
    
  • Чем больше число - тем меньше приоритет. Прерывание с приоритетом "0" обладает самым высоким приоритетом.

  • Схема вложенности прерываний FreeRTOS делит все доступные приоритеты на 2 группы – те, которые будут маскироваться критическими секциями RTOS, и те, которые не маскируются критическими секциями, и поэтому всегда разрешены.

    #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY          5
    
  • Т.о. прерывания с самым высоким приоритетом от 0 до 4 включительно разрешены всегда. Внтури этих прерываний запрещено вызывать API FreeRTOS. Прерывания с приоритетами 5-15 маскируются критическими секциями. Внутри этих прерываний возможен вызов специальных функций FreeRTOS "...fromISR".

  • 8-битный регистр приоритетов делится на 2 части: приоритет вытеснения (preempt priority) и субприоритет (subpriority). Количество бит, назначенное на каждую часть, программируется. Приоритет вытеснения определяет, может ли прерывание прервать (вытеснить) уже выполняющееся прерывание. Subpriority определяет, какое прерывание будет выполняться первым, когда два происходят одновременно два прерывания с одинаковым приоритетом вытеснения.

  • Как это относится к FreeRTOS. Рекомендуется назначить все биты приоритета для бит приоритета вытеснения, не оставляя никаких бит приоритета на subpriority. Любые другие конфигурации усложняют прямую взаимосвязь между установкой configMAX_SYSCALL_INTERRUPT_PRIORITY и приоритетом, назначенным отдельным прерываниям периферийных устройств.

  • Большинство систем по умолчанию следует желаемой конфигурации, за исключением библиотеки драйверов STM32. Если Вы используете STM32 вместе с STM32 driver library, то убедитесь, что все биты приоритета назначены на биты preempt priority, путем вызова функции перед запуском RTOS:

    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );