资料目录
uCOS专区
实时系统的几个基本概念---关中断和开中断
发布日期:2011/11/27
处理共享数据时保证互斥,最简便快捷的办法是关中断和开中断。如示意性代码程序2.3所示:
|
程序清单2.3 关中断和开中断 |
|
Disable interrupts; /*关中断*/ |
|
Access the resource (read/write from/to variables); /*读/写变量*/ |
|
Reenable interrupts; /*重新允许中断*/ |
μC/OS-Ⅱ在处理内部变量和数据结构时就是使用的这种手段,即使不是全部,也是绝大部分。实际上μC/OS-Ⅱ提供两个宏调用,允许用户在应用程序的C代码中关中断然后再开中断:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()[参见8.03.02 OS_ENTER_CRITICAL()和OS_EXIT_CRITICALL()],这两个宏调用的使用法见程序2.4
|
程序清单2.4利用μC/OS_Ⅱ 宏调用关中断和开中断 |
|
void Function (void) |
|
{ |
|
OS_ENTER_CRITICAL(); |
|
. |
|
. /*在这里处理共享数据*/ |
|
. |
|
OS_EXIT_CRITICAL(); |
|
} |
可是,必须十分小心,关中断的时间不能太长。因为它影响整个系统的中断响应时间,即中断延迟时间。当改变或复制某几个变量的值时,应想到用这种方法来做。这也是在中断服务子程序中处理共享变量或共享数据结构的唯一方法。在任何情况下,关中断的时间都要尽量短。
如果使用某种实时内核,一般地说,关中断的最长时间不超过内核本身的关中断时间,就不会影响系统中断延迟。当然得知道内核里中断关了多久。凡好的实时内核,厂商都提供这方面的数据。总而言之,要想出售实时内核,时间特性最重要。