ucos OS_ENTER_CRITICAL

来源:互联网 发布:linux tmp目录用途 编辑:程序博客网 时间:2024/03/29 00:26
 

 今天又看了一下ucos保护临界段代码,ucos是利用禁止中断来保护临界段的。

ucos给我们提供了三种方法:

一:直接关中断和直接开中断。即成对使用,保证临界段的安全。

二:先把原来的中断状态压入栈中,然后再关闭中断。恢复时直接从栈中返回原来存储的中断状态。

三:先保存原来的中断状态到一个变量中,然后再关闭中断。

 

三种情况我都说完了,下面我说一下为什么有这三种形态:

其实,这三种方法从应用上可分为两种,可嵌套和不可嵌套。

其实大家分析一下,所谓保护临界段代码就是关中断,在操作系统内部本身就是关中断、然后开中断。这是没有问题的,但大家想一下,操作系统给用户提供了一些编程接口,当用户希望用同样关中断的方法来保护共享数据时。比如用户写的代码如下:

关中断

调用系统服务

其他操作

开中断

大家想一下,本来用户想保存从用户关中断和开中断这些代码的,不过你调用了操作系统的服务,如果你是用的方法是不可嵌套的,那在退出操作系统代码时已经开中断了。违背了用户的愿望。所以我们操作系统提供可嵌套的关 开中断的方法。这种嵌套是针对高层应用程序的。在操作系统内部这个嵌套是没有任何意义的。

那有一点疑惑可能你会提出,那中断最好是支持嵌套了,是,这个没错。但大家想一想我们想嵌套,就必须保存原来的状态寄存器的值,而前提是机器要有支持读状态寄存器的指令。如果没有这样的指令,只能采取第一种最不好的方案了。

这也是为什么ucos要分这三个情况。它是定义了一个宏,关中断和开中断时用这个宏做。这个宏用条件编译实现具体的关中断和开中断的方法。