互斥(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)
关中断这种互斥方法是在中断服务子程序中处理共享变量或共享数据结构的唯一手段,当改变或者复制某些变量、结构的值时,这也是一个好方法。
2 使用测试并置位指令。
测试并置位:test and set,tas,当两个任务共享一个资源时,设置一个全局标志变量并约定在访问共享资源以前先测试标志变量是否为1:
若为1则表明共享资源正在被其它任务所访问,该任务继续等待直到标志变量为0。
若标志变量为0,则任务将标志变量置位,然后访问共享资源,访问完毕后再清标志变量。
若置位和清零标志变量只需一条不会被中断的语句,不需要用开关中断的方法来保护对标志变量的操作,否则在操作前后还要使用禁止与允许中断,以免标志变量被破坏。
tas方法流程图:
程序清单如下:
disable interrupts关中断。
if (‘access variable’ is 0如果资源不可用,标志为0
set variable to 1置资源不可用,标志为1
reenable interrupts重开中断。
access the resource处理该资源。
disable interrupts关中断。
set the ‘access variable’ back to 0;
reenable interrupts;
else
reenable interrupts;
3禁止做任务切换。
禁止做任务切换的基本原理是:任务切换也称为cpu寄存器内容切换,当多任务内核要运行其他任务时,它将正在运行任务的当前状态(cpu寄存器中的所有内容)保存在自己的堆栈中。入栈完成后,将下一个将要运行的任务的当前状况从该任务的栈中重新装入cpu的寄存器,并开始下一个任务的运行。
如果任务不与中断服务子程序共享变量或数据结构,可以使用禁止,然后允许任务切换。可以采用给任务切换上锁,然后开锁的方法实现数据共享。若任务不与中断服务子程序共享变量或数据结构,可使用此方法,此时,中断任然是开着的,应尽量避免使用此方法,它与内核对任务的调度功能相违背。
用给任务切换上锁,然后开锁的方法实现数据共享:
利用禁止调度方法实现互斥的程序:
void function (void)
osschedlock内核函数,调度上锁。
处理共享数据(中断是开放的);
osschedunlock内核函数,调度解锁。
4利用信号量。
利用信号量的基本原理是:信号量实际上是一种约定机制,用于:控制共享资源的使用权(满足互斥条件);标志某个事件的发生;使两个任务同步。
信号量是计数式的,其值取决于所用的内核。一般,对信号量实时三种操作:初始化(initialize),或称为建立(create);等信号(wait),或称为挂起(pend);给信号(singal)或发信号(post);信号量初始化时要给信号量赋初值,等待信号量的任务表应清为空想要的到信号量的任务执行等待(wait)操作。
任务以发信号操作(signal)释放信号量。μc/os-ii只支持优先级法,也就是等待信号量任务中优先级最高的。使用信号量之前,一定要对该信号量做初始化,作为互斥条件,信号量初始化为1。
信号量是60年代中期edgser dijkstra 发明的。信号像是一把钥匙,任务要运行下去,得先拿到这把钥匙。如果信号已被别的任务占用,该任务只得被挂起,直到信号被当前使用者释放。
换句话说,申请信号的任务是在说:“把钥匙给我,如果谁正在用着,我只好等!”信号是只有两个值的变量,信号量是计数式的。
只取两个值的信号是只有两个值0和1的量,因此也称之为信号量。计数式信号量的值可以是0到255或0到65535,或0到4294967295,取决于信号量规约机制使用的是8位、16位还是32位。到底是几位,实际上是取决于用的哪种内核。
根据信号量的值,内核跟踪那些等待信号量的任务。
以下程序清单示意在μc/os-ii中如何用信号量处理共享数据。要与同一共享数据打交道的任务调用等待信号量函数ossempend()。处理完共享数据以后再调用释放信号量函数ossempost()。
这两个函数将在以后的章节中描述。要注意的是,在使用信号量之前,一定要对该信号量做初始化。作为互斥条件,信号量初始化为1。
使用信号量处理共享数据不增加中断延迟时间,如果中断服务程序或当前任务激活了一个高优先级的任务,高优先级的任务立即开始执行。
程序清单通过获得信号量处理共享数据:
os_event *shareddatasem;
void function (void)
int8u err;
ossempend(shareddatasem,0,&err);
ossempost(shareddatasem);
利用信号量访问共享资源示例:
假设允许两个任务同时向共享串口发送数据,任务a要输出,任务b要输出,若不满足互斥条件,串口会交叉输出两个任务的数据,可能的结果是”。
使用二值信号量并给信号量赋初值1,要想访问串口的任务,首先请求信号量,得到该资源的访问权。谁先得到,谁先使用。
四种方法优、缺点比较:
互斥机制最强有力的方法是关中断,这种上锁保证了对cpu的独占访问。在互斥期间,即使外部事件产生而引发相应的中断,系统也不会切换到相应的中断服务程序(isr),也能保证任务之间的互斥。因此在上锁期间,它可能造成系统对外部事件反应迟钝。
这对于大多数实时系统而言,系统的实时性也就得不到保证,因而不适合作为一种通用的互斥方法。然而当涉及到任务和中断服务程序共享数据时,中断上锁又是唯一的方法。但是在任何情况下,应该使中断上锁时间尽量短,这也是所有实时系统的基本要求。
从本质上讲,信号量机制比关中断或禁止做任务切换提供更精确的互斥力度,但是在使用时需要注意优先级继承,删除安全性和递归使用等问题,并且当一个任务需要同时获取多个信号量时更要注意避免系统的死锁问题。因此,一般实时嵌入式操作系统都会为用户提供多种互斥手段,以适应不同的使用场合。
但对于禁止做任务切换这种方法而言,有些系统支持,如μc/os-ii,vxworks等,而有些系统未必支持,如psos等。如果任务不与中断服务子程序共享变量或数据结构,可以使用先禁止然后允许任务切换的手段。此时虽然任务切换禁止了,但中断还是开着的。
如果这时中断来了,中断服务子程序会在这一临界区内立即执行。中断服务子程序结束时,即使有更高优先级的任务已经进入就绪态,内核还是返回到原先被中断了的任务,直到执行完给任务切换开锁函数,内核再看看有没有优先级更高的任务被中断服务子程序激活而进入就绪态,如果有则做任务切换。此种机制比中断上锁要弱一些。
嵌入式式系统作业
目录。摘要 1第一章绪论 2 第二章相关芯片介绍 3 2.1 tms320f28335 3 2.2 加速度传感器adxl345 4 2.3 角速度传感器l3g4200 5 第三章 dsp的i2c通讯原理 6 3.1 adxl345的i2c接口 6 3.2 l3g4200的i2c接口 8 3.3 tm...
嵌入式系统作业
嵌入式系统的应用范围可以粗略分为两大类 电子系统的智能化 工业控制 现代农业 家用电器 汽车电子 测控系统 数据采集等 计算机应用的延伸 手机 通信 网络 计算机外围设备等 从这些应用可以看出,要完成一个以mcu为核心的嵌入式系统应用产品设计,需要硬件 软件及行业领域相关知识。硬件主要有mcu的硬件...
嵌入式系统作业
计算机科学与技术学院。计科09 2班。题目 电子产品之嵌入式追踪系统。一 现状。我时常听到说某位同学的手机被盗了或者相机丢了,类似的事情在高校里时有发生。这给同学们造成了严重的损失,而且里面还有很多资料是非常重要的,这一丢失给失主造成的损失更是无法估量,那么我们能否用什么方法来解决此类问题吗?因此我...