解释一下:?
有两个任务1和2(任务1优先级<任务2优先级),使用了同一个一个全局变量。(有点废话了,全局变量当然是公用的)?
中断来了!中断打断了任务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到开始状态
看看,多巧妙,通过一个局部变量,实现了这个保护临界代码的功能
程序=数据结构 + 算法
|