标题: uCOS临界处理_开启中断,关闭中断 恢复中断最初状态 [打印本页]

作者: 51黑黑黑    时间: 2016-2-24 00:29
标题: uCOS临界处理_开启中断,关闭中断 恢复中断最初状态
解释一下:?
   有两个任务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到开始状态

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

程序=数据结构 + 算法
    一说数据结构,往往想到的是struct结构体。其实有点偏颇,全局变量是数据结构,局部变量也是数据结构。还记得,用static静态变量,来完成按键扫描程序吗?愣是没有用检测按键弹起的代码,就把按键扫描函数实现了。高,实在是高!!!









欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1