FreeRTOS中断配置
STM23优先级使用4位,优先级分组(0 1 2 3 4),在FreeRTOS使用中,STM32使用优先级分组4,都是抢占优先级,优先级数为16个,最低优先级为15
configMAX_SYSCALL_INTERRUPT_PRIORITY // 此宏用来设置在中断服务程序安全调用FreeRTOS API函数的最高中断优先级
configKERNEL_INTERRUPT_PRIORITY //此宏用于设置RTOS内核中断优先级
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY //此宏用于定义FreeRTOS系统可管理的最高中断优先级(中断优先级阈值)
configLIBRARY_LOWEST_INTERRUPT_PRIORITY //此宏用于定义中断最低优先级
configMAX_SYSCALL_INTERRUPT_PRIORITY 低于此优先级的中断可以安全的调用FreeRTOS FromISR的API函数,高于此优先级的中断是FreeRTOS不能禁止的,中断服务函数也不能调用FreeRTOS FromISR的API 函数
SysTick和PendSV 配置为最低优先级
BASEPRI寄存器
该寄存器可屏蔽优先级低于某一阈值的中断,即将宏configMAX_SYSCALL_INTERRUPT_PRIORITY 写入寄存器BASEPRI
FreeRTOS控制可屏蔽的中断优先级时,就是控制BASEPRI寄存器,向寄存器BASEPRI写0,会停止屏蔽中断,
屏蔽优先级不高于0x60(由0x06左移4位得到,即优先级数为6)的中断,使用汇编编程:
MOV R0 , #0X60
MSR BASEPRI , R0
优先级位数分析
CM3中使用了8位寄存器来表达中断优先级,8位寄存器有效位数由芯片设计决定,但允许最少是3位有效位控制,即优先级最少也要有8位,优先级数值越小,则优先级越高
操作8位寄存器来控制优先级,控制高位(即MSB对齐 最高有效位对齐),为什么要以MSB对齐,而不是LSB对齐,先看一下4个bit表达优先级和3个bit表达优先级的区别。
MSB对齐移植
MSB对齐移植,程序由4位优先级位的MCU移植至3位优先级位的MCU时,情况如图:
可以看到此时优先级有效数减少,但并不改变其优先级的逻辑顺序
LSB对齐移植
LSB对齐方式,程序由4位优先级位的MCU移植至3位优先级位的MCU时,情况如图:
造成了优先级翻转的情况,低优先级反而变高了