先上图
①:有两个任务1和2(任务1优先级<任务2优先级),两个任务用到了同一个全局变量nGlobalVar,然后中断来了!中断打断了任务1,中断退出之后,一定退回到任务1继续往下执行吗?
解答:答案是否定的!!答案是否定的!!因为在中断退出前,实现了任务切换,更高优先级的,就绪的任 务被执行!!所以说中断退出后,程序可能跳转到任务2!!
②:如果任务2中修改了nGlobalVar变量,那在执行任务1的时候,任务就不会走向刚才的分支结构了。程序就可能出问题!!
解答:方法如图,在执行分支结构之前,禁止中断;在执行完分支结构,才开启中断。
好了,那么问题又来了:看图,类似临界代码嵌套吧
假设在关闭中断的程序里面调用了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临界处理_开启中断,关闭中断 恢复中断最初状态
(出处: 单片机论坛)
********/