临界段代码保护

本文介绍了在STM32系统中如何管理和保护临界段代码,确保在执行过程中不受中断影响。通过操作中断等级和BASEPRI寄存器来开关中断,实现对全局变量操作的安全性。内容包括:关中断、开中断的两种情况,以及进入和退出临界段的详细过程,强调了带中断保护的版本可支持嵌套。最后讨论了临界段在中断应用中的注意事项,如中断状态值的恢复和非中断场合的进出平衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

1:临界段:在执行的时候不能被中断的代码段,最常见的是对全局变量的操作,能关闭的最大中断 由这个宏决定configMAX_SYSCALL_INTERRUPT_PRIORITY 他是按照单片机的中断等级的,比他小的都不能控制,因为操作的是单片机中的寄存器
2:在FreeRTOS中,对中断的开关是通过操作BASEPRI寄存器来实现的。当他设置为5时,所有优先级号>=5的中断都被关闭(等级比他低的都关掉)。若设置为0,则不关闭任何中断

1:关中断

不能在中断里面使用的

/*1:不带返回值的关中断函数,不能嵌套,不能在中断里面使用
  2:不带返回值的意思是:在往BASEPRI写入新的值的时候,不用先将BASEPRI的值保存起来,即不用管当前的中断状态是怎么样的,既然不用管     当前的状态,不会保留当前的状态,也就意味着这样的函数不能在中断里面调用
  3:这是最底层的,使用于,进入与退出临界段中
*/
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	191   /* 高四位有效,即等于0xb0,或者是11 ,FreeRTOS能管理的最大中断值*/

#define portDISABLE_INTERRUPTS()				vPortRaiseBASEPRI()

static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
   
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;//要写入BASEPRI的值。优先级>=11的中断都会被屏蔽(优先级比11低的中断),11以内的中断不受FreeRTOS管理

	__asm
	{
   
		/* Set BASEPRI to the max syscall priority to effect a critical
		section. */
		msr basepri, ulNewBASEPRI   //将configMAX_SYSCALL_INTERRUPT_PRIORITY的值写入BASEPRI,关掉部分中断(设置为0就不关任何中断)
		dsb
		isb
	}
}

能在中断里面使用,带返回值的关中断,可以嵌套

 #define portSET_INTERRUPT_MASK_FROM_ISR()		ulPortRaiseBASEPRI()
 
//带返回值的关中断,可以嵌套,可以在中断里面使用
static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void )
{
   
uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;    

	__asm
	{
   
		/* Set BASEPRI to the max syscall priority to effect a critical
		section. */
		mrs ulReturn,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值