FreeRTOS临界区无效问题

一、问题描述:

定时器3的中断优先级设置为6(0-15级),将 configMAX_SYSCALL_INTERRUPT_PRIORITY 的值设置为5。程序预计实现的功能为当进入临界区时,屏蔽定时器3中断,退出临界区时恢复定时器3中断。但是实际验证过程中发现进入临界区后,定时器3中断仍能够正常执行,未能实现预期的功能。

二、问题原因:

在FreeRTOS中,是通过寄存器 basepri 来屏蔽中断的,basepri 的作用是关闭优先级低于或等于某个阈值的中断,优先级高于这个阈值的中断将不会被关闭。由FreeRTOS进入临界区的源码的可知,configMAX_SYSCALL_INTERRUPT_PRIORITY 的值为0x05时,basepri 寄存器的值为0x05,定时器3的优先级低于0x05,进入临界区后应该屏蔽才对啊,是什么原因导致未能屏蔽呢?查看M3权威指南后发现 basepri 寄存器最大可以使用9位,而在STM32中使用FreeRTOS时,使用的中断优先级分组为组4,也就是说16级抢占优先级,没有响应优先级,即高四位为有效位。当 basepri 的值为0x05时,即高四位为0,实际上相当于0x00,此时basepri是无效的,因此无法屏蔽定时器3中断。应该将 configMAX_SYSCALL_INTERRUPT_PRIORITY 的值设置为0x5F才能正常屏蔽定时器3中断。还需要注意的是,basepri 寄存器对应的是抢占优先级,与响应优先级无关,例如定时器3抢占优先级为2,响应优先级为2,此时若想屏蔽定时器3中断,应该将 configMAX_SYSCALL_INTERRUPT_PRIORITY 的值设置为0x2F。

static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

	__asm
	{
		/* Set BASEPRI to the max syscall priority to effect a critical
		section. */
		msr basepri, ulNewBASEPRI
		dsb
		isb
	}
}
//FreeRTOS进入临界区源码

 

三、M3中另外两个屏蔽中断的寄存器(截图来源:正点原子的《STM32F1 FreeRTOS开发手册》)

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值