基于STM32应用的FreeRTOS中断设置

一、freertos中断设置介绍
freertosconfig.h中定义了两个宏,分别是:
configkernel_interrupt_priority
configmax_syscall_interrupt_priority
​configkernel_interrupt_priority用来设置rtos内核自己的中断优先级。因为rtos内核中断不允许抢占用户使用的中断,因此这个宏一般定义为硬件最低优先级。
configmax_syscall_interrupt_priority用来设置可以在中断服务程序中安全调用freertos api函数的最高中断优先级。优先级小于等于这个宏所代表的优先级时,程序可以在中断服务程序中安全的调用freertos api函数;如果优先级大于这个宏所代表的优先级,表示freertos无法禁止这个中断,在这个中断服务程序中绝不可以调用任何api函数。
也就是说​rtos中断嵌套方案将可用的中断优先级分成2组:会被rtos临界区覆盖的和永远不会被覆盖的所以这些是一直被使能的。configmax_syscall_interrupt_priority设置值是这两组的边界值。
二、stm32中的优先级设置
​传统的是中断优先级数值越大代表的优先级级别越高,而cortex-m中断优先级数值越大代表的优先级反而越小。例如,一个被分配为数值2的中断优先级大于一个被分配为数值5的中断优先级。换句话说,优先级2大于优先级5,即使2小于5。更助于理解清晰的表述是:优先级2的中断可以打断优先级为5的中断;但优先级为5的中断不能打断2的。所以,在stm32中任何使用rtos api 的中断服务程序都必须在数值上等于或大于configmax_syscall_interrupt_priority的设置值。这确保了中断的逻辑优先级等于或小于configmax_syscall_interrupt_priority设置。
​ freertosconifg.h 文件中的configmax_syscall_interrupt_priority 和configkernel_interrupt_priority需要设置数值因为arm cortex-m核本身需要他们—已经被转移到寄存器最高有效位了。这就是为什么在freertos的例程的freertosconfig.h文件configkernel_interrupt_priority应该被设置为最低优先级别255(对应优先级为15)。数值被这样规定有一下几个原因:rtos内核直接访问(不通过任何第三方库函数)arm cortex-m3外设硬件,rtos 内核比大多数库函数实现早,并且这种方式已经在第一代市场上出现的arm cortex-m3库文件中。rtos内核使用arm cortex-m核的basepri寄存器实现临界区。这使rtos内核屏蔽一部分中断所以提供了一个可变的中断嵌套模型。basepri是一个bit屏蔽罩,设置basepri一个数值将屏蔽所有逻辑上低于该数值优先级的中断,所以用该寄存器不可能屏蔽优先级为0的中断。
在stm32使用中由于中断优先级的设置采用的是库函数,因此要请保证所有的优先级设置为可抢占优先级,具体实现方式是在rtos启动前调用函数:nvic_prioritygroupconfig( nvic_prioritygroup_4 );​
cortex-m内核的中断优先级寄存器是以最高位(msb)对齐的。​stm32使用了优先级寄存器中的4位,则这3个位位于中断优先级寄存器的bit 4、bit5、bit6、bit7位。剩余的bit0~bit3可以设置成任何值,但为了兼容,最好将他们设置成1.下图展示了优先级数值11(二进制1011 1111)是怎样存储在优先级寄存器中的。下图也展示了为什么数值11可看成数值191。
如上图所示,在stm32中使用freertos时,系统默认:
//this is the raw value as per the cortex-m3 nvic. values can be 255
(lowest) to 0 (1?) (highest).
#define configkernel_interrupt_priority 255(0xff也即是优先级15)​
//!!!! configmax_syscall_interrupt_priority must not be set to zero !!!!
see
#define configmax_syscall_interrupt_priority 191 (0xbf也即优先级11)
故在中断优先级为0~10的中断,均不会被内核延迟,并且可嵌套但不能调用api函数。在11~15之间的中断可以调用以​fromisr结尾的api函数。
stm32单片机中文官网
意法半导体/st/stm

iphone8什么时候上市?iphone8最新消息:赶紧跟三大谣言说再见吧!这才是iPhone的正确使用姿势!
可穿戴智能设备有哪些上市公司
友悦宝机器人在早教机器人产品中独具一格
高德地图在新版本中上线全新路况——“极速绿”,更精准
真无线蓝牙耳机的品牌选择,高性价比的耳机推荐
基于STM32应用的FreeRTOS中断设置
中芯国际或与嘉楠科技合作14nm矿机芯片
ORE上溢错误是什么意思呢?
SWCF2022 12月13日演讲预告:卫星相控阵列天线原型设计实践
智能家居又出新科技智能魔镜!
FAKRA连接线的作用有哪些?
以太网和SMBus在单一平台上提供数据和电源管理
三星Galaxy A系列和S系列之间的区别
STM32系列成员介绍
vivoX27怎么样 值不值得买
如何利用STM32代码进行读保护功能
LFP电池在乘用车领域的装机占比进一步提升
汽车动力技术未来二十年发展趋势
跨时钟域电路设计:单位宽信号如何跨时钟域
IP5389移动电源管理芯片方案,支持充放电应用