FreeRTOS中使用中断的一些注意事项

1.几个宏定义的解释

  • [configLIBRARY_LOWEST_INTERRUPT_PRIORITY]
    这个宏是可以定义的中断最低优先级,由于STM32中断管理只用了4位来分配抢占优先级和子优先级,并且FreeRTOS使用优先级分组4(没有子优先级),所以该宏设为15

  • configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
    这个宏是系统可管理的最高中断优先级,即为一个阈值,低于该值的可以调用一些fromISR的函数以及能够通过函数portDISABLE_INTERRUPTS()和portENABLE_INTERRUPTS()进行关闭和打开中断操作。高于该优先级的中断则不响应打开和关断中断(一直都可以进行中断操作)。

  • configKERNEL_INTERRUPT_PRIORITY
    这个宏定义是( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ),实质上就是把15左移4位当作真正的优先级。(因为第四位保留了)

  • configMAX_SYSCALL_INTERRUPT_PRIORITY
    相当于( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ),原因与configKERNEL_INTERRUPT_PRIORITY相同。
    2.关闭与打开中断函数

  • 关闭:portDISABLE_INTERRUPTS()
    这个函数实际上就是vPortRaiseBASEPRI(),不管是打开还是关闭中断,底层操作的都是basepri寄存器。注意: 关闭中断只能关闭优先级低于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY的中断事件。

  • 打开:portENABLE_INTERRUPTS()
    相当于vPortSetBASEPRI( 0 ),同样是操作basepri寄存器。
    3.一些注意事项

  • 一些fromISR函数不能用在高于阈值的中断函数中。

  • portDISABLE_INTERRUPTS()不能关闭高于阈值的中断函数。

  • 系统延时,会进行任务调度,任务调度可能会打开关闭的中断。

  • Free RTOS尽量少用中断。

你可能感兴趣的:(FreeRTOS)