嵌入式系统开发-Chapter6-同步、互斥与通信.ppt
《嵌入式系统开发-Chapter6-同步、互斥与通信.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统开发-Chapter6-同步、互斥与通信.ppt(126页珍藏版)》请在三一办公上搜索。
1、第五章 同步、互斥与通信,主要内容,1 概述2 信号量3 邮箱和消息队列4 事件5 异步信号6 管道,第一节概述,多任务系统中任务之间的关系相互独立:仅竞争CPU资源。竞争除CPU外的其他资源(互斥)。同步:协调彼此运行的步调,保证协同运行的各个任务具有正确的执行次序。通信:彼此间传递数据或信息,以协同完成某项工作。,任务与中断处理程序或其他任务进行同步或通信:单向同步或通信:一个任务与另一个任务或一个ISR同步或通信。双向同步或通信:两个任务相互同步或通信。双向同步不能在任务与ISR之间进行,因为ISR不能等待。,ISR x,Task y,POST,PEND,任务与ISR之间的同步(单向),
2、Task x,Task y,POST,PEND,POST,PEND,任务与任务之间的同步(双向),任务与任务之间的同步(单向),Task x,Task y,POST,PEND,任务间的耦合程度:耦合程度较高任务之间需要进行大量的通信,相应的系统开销较大;耦合程度较低任务之间不存在通信需求,其间的同步关系很弱甚至不需要同步或互斥,系统开销较小。研究任务间耦合程度的高低对于合理地设计应用系统、划分任务有很重要的作用。,在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包括:信号量(semaphore),用于互斥与同步。事件(组)(event group),用于同步。异步信号(asy
3、nchronous signal),用于同步。邮箱(mailbox)、消息队列(message queue),用于消息通信。管道(pipe),提供非结构化数据交换和实现同步。,以下一些机制也可用于同步与通信(在单处理器或多处理器系统中):全局变量。共享内存。Sockets。远程过程调用(Remote Procedure Call)。,第二节信号量,1 信号量的种类及用途2 互斥信号量3 二值信号量4 计数信号量5 信号量机制的主要数据结构6 典型的信号量操作,信号量用于实现任务与任务之间、任务与中断处理程序之间的同步与互斥。信号量一般分为三种:,1 信号量的种类及用途,用于解决互斥问题。可能会
4、引起优先级反转问题。,用于解决同步问题。,用于解决资源计数问题。,互斥信号量,计数信号量,二值信号量,用互斥信号量保护的代码区称作“临界区”。临界区代码通常用于对共享资源的访问。获得互斥信号量的任务进入“临界区”,其他试图获取信号量的任务就会被阻塞。当任务离开临界区时,就是释放信号量。互斥信号量的值被初始化成1,表明目前没有任务进入“临界区”,但最多只有一个任务可以进入“临界区”。,2 互斥信号量,13,INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8U prio)OS_STK*psp;INT8U err;O
5、S_ENTER_CRITICAL();if(OSTCBPrioTblprio=(OS_TCB*)0)/*Make sure task doesnt already exist at this priority*/OSTCBPrioTblprio=(OS_TCB*)1;/*Reserve the priority to prevent others from doing the same thing until task is created.*/OS_EXIT_CRITICAL();psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,0);/*Initiali
6、ze the tasks stack*/err=OS_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);if(err=OS_NO_ERR)OS_ENTER_CRITICAL();OSTaskCtr+;/*Increment the#tasks counter*/OS_EXIT_CRITICAL();if(OSRunning=TRUE)/*Find highest priority task if multitasking has started*/OS_Sched();else OS_ENTER_CRITICAL();OSTCBPrioTblprio=(O
7、S_TCB*)0;/*Make this priority available to others*/OS_EXIT_CRITICAL();return(err);OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);,OSTaskCreate in ucOS,共享资源:一段存储器空间、一个数据结构或I/O设备,也可能是被两个或多个并发任务共享的任何内容。使用互斥信号量可以实现对共享资源的串行访问。,互斥信号量状态图,开启,锁定,初始化值为1,申请并获得值为0,释放值为1,申请(递归)并获得锁定数加1,释放(递归)锁定数减1,所有权当一个任务通过获取互斥信号量而将其
8、锁定时,得到该互斥信号量的所有权。当一个任务释放信号量时,失去对其的所有权。申请与释放要匹配:任务要释放互斥信号量,必须事前先获取该信号量。,16,INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8U prio)OS_STK*psp;INT8U err;OS_ENTER_CRITICAL();if(OSTCBPrioTblprio=(OS_TCB*)0)/*Make sure task doesnt already exist at this priority*/OSTCBPrioTblprio=(OS_TCB
9、*)1;/*Reserve the priority to prevent others from doing the same thing until task is created.*/OS_EXIT_CRITICAL();psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,0);/*Initialize the tasks stack*/err=OS_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);if(err=OS_NO_ERR)OS_ENTER_CRITICAL();OSTaskCtr+;/*Increment
10、 the#tasks counter*/OS_EXIT_CRITICAL();if(OSRunning=TRUE)/*Find highest priority task if multitasking has started*/OS_Sched();else OS_ENTER_CRITICAL();OSTCBPrioTblprio=(OS_TCB*)0;/*Make this priority available to others*/OS_EXIT_CRITICAL();return(err);OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);,OSTask
11、Create in ucOS,Task1,RoutineA,RoutineB,嵌套资源访问如果Task1调用RoutineA,而RoutineA又调用RoutineB,并且三者访问相同的共享资源,就发生了递归共享资源的访问同步问题。,一个递归的互斥信号量允许嵌套锁定互斥信号量,而不引起死锁。,每个获取信号量的调用必须与释放信号量的调用相匹配。当最外层的获取信号量的调用与释放信号量的调用匹配时,该信号量才允许被其它任务访问。用于同步的信号量不支持嵌套访问。删除安全需要保护在临界区执行的任务不会被意外地删除。删除一个在临界区执行的任务可能引起意想不到的后果,造成保护资源的信号量不可用,可能导致资源
12、处于破坏状态。,各种互斥机制比较,3 二值信号量,用于任务与任务之间、任务与中断服务程序之间的同步用于同步的二值信号量初始值为0,表示同步事件尚未产生;任务申请信号量以等待该同步事件的发生;另一个任务或ISR到达同步点时,释放信号量(将其值设置为1)表示同步事件已发生,以唤醒等待的任务。,二值信号量状态图,可获得,不可获得,申请并获得(值为0),释放(值为1),初始化值为0,Task1()执行一些操作;将信号量sem1置1;申请信号量sem2;,Task2()申请信号量sem1;执行一些操作;将信号量sem2置1;,Task2申请信号量sem1失败,系统切换到Task1,sem1被置1后,Ta
13、sk2得到sem1并抢占Task1,Task2运行到某处时因某种原因被阻塞,系统切换到Task1,用二值信号量实现两个任务之间的双向同步Task2优先级高于Task1sem1和sem2的初始值均为0,4 计数信号量,用于控制系统中共享资源的多个实例的使用,允许多个任务同时访问同一种资源的多个实例。计数信号量被初始化为n(非负整数),n为该种共享资源的数目。,计数信号量状态图,可获得,不可获得,初始化值大于0,申请并获得值为0,释放值为1,申请并获得值减1,释放值加1,计数信号量使用实例:有界缓冲问题,生产者任务do 产生一个数据项 申请empty 申请mutex 将新生成的数据项添加到缓冲中
14、释放mutex 释放full while(1);,消费者任务do 申请full 申请mutex 从缓冲中移出一个数据项的内容 释放mutex 释放empty 消费新获得的数据项内容 while(1);,计数信号量full:已被填充的数据项数目,取值范围0n,初始值为0计数信号量empty:空闲数据项数目,取值范围为0n,初始值为n;互斥信号量mutex:控制生产者任务和消费者任务对有界缓冲的访问,初始值为1。,5 信号量机制的主要数据结构,信号量控制块:管理所有创建的信号量,内核在系统运行时动态分配和回收信号量控制块。互斥和二值信号量控制块结构:Binary_Semaphore_Control
15、_Block,wait_queue任务等待队列attributes信号量属性lock_nesting_behavior试图嵌套获得时的规则 wait_discipline 任务等待信号量的方式priority_ceiling 优先级天花板值lock是否被占有holder拥有者 nest_count嵌套层数,计数信号量控制结构Counting_Semaphore_Control_Block wait_queue任务等待队列 attributes计数信号量属性 maximum_count最大计数值 wait_discipline任务等待信号量的方式 count当前计数值,信号量内部实现机制实例说明
16、C/OS-II,事件控制块ECB同步与通信机制的基本数据结构typedef structINT8UOSEventType;/事件类型INT16UOSEventCnt;/计数器(信号量)void*OSEventPtr;/指向消息或消息队列的指针INT8UOSEventGrp;/等待任务所在的事件组INT8UOSEventTblOS_EVENT_TBL_SIZE;/等待任务的事件表OS_EVENT;/等待事件的任务中,优先级最高的任务获得事件。,当一个事件发生后,等待事件列表中优先级最高的任务(即在.OSEventTbl&OSEventGrp中所有被置1的位中优先级数值最小的任务)得到该事件。,当
17、.OSEventTbln中的任何一位为1时,OSEventGrp中的第n位为1。与任务就绪列表类似!,将一个任务插入到等待事件的任务列表中:pevent-OSEventGrp|=OSMapTblprio 3;pevent-OSEventTblprio 3|=OSMapTblprio 与将一个任务插入到就绪列表中的操作类似!,Index Bit mask(Binary)0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 1 02 0 0 0 0 0 1 0 03 0 0 0 0 1 0 0 04 0 0 0 1 0 0 0 05 0 0 1 0 0 0 0 06 0 1 0 0 0 0
18、 0 07 1 0 0 0 0 0 0 0,从等待事件的任务列表中使任务脱离等待状态if(pevent-OSEventTblprio 3 与将任务从就绪列表中清除的操作类似!,在等待事件的任务列表中查找优先级最高的任务y=OSUnMapTblpevent-OSEventGrp;x=OSUnMapTblpevent-OSEventTbly;prio=(y 3)+x;与查找优先级最高的就绪任务的操作类似!,空闲事件控制块链表,typedef structINT8UOSEventType;/事件类型INT16UOSEventCnt;/计数器(信号量)void*OSEventPtr;/指向消息或消息队
19、列的指针INT8UOSEventGrp;/等待任务所在的事件组INT8UOSEventTblOS_EVENT_TBL_SIZE;/等待任务的事件表OS_EVENT;/等待事件的任务中,优先级最高的任务获得事件。,6 典型的信号量操作,创建信号量获取(申请)信号量释放信号量删除信号量清除信号量的任务等待列表 获取有关信号量的各种信息,6.1 创建信号量,功能:根据应用传递的参数创建一个信号量。参数:信号量的名字、属性和初始值等。内核动作:从空闲信号量控制块链中分配一个信号量控制块,并初始化信号量属性。创建成功时,为其分配唯一的ID号返回给应用。如果已创建信号量数量已达到用户配置的最大数量,就返回
20、错误。,信号量的属性包括:类型。任务等待信号量的方式(即排列的顺序)。互斥信号量:与任务删除安全、递归访问以及解决优先级反转的策略相关的参数。,信号量的属性,信号量的类型,互斥信号量(MUTEX_SEMAPHORE),计数信号量(COUNTING_SEMAPHORE),二值信号量(BINARY_SEMAPHORE),任务等待信号量的方式,先进先出(FIFO)顺序,优先级(PRIORITY)顺序,优先级反转问题的解决方法(只适用于互斥信号量),优先级继承算法(INHERIT_PRIORITY),优先级天花板算法(PRIORITY_CEILING),需给出所有可能获得此信号量的任务中优先级最高的任
21、务的优先级。,OS_EVENT*OSSemCreate(INT16U cnt)OS_EVENT*pevent;pevent=OSEventFreeList;/从空闲事件控制块链中取得一个ECBif(OSEventFreeList!=(OS_EVENT*)0)OSEventFreeList=(OS_EVENT*)OSEventFreeList-OSEventPtr;if(pevent!=(OS_EVENT*)0)/初始化ECB的各个域pevent-OSEventType=OS_EVENT_TYPE_SEM;/事件类型为信号量pevent-OSEventCnt=cnt;/信号量的初始计数值peve
22、nt-OSEventPtr=(void*)0;OS_EventWaitListInit(pevent);/初始化等待任务列表return(pevent);/调用者需检查返回值,如果为NULL则表示建立失败,6.2 获取(申请)信号量,功能:试图获得应用指定的信号量。if 信号量的值大于0then 将信号量的值减1else 根据接收信号量的选项,将任务放到等待队列中,或是直接返回,当所申请的信号量不能被立即获得时,可以有以下几种选择:永远等待。不等待,立即返回,并返回一个错误状态码。指定等待时限(可有效避免死锁)。注意:不允许在ISR中选择等待。当任务选择等待时,将被按FIFO或优先级顺序放置在
23、等待队列中。,44,t0,t0,t1,t2,t3,t4,t5,t6,t7,t8,Critical section guarded by S,time,1,2,t9,t0,t10,t11,t12,t13,t14,t15,t16,t18,t17,假定在时间t1,任务T2获得信号量S2,进入临界区。在时间t3,任务T2又试图获得信号量S1,但一个高优先级任务T1在这个时候就绪,抢占任务T2并获得信号量S1,接下来任务T1又试图获得信号量S2。这样就出现了死锁现象。,如果任务等待一个使用优先级继承算法的互斥信号量,且它的优先级高于当前正占有此信号量的任务的优先级,那么占有信号量的任务将继承这个被阻塞的
24、任务的优先级。如果任务成功地获得一个采用优先级天花板算法的互斥信号量,它的优先级又低于优先级天花板,那么它的优先级将被抬升至天花板。,void OSSemPend(OS_EVENT*pevent,INT16U timeout,INT8U*err)if(pevent-OSEventCnt 0)/信号量值大于0,成功获得信号量并返回pevent-OSEventCnt-;*err=OS_NO_ERR;return;OSTCBCur-OSTCBStat|=OS_STAT_SEM;/设置任务状态为等待信号量OSTCBCur-OSTCBDly=timeout;/设置等待时限OS_EventTaskWait
25、(pevent);/将任务放置到信号量的等待列表中 OS_Sched();/内核实施任务调度,系统切换到另一就绪任务执行if(OSTCBCur-OSTCBStat/任务由于获得信号量而恢复执行,本调用成功返回,获取(等待)信号量,INT16U OSSemAccept(OS_EVENT*pevent)INT16U cnt;cnt=pevent-OSEventCnt;if(cnt 0)pevent-OSEventCnt-;return(cnt);,注意:即使不能成功获得信号量(返回值为0),调用者也不会被阻塞。此函数可以在中断处理程序中使用。,获取(无等待地请求)信号量,6.3 释放信号量,功能:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 开发 Chapter6 同步 通信
链接地址:https://www.31ppt.com/p-6414996.html