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尽量少用中断。