- configKERNEL_INTERRUPT_PRIORITY
- configMAX_SYSCALL_INTERRUPT_PRIORITY
- *** 在Cortex-M内核的优先级数值越大 优先级反而越小***
-
不是所有的Cortex-M内核都有相同的优先级级别
Cortex-M构架自身最多允许256级可编程优先级
(优先级配置寄存器最多8位,所以优先级范围从0x00~0xFF)
但是绝大多数微控制器制造商只是使用其中的一部分优先级 - RTOS 的优先级可以分为两种:
1. 可以通过RTOS临界区屏蔽
2. 不受RTOS影响,永远处于使能状态
3. configMAX_SYSCALL_INTERRUPT_PRIORITY 用于配置两组中断优先级的边界,
应该根据微控器所使用的优先级配置 - 应用
以“FromISR”结尾的FreeRTOS函数是具有中断调用保护的(执行这些函数会进入临界区),
但是就算是这些函数,也不可以被逻辑优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断服务函数调用。
因此,任何使用RTOSAPI函数的中断服务例程的中断优先级数值大于等于configMAX_SYSCALL_INTERRUPT_PRIORITY宏的值。
这样就能保证中断的逻辑优先级等于或低于configMAX_SYSCALL_INTERRUPT_PRIORITY。
Cortex中断默认情况下有一个数值为0的优先级。大多数情况下0代表最高级优先级。因此,绝对不可以在优先级为0的中断服务例程中调用RTOSAPI函数。
Cortex-M内核的中断优先级寄存器是以最高位(MSB)对齐的。比如,如果使用了3位来表达优先级,则这3个位位于中断优先级寄存器的bit5、bit6、bit7位。剩余的bit0~bit4可以设置成任何值,但为了兼容,最好将他们设置成1.
configKERNEL_INTERRUPT_PRIORITY指定RTOS内核使用的中断优先级,一般设为最大值(最低优先级)
-
临界区
RTOS内核使用Cortex-M内核的BASEPRI寄存器来实现临界区(注:BASEPRI为优先级屏蔽寄存器,
优先级数值大于或等于该寄存器的中断都会被屏蔽,优先级数值越大,逻辑优先级越低,但是为零时不屏蔽任何中断)。
这允许RTOS内核可以只屏蔽一部分中断,因此可以提供一个灵活的中断嵌套模式。那些需要在中断调用时保护的API函数,FreeRTOS使用寄存器BASEPRI实现中断保护临界区。 当进入临界区时,将寄存器BASEPRI的值设置成configMAX_SYSCALL_INTERRUPT_PRIORITY,当退出临界区时,将寄存器BASEPRI的值设置成0。 很多Bug反馈都提到,当退出临界区时不应该将寄存器设置成0,应该恢复它之前的状态(之前的状态不一定是0)。 但是Cortex-M NVIC决不会允许一个低优先级中断抢占当前正在执行的高优先级中断,不管BASEPRI寄存器中是什么值。 与进入临界区前先保存BASEPRI的值,退出临界区再恢复的方法相比,退出临界区时将BASEPRI寄存器设置成0的方法可以获得更快的执行速度。 RTOS内核通过写configMAX_SYSCALL_INTERRUPT_PRIORITY的值到BASEPRI寄存器的方法创建临界区。 中断优先级0(具有最高的逻辑优先级)不能被BASEPRI寄存器屏蔽,因此, configMAX_SYSCALL_INTERRUPT_PRIORITY绝不可以设置成0
***2017.2.26***