101.2 - FreeRTOS | 1.FreeRTOS中断配置和Cortex-M中断
测试平台:STM32F1/4
编译环境:KEIL5
1.1中断屏蔽寄存器
PRIMASK(1bit)
把当前优先级设置为0,除了NMI,HardFault都屏蔽。
FAULTMASK(1bit)
把当前优先级设置为-1,NMI异常和Rest异常
BASEPRI(最多9bit)
把当前优先级设置为x,屏蔽优先级低于x的异常。
举个例子:BASEPRI = 10,优先级编号高于10的,都不会被响应。
(优先级数字越小,优先级越高)
2.FreeRTOS中断配置宏
2.1configPRIO_BITS
定义了用于配置Cortex-M,8位优先级寄存器实际使用位数。
(有IC厂商确定使用前几位,还可进一步划分抢占优先级和子优先级)
举个例子:
#define configPRIO_BITS 4 //使用了高4位,可配置优先级范围为 0 ~ 15
2.2 configLIBRARY_LOWEST_INTERRUPT_PRIORITY
配置FreeRTOS最低优先级,SysTick和PendSV默认在此优先级
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0x0f //NVIC分组为4,全为抢占优先级,0x0f == 15,为最低
2.3 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
高于这个优先级的中断,不归FreeRTOS管理
2.4 configKERNEL_INTERRUPT_PRIORITY
#define configKERNEL_INTERRUPT_PRIORITY (configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) //得到实际传递至 中断的优先级寄存器 的值 #define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) //以0xE000_ED20为开始,移动16位,2Byte至0xE000_ED22 //0xE000_ED22 为PendSV中断优先级管理地址 #define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) //以0xE000_ED20为开始,移动24位,3Byte至0xE000_ED23 //0xE000_ED23 为SysTick中断优先级管理地址
2.5 configMAX_SYSCALL_INTERRUPT_PRIORITY
#define configMAX_SYSCALL_INTERRUPT_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) //得到实际传递至 basepri寄存器 的值
3.总结
1.configPRIO_BITS 会被定义为:__NVIC_PRIO_BITS,
这个值在CMSIS中有定义,用来对后续中断 ( Pend_SV 和 SYSTICK )进行配置。
2.configLIBRARY_LOWEST_INTERRUPT_PRIORITY,用来配置当前中断条件下的最低优先级
configKERNEL_INTERRUPT_PRIORITY,实际传递给相关寄存器的值
3.configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,规定了FreeRTOS调度的最高中断优先级。
configMAX_SYSCALL_INTERRUPT_PRIORITY,实际传递给相关寄存器的值
参考资料:
-
FreeRTOS Kernel V10.0.1
-
安富莱FreeRTOS教程
-

浙公网安备 33010602011771号