freertos中,并不提供挂接IRQHandler的API。
所以,如果需要注册ISR,仍然需要使用standaloneOS提供的API。例如GIC的API。
freertos提供的中断管理,只是用来屏蔽和打开中断,用来进行临界代码段保护。
freertos提供了几个宏拟函数,用来进行临界代码段保护。
#define taskENTER_CRITICAL()//mask all IRQ
#define taskEXIT_CRITICAL()// clear mask
#define taskENTER_CRITICAL_FROM_ISR()//return a ISRIdentifier
#define taskEXIT_CRITICAL_FROM_ISR(x) // use the ISRIdentifier
实质上,底层都是通过屏蔽中断或者打开中断来实现的。
#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()
#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0)
注意一个关键的宏,
configMAX_SYSCALL_INTERRUPT_PRIORITY,
低于这个值的中断,将被屏蔽,而高于这个值的中断则不会被屏蔽。
例如,在SDK中移植的freertos,设置的configMAX_SYSCALL_INTERRUPT_PRIORITY,是18,
而SYSTICK的优先级,设置的是30。
也就是说,最低优先级是30,最高APISAFE优先级是18。
那么,如果在GIC中connect了一个Callback,对应的IRQ,优先级设置为18或者19,那么在Callback中,是可以使用FromISR的API的。
但是如果在GIC中connect了一个IRQ,优先级设置为17或者16或更高,那么Callback中,就不可以使用FromISR的API。