一、 代码的临界区
代码临界区指操作系统在处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断打扰。为确保临界段代码的执行,在进入临界段之前要关中断,而临界段代码执行完以后要立即开中断。如下关于A/D采样的代码中
<span style="font-size:14px;">Int main()
{
_DINT();
WDTCTL=WDTPW+WDTHOLD;
InitClock();
InitAD12();
InitTimerA();
ADValue=0;
_EINT();
…
}</span>
实际上,这段代码中_DINT()关中断和_EINT()开中断所包括的代码就是一个临界区。由于初始化操作需要设置系统时钟、设定定时器等,那么这段代码是不应该被外部中断将其中断执行并更改的。
不同的嵌入式操作系统实现临界区的方式也各不相同,对于uC/OSii,该系统定义了两个宏(macros)来关中断和开中断,以便避开不同C编译器厂商选择不同的方法来处理关中断和开中断。uC/OSii,中的这两个宏调用分别是:OS_ENTER_CRITICAL()和OS_EXIT_CRITIAL().开发者可以根据采用的硬件平台,实现这两个宏。这里只不过做了一个封装。
而嵌入式Linux实现临界区的方法有多种,可以采用自旋锁spin_lock的方法防止多个进程操作同一段临界区。Spin_lock()是一个内核函数,开发者包括文件就可以使用它了。