【转载】UCOS临界代码问题以及解决办法

先上图
1

①:有两个任务1和2(任务1优先级<任务2优先级),两个任务用到了同一个全局变量nGlobalVar,然后中断来了!中断打断了任务1,中断退出之后,一定退回到任务1继续往下执行吗?
解答:答案是否定的!!答案是否定的!!因为在中断退出前,实现了任务切换,更高优先级的,就绪的任 务被执行!!所以说中断退出后,程序可能跳转到任务2!!

②:如果任务2中修改了nGlobalVar变量,那在执行任务1的时候,任务就不会走向刚才的分支结构了。程序就可能出问题!!
解答:方法如图,在执行分支结构之前,禁止中断;在执行完分支结构,才开启中断。
2
好了,那么问题又来了:看图,类似临界代码嵌套吧
3
假设在关闭中断的程序里面调用了subFun()函数,而子函数同样也有关闭中断,开启中断的处理。那么很有可能在临界区并没有执行完成的条件下,中断被打开了。临界区的一部分被截掉了!!!!
解决方法:

在上文的主程序中声明一个cpu_sr变量,在subFun函数中也声明一个cpu_sr变量

主程序中:
cpu_sr = ARMCoreDisableIntExt();//cpu_sr开始是开启中断的状态
……
//subFun函数
{
cpu_sr = ARMCoreDisableIntExt();//cpu_sr此时是关闭中断的状态
……
ARMCoreRestoreIntStatus(cpu_sr );//恢复cpu到关闭中断的状态
}
……
ARMCoreRestoreIntStatus(cpu_sr );//恢复cpu到开始状态

看看,多巧妙,通过一个局部变量,实现了这个保护临界代码的功能。

/****************
文章为转载
uCOS临界处理_开启中断,关闭中断 恢复中断最初状态
(出处: 单片机论坛)
******************/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值