FreeRTOS中断和优先级MSB对齐

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时,情况如图:


在这里插入图片描述
造成了优先级翻转的情况,低优先级反而变高了

文章参考链接,部分内容转载

猜你喜欢

转载自blog.csdn.net/weixin_44333597/article/details/107605661