文档介绍:嵌入式系统作业
互斥(Mutual Exclusion)互斥是用来控制多任务对共享数据进行串行访问的同步机制。在多任务应用中,当两个或多个任务同时访问共享数据时,可能会造成数据破坏。互斥使它们能串行地访问数据,从而达到保护数据的目的。实现资源互斥访问的方法很多,不同之处仅在于互斥的范围和程度,互斥的本质是为了有序地利用资源,与共享资源打交道时,使之满足互斥条件最一般的方法有:关中断、使用测试并置位指令、禁止做任务切换、利用信号量。
1关中断
优点:访问共享资源最简单的方法是关中断: 一个任务在对共享资源进行访问前将中断关闭, 然后执行访问共享资源的关键段落代码, 访问共享资源结束后再打开中断。如果在参入访问共享资源的并发程序单元中包括ISR(中断服务程序)时, 任务级程序单元只能用关中断的措施来访问共享资源。中断被关闭后, 系统失去了对所有事件的反映能力, 不可能进行任务的切换, 从而保证了共享资源的独占式访问。
缺点:由于关中断延迟了对中断的响应时间, 直接影响了系统的实时性, 因此一般用于对简单共享资源的短暂访问。因此在上锁期间,它可能造成系统对外部事件反应迟钝。这对于大多数实时系统而言,系统的实时性也就得不到保证,因而不适合作为一种通用的互斥方法。然而当涉及到任务和中断服务程序共享数据时,中断上锁又是唯一的方法。但是在任何情况下,应该使中断上锁时间尽量短,这也是所有实时系统的基本要求。
关中断方法实现互斥程序:
void Function (void){
关中断;
处理共享资源;
开中断;
}
开中断程序:
Disable interrupts; /*关中断*/
Access the resource (read/write from/to variables); /*读/写变量*/
Reenable interrupts; /*重新允许中断*/
μC/OS-Ⅱ在处理内部变量和数据结构时就是使用的这种方法,即使不是全部,也是绝大部分。它提供了关中断(OS_ENTER_ CRITICAL())和开中断(OS_EXIT_CRITICAL())两个宏调用,以方便用户利用C代码开关中断。
利用μC/OS-Ⅱ宏调用关中断和开中断的程序:
void Function(void){
OS_ENTER_CRITICAL(); //宏调用,关中断
处理共享数据;
OS_EXIT_CRITICAL(); //宏调用,开中断
}
关中断这种互斥方法是在中断服务子程序中处理共享变量或共享数据结构的唯一手段,当改变或者复制某些变量、结构的值时,这也是一个好方法。
2 使用测试并置位指令
测试并置位:Test and Set,TAS,当两个任务共享一个资源时,设置一个全局标志变量并约定在访问共享资源以前先测试标志变量是否为1:
①:若为1则表明共享资源正在被其它任务所访问,该任务继续等待直到标志变量为0。
②:若标志变量为0,则任务将标志变量置位,然后访问共享资源,访问完毕后再清标志变量。
③:若置位和清零标志变量只需一条不会被中断的语句,不需要用开关中断的方法来保护对标志变量的操作,否则在操作前后还要使用禁止与允许中断,以免标志变量被破坏。
TAS方法流程图:
程序清单如下:
Disable