|
发表于 2020-6-7 19:44:30
|
显示全部楼层
参考《安富莱_STM32-V6开发板_FreeRTOS教程(V1.0)》
#define configMAX_PRIORITIES ( 6 )
定义可供用户使用的最大优先级数,如果这个定义的是 6,那么用户可以使用的优先级号是 0,1,2,3,4,5
不包含 6,对于这一点,初学者要特别的注意
configMAX_SYSCALL_INTERRUPT_PRIORITY
宏定义 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 的数值经过 4bit 偏移后得到一
个 8bit 的优先级数值,即宏定义 configMAX_SYSCALL_INTERRUPT_PRIORITY 的数值。 这个数值
是赋值给寄存器 basepri 使用的,8bit 的数值才可以实际赋值给相应中断的优先级寄存器。
这里的宏定义数值赋给寄存器 basepri 后就可以实现全局的开关中断操作了。 比如:我们这里配
置宏定义 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 是 0x01,经过 4bit 偏移后就是 0x10,
即 16。 调用了 FreeRTOS 的关中断后,所有优先级数值大于等于 16 的中断都会被关闭。优先级数值
小于 16 的中断不会被关闭,对寄存器 basepri 寄存器赋值 0,那么被关闭的中断会被打开。
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 0x01
定义受 FreeRTOS 管理的最高优先级中断。简单的说就是允许用户在这个中断服务程序里面调用
FreeRTOS 的 API 的最高优先级。为了进一步说明这个宏定义的的作用,解释如下:
使用 CM 内核的 MCU,官方强烈建议将 NVIC 的优先级分组配置为全抢占式优先级,全部配置
为抢占式优先级的好处就是方便管理。
对于 STM32 来说,设置 NVIC 的优先级分组为 4 时,
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4)就是全部配置为抢占式优先级。 又因为
STM32 的优先级设置仅使用 CM 内核 8bit 中的高 4bit,即只能区分 2^4 = 16 种优先级。因此
当优先级分组设置为 4 的时候可供用户选择抢占式优先级为 0 到 15,共 16 个优先级,配置为 0
表示最高优先级,配置为 15 表示最低优先级,不存在子优先级。
这里配置 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 为 0x01 表示用户可以在抢
占式优先级为 1 到 15 的中断里面调用 FreeRTOS 的 API 函数,抢占式优先级为 0 的中断里面是
不允许调用的。 |
|