今天又看了一下ucos保护临界段代码,ucos是利用禁止中断来保护临界段的。
ucos给我们提供了三种方法:
一:直接关中断和直接开中断。即成对使用,保证临界段的安全。
二:先把原来的中断状态压入栈中,然后再关闭中断。恢复时直接从栈中返回原来存储的中断状态。
三:先保存原来的中断状态到一个变量中,然后再关闭中断。
三种情况我都说完了,下面我说一下为什么有这三种形态:
其实,这三种方法从应用上可分为两种,可嵌套和不可嵌套。
其实大家分析一下,所谓保护临界段代码就是关中断,在操作系统内部本身就是关中断、然后开中断。这是没有问题的,但大家想一下,操作系统给用户提供了一些编程接口,当用户希望用同样关中断的方法来保护共享数据时。比如用户写的代码如下:
关中断
调用系统服务
其他操作
开中断
大家想一下,本来用户想保存从用户关中断和开中断这些代码的,不过你调用了操作系统的服务,如果你是用的方法是不可嵌套的,那在退出操作系统代码时已经开中断了。违背了用户的愿望。所以我们操作系统提供可嵌套的关 开中断的方法。这种嵌套是针对高层应用程序的。在操作系统内部这个嵌套是没有任何意义的。
那有一点疑惑可能你会提出,那中断最好是支持嵌套了,是,这个没错。但大家想一想我们想嵌套,就必须保存原来的状态寄存器的值,而前提是机器要有支持读状态寄存器的指令。如果没有这样的指令,只能采取第一种最不好的方案了。
这也是为什么ucos要分这三个情况。它是定义了一个宏,关中断和开中断时用这个宏做。这个宏用条件编译实现具体的关中断和开中断的方法。