学习freertos第二篇——中断

今天是2024.10.3,今天学习了freertos中的中断,个人感觉要实现freertos中 的功能并不难,只是需要搞清楚几个注意的点而已(写在下面了)。跟着正点原子的视频做了一个实验,两个定时器中断,一个在freertos的优先级管理内,另一个不在。实验现象就是:在关闭中断时,freertos是无法关闭不在管理优先级范围内的哪个而中断的。

一.freertos中的优先级

freertos中的中的中断优先级分组初始化都应该分到组4,为什么要设置为中断组4呢,我的个人理解是这样的:对于freertos来说,他能管理的中断优先级是在5-15之间的,就是一个简单的单一的一个5-15的数字的要素来决定他的优先级,而中断是有抢占和响应优先级分别的,所以为了统一让freertos能够管理,直接让中断优先级分组为4,响应优先级就都是0,只看抢占优先级。

二.中断屏蔽寄存器(屏蔽某些中断)

PRIMASK

primask是一个只有一个位的寄存器:

置1:关掉所有可屏蔽的异常,只有nmi和硬fault可以响应

置0:没有关闭中断

FAULTMASK

primask是一个只有一个位的寄存器:

置1:关掉所有可屏蔽的异常,只有nmi可以响应

置0:没有关闭中断

BASEPRI (freertos用到的)

basepri最多有9位(由表达优先级的位数觉得):定义了屏蔽优先级的阈值。

设置为非0(阈值)之后,优先级大于等于阈值的都会被关闭(数值大于等于,即优先级小于等于)。

设置为0之后,不会关闭任何中断

三.freeertos开关中断

freertos使用到的是basepri,所以关于开关中断都是配置到这个寄存器。

#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()
#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0)

static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{
__asm
{
msr basepri, ulBASEPRI
}
}
/*-----------------------------------------------------------*/
static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;
__asm
{
msr basepri, ulNewBASEPRI
dsb
isb
}
}

关中断函数中

configMAX_SYSCALL_INTERRUPT_PRIORITY这个宏的值就是5,意思是将basepri的阈值设置为5,也就是说中断优先级小于等于5的都会被禁止(5-15,相当于中断全都被禁止了)

开中断函数中

设置为0,不关闭所有中断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值