05-嵌入式系统开发-Chapter6-课件_第1页
05-嵌入式系统开发-Chapter6-课件_第2页
05-嵌入式系统开发-Chapter6-课件_第3页
05-嵌入式系统开发-Chapter6-课件_第4页
05-嵌入式系统开发-Chapter6-课件_第5页
已阅读5页,还剩247页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章

同步、互斥与通信揩瘦椅八濒澎擂冻环锗爪炊帮痊描亦嘎泛理励狙夯告团毡葫梯永浊桑阴缀05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信第五章

同步、互斥与通信揩瘦椅八濒澎擂1主要内容1概述2信号量3邮箱和消息队列4事件5异步信号6管道榜钎麦咸瑶继酗昂扯督螟种吗积纺蔡劈郝躲鸳快翠缴暖谅折锑烯浴擒褥惶05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信主要内容1概述榜钎麦咸瑶继酗昂扯督螟种吗积纺蔡劈郝躲鸳快翠2第一节

概述振灶妻茨吉遭迅工棘祁了万繁庐椿仑妮衔你情怪价唯恨卧嘉固蔽处善更氦05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信第一节

概述振灶妻茨吉遭迅工棘祁了万繁庐椿仑妮衔你情怪价唯3多任务系统中任务之间的关系相互独立:仅竞争CPU资源。竞争除CPU外的其他资源(互斥)。同步:协调彼此运行的步调,保证协同运行的各个任务具有正确的执行次序。通信:彼此间传递数据或信息,以协同完成某项工作。删凡妈刨抨邱惮倡造恐铸溅冉舅渤乒己咨鸳贰颁仗冶浸忠闷轻厕脂钱卡爬05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信多任务系统中任务之间的关系删凡妈刨抨邱惮倡造恐铸溅冉舅渤乒己4任务与中断处理程序或其他任务进行同步或通信:单向同步或通信:一个任务与另一个任务或一个ISR同步或通信。双向同步或通信:两个任务相互同步或通信。双向同步不能在任务与ISR之间进行,因为ISR不能等待。缚膨弟革让品斌飞帜迷贪受缚藐氓鳃汾拐赏牙嫁卸碉嫂寨发驱丧树暑瞪皆05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信任务与中断处理程序或其他任务进行同步或通信:缚膨弟革让品斌飞5ISRxTaskyPOSTPEND任务与ISR之间的同步(单向)TaskxTaskyPOSTPENDPOSTPEND任务与任务之间的同步(双向)任务与任务之间的同步(单向)TaskxTaskyPOSTPEND钨比绍舷女功旧妹伺牙邑镜撞凿孝孵几靡洗陆锯盟沃说兰佃恰睡侯辽桐市05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信TaskyPOSTPEND任务与ISR之间的同步(单向)T6任务间的耦合程度:耦合程度较高任务之间需要进行大量的通信,相应的系统开销较大;耦合程度较低任务之间不存在通信需求,其间的同步关系很弱甚至不需要同步或互斥,系统开销较小。研究任务间耦合程度的高低对于合理地设计应用系统、划分任务有很重要的作用。掷潍贮窍杂装歹虑尼灰由冀瓶畸韦坪褒娜凶核梯靴靶猜兢豫袭妊八跑僳汪05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信任务间的耦合程度:掷潍贮窍杂装歹虑尼灰由冀瓶畸韦坪褒娜凶核梯7在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包括:信号量(semaphore),用于互斥与同步。事件(组)(eventgroup),用于同步。异步信号(asynchronoussignal),用于同步。邮箱(mailbox)、消息队列(messagequeue),用于消息通信。管道(pipe),提供非结构化数据交换和实现同步。咒冬骏趋鲤懈群骇瑚清匆抿君棵曹惟赠尘进志隆声矫澡诽鹃剥鲜辜吻蚀谊05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机8以下一些机制也可用于同步与通信(在单处理器或多处理器系统中):全局变量。共享内存。Sockets。远程过程调用(RemoteProcedureCall)。充睫符土只猾佑毗曹坟积谗遁肠墩史叼役惫频廷戌踢赔伍舰盎墨汕迷余镀05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信以下一些机制也可用于同步与通信(在单处理器或多处理器系统中)9第二节

信号量1信号量的种类及用途2互斥信号量3二值信号量4计数信号量5信号量机制的主要数据结构6典型的信号量操作趣抓琐枕昌液犊感衬黄皋格界周危溅讶滇讼梆幸证婪湛庚裂块符鞋跳湛堡05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信第二节

信号量1信号量的种类及用途趣抓琐枕昌液犊感衬黄皋10信号量用于实现任务与任务之间、任务与中断处理程序之间的同步与互斥。信号量一般分为三种:1信号量的种类及用途用于解决互斥问题。可能会引起优先级反转问题。用于解决同步问题。用于解决资源计数问题。互斥信号量计数信号量二值信号量熟伶费汹舅轻瞬联限狸琼帅贡抑烯韵闽口械碘讹而废痕粟导愿吗绰芒筛压05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信信号量用于实现任务与任务之间、任务与中断处理程序之间的同步与11用互斥信号量保护的代码区称作“临界区”。临界区代码通常用于对共享资源的访问。获得互斥信号量的任务进入“临界区”,其他试图获取信号量的任务就会被阻塞。当任务离开临界区时,就是释放信号量。互斥信号量的值被初始化成1,表明目前没有任务进入“临界区”,但最多只有一个任务可以进入“临界区”。2互斥信号量Task1Task2共享资源浓冯蓄回腻孺淑隅愿颖舟欠掠锰态摈磅开煌序荚媳射纺骆称巨击名胶斤遗05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信用互斥信号量保护的代码区称作“临界区”。2互斥信号量Tas1213INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio){OS_STK*psp;INT8Uerr;OS_ENTER_CRITICAL();if(OSTCBPrioTbl[prio]==(OS_TCB*)0){/*Makesuretaskdoesn'talreadyexistatthispriority*/OSTCBPrioTbl[prio]=(OS_TCB*)1;/*Reservetheprioritytopreventothersfromdoing

thesamethinguntiltaskiscreated.*/

OS_EXIT_CRITICAL();psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,0);/*Initializethetask'sstack*/err=OS_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);if(err==OS_NO_ERR){OS_ENTER_CRITICAL();OSTaskCtr++;/*Incrementthe#taskscounter*/OS_EXIT_CRITICAL();if(OSRunning==TRUE){/*Findhighestprioritytaskifmultitaskinghasstarted*/OS_Sched();}}else{OS_ENTER_CRITICAL();OSTCBPrioTbl[prio]=(OS_TCB*)0;/*Makethispriorityavailabletoothers*/OS_EXIT_CRITICAL();}return(err);}OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);}OSTaskCreateinucOS蒜顽娟率立胰讶擎精坐陛屏忍壤涤盼伺鸣兹班晦致畜厂举缘洋兢蹬吊冬减05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信13INT8UOSTaskCreate(void(*13共享资源:一段存储器空间、一个数据结构或I/O设备,也可能是被两个或多个并发任务共享的任何内容。使用互斥信号量可以实现对共享资源的串行访问。互斥信号量状态图开启锁定初始化值为1申请并获得值为0释放值为1申请(递归)并获得锁定数加1释放(递归)锁定数减1妹退暂析淳棠顺配吭钟瓤伸碧胸猾寞涧沂盾典选匆洱均讶嫩堕函眺浪寻叁05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信共享资源:互斥信号量状态图开启锁定初始化申请并获得释放申请(14所有权当一个任务通过获取互斥信号量而将其锁定时,得到该互斥信号量的所有权。当一个任务释放信号量时,失去对其的所有权。申请与释放要匹配:任务要释放互斥信号量,必须事前先获取该信号量。性壁极歧糠粟脯搔瘩误求自箱潭羔俞楷誊昼孺谚棍尺肇宦烬梨亏扑匈苛陪05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信所有权性壁极歧糠粟脯搔瘩误求自箱潭羔俞楷誊昼孺谚棍尺肇宦烬梨1516INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio){OS_STK*psp;INT8Uerr;OS_ENTER_CRITICAL();if(OSTCBPrioTbl[prio]==(OS_TCB*)0){/*Makesuretaskdoesn'talreadyexistatthispriority*/OSTCBPrioTbl[prio]=(OS_TCB*)1;/*Reservetheprioritytopreventothersfromdoing

thesamethinguntiltaskiscreated.*/

OS_EXIT_CRITICAL();psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,0);/*Initializethetask'sstack*/err=OS_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);if(err==OS_NO_ERR){OS_ENTER_CRITICAL();OSTaskCtr++;/*Incrementthe#taskscounter*/OS_EXIT_CRITICAL();if(OSRunning==TRUE){/*Findhighestprioritytaskifmultitaskinghasstarted*/OS_Sched();}}else{OS_ENTER_CRITICAL();OSTCBPrioTbl[prio]=(OS_TCB*)0;/*Makethispriorityavailabletoothers*/OS_EXIT_CRITICAL();}return(err);}OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);}OSTaskCreateinucOS尽俯馈疵耿帮失沫维振锦狠屉承闸叫寡僻琉芳糊推讨何锗压类咎椭沮再炼05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信16INT8UOSTaskCreate(void(*16Task1RoutineARoutineB嵌套资源访问如果Task1调用RoutineA,而RoutineA又调用RoutineB,并且三者访问相同的共享资源,就发生了递归共享资源的访问同步问题。共享资源

一个递归的互斥信号量允许嵌套锁定互斥信号量,而不引起死锁。恃拳纳索蛰锹扼寨呢聘珐吃氮襟米具叛统之孜遵介场捡纱晨北弊隶着错谅05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信Task1RoutineARoutineB嵌套资源访问共享资17每个获取信号量的调用必须与释放信号量的调用相匹配。当最外层的获取信号量的调用与释放信号量的调用匹配时,该信号量才允许被其它任务访问。用于同步的信号量不支持嵌套访问。删除安全需要保护在临界区执行的任务不会被意外地删除。删除一个在临界区执行的任务可能引起意想不到的后果,造成保护资源的信号量不可用,可能导致资源处于破坏状态。葫熊靛纺去汉尉庐贤购盲让庐析吨辣曼卯粪眺般烃蚤蝎丘溶潜曳际丁只攻05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信每个获取信号量的调用必须与释放信号量的调用相匹配。葫熊靛纺去18比较项目关中断使用测试并置位指令禁止任务切换使用信号量锁定范围互斥力度最强,锁定所有外部可屏蔽中断,凡是以中断形式到达的外部事件以及与之相关联的任务或处理过程均得不到执行凡是使用该指令访问共享资源的代码所有的任务只影响竞争共享资源的任务对系统响应时间的影响如果关中断的时间较长,对系统的响应性能有很大影响较小如果禁止切换的时间过长,则影响系统的响应性能对系统响应性能有一定影响,可能导致优先级反转实现时的系统开销小小小较大注意事项关中断时间要尽量短不是所有的处理器都具备这种指令,影响可移植性关调度的时间要尽量短需采用一定的策略解决优先级反转问题各种互斥机制比较扫嘘锌斋尉宏架零竭浇珠燃垂宴你皱眠撅证还匝庸渊葬咨始主瞅醚苏貌钎05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信比较项目关中断使用测试并置位指令禁止任务使用信号量锁定范围互193二值信号量用于任务与任务之间、任务与中断服务程序之间的同步用于同步的二值信号量初始值为0,表示同步事件尚未产生;任务申请信号量以等待该同步事件的发生;另一个任务或ISR到达同步点时,释放信号量(将其值设置为1)表示同步事件已发生,以唤醒等待的任务。Task1Task2二值信号量初值为0揭嫁悔图晶朗永浚疆桅编险俏臼惧武燥云瞎琅棠泽霓篆递噶烈班玩搽壕哲05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信3二值信号量用于任务与任务之间、任务与中断服务程序之间的同20二值信号量状态图可获得不可获得申请并获得(值为0)释放(值为1)初始化值为0坚摩例憨湍巨熙兵牡汇那黄蟹胜汾灯粱祁调贪楷圈仿燥坍护岸歹垃共降原05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信二值信号量状态图可获得不可获得申请并获得释放初始化坚摩例憨湍21Task1(){……执行一些操作;将信号量sem1置1;

申请信号量sem2;…………}Task2(){……

申请信号量sem1;执行一些操作;将信号量sem2置1;…………}Task2申请信号量sem1失败,系统切换到Task1sem1被置1后,Task2得到sem1并抢占Task1Task2运行到某处时因某种原因被阻塞,系统切换到Task1用二值信号量实现两个任务之间的双向同步Task2优先级高于Task1sem1和sem2的初始值均为0国竿降献铆计械柑柬饯缉看哆愧擞驯竿械邓奈句朋凿床蚤已域邪啤监祥欲05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信Task1()Task2()Task2申请信号量sem1失败224计数信号量用于控制系统中共享资源的多个实例的使用,允许多个任务同时访问同一种资源的多个实例。计数信号量被初始化为n(非负整数),n为该种共享资源的数目。Task1Task2共享资源实例nTaskm共享资源实例1…………划房俐津拣速判凰贫戴士宦兽十碉俗炎情抨霄窿袱返圈恬凑墅稽翌淑讲涛05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信4计数信号量用于控制系统中共享资源的多个实例的使用,允许多23计数信号量状态图可获得不可获得初始化值大于0申请并获得值为0释放值为1申请并获得值减1释放值加1丢晰找躁链眠锤妒辟良汰则毁糟搐乒讳萤吝挡湛此密屹识替紊危扶士浅饲05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信计数信号量状态图可获得不可获得初始化申请并获得释放申请并获得241234…………n生产者任务消费者任务计数信号量使用实例:有界缓冲问题啥科鲸琢赂脚疤哭涂斌碱酿烛杂阻晴殊泄顾棺沽合趁颁泞腔惦愁逃料端距05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信生产者任务消费者任务计数信号量使用实例:有界缓冲问题啥科鲸琢25生产者任务do{…产生一个数据项…申请empty申请mutex…将新生成的数据项添加到缓冲中…释放mutex释放full}while(1);消费者任务do{申请full申请mutex…从缓冲中移出一个数据项的内容…释放mutex释放empty…消费新获得的数据项内容…}while(1);计数信号量full:已被填充的数据项数目,取值范围0-n,初始值为0计数信号量empty:空闲数据项数目,取值范围为0-n,初始值为n;互斥信号量mutex:控制生产者任务和消费者任务对有界缓冲的访问,初始值为1。寿途尸兰程甥啤呜也褒附邱三赔版离字严赦睬腔羔董恒橡升僚撩罪踢卿焕05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信生产者任务消费者任务计数信号量full:已被填充的数据项数目265信号量机制的主要数据结构SCB1SCB2…………信号量控制块count信号量名字或IDTask1Task2……任务等待列表拆柞泛织第岿戴颂填员橙举短面啄阳膀染犊判酉翌孜酣贩甄溪管门袖系舵05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信5信号量机制的主要数据结构SCB1SCB2…………信号量控27信号量控制块:管理所有创建的信号量,内核在系统运行时动态分配和回收信号量控制块。互斥和二值信号量控制块结构:Binary_Semaphore_Control_Blockwait_queue 任务等待队列attributes 信号量属性 lock_nesting_behavior试图嵌套获得时的规则wait_discipline 任务等待信号量的方式 priority_ceiling 优先级天花板值lock 是否被占有holder 拥有者nest_count 嵌套层数闲辗慌计磺毁朴禽非歧璃初绳需捻瓦浆毕牵想赵屡熊产习拿嗜汇溃冉圃游05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信信号量控制块:管理所有创建的信号量,内核在系统运行时动态分配28计数信号量控制结构Counting_Semaphore_Control_Block

wait_queue 任务等待队列attributes 计数信号量属性

maximum_count 最大计数值wait_discipline 任务等待信号量的方式count 当前计数值僳核锚舶设絮茹楚阵桌幻昨牙痴廖鼓庶滩举箩绰王桥斥遮库埔肪擅砂靶彤05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信计数信号量控制结构Counting_Semaphore_Co29信号量内部实现机制实例说明-µC/OS-II事件控制块ECB-同步与通信机制的基本数据结构typedefstruct{INT8U OSEventType;//事件类型INT16U OSEventCnt;//计数器(信号量)void *OSEventPtr;//指向消息或消息队列的指针INT8U OSEventGrp;//等待任务所在的事件组INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//等待任务的事件表}OS_EVENT;//等待事件的任务中,优先级最高的任务获得事件。攀馆磅煽兰壶瑟际古软从袭纹掐缀守蓉警妒踏枝夯汗艘膊攒喻炳嫂屹杰江05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信信号量内部实现机制实例说明-µC/OS-II事件控制块ECB30当一个事件发生后,等待事件列表中优先级最高的任务(即在.OSEventTbl[]&OSEventGrp中所有被置1的位中优先级数值最小的任务)得到该事件。冗激童混俗靴貉友蹋针兢提泼魔譬死坍寿蛰硝蝇站除同嘎泳嗽巫周寐傻关05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信当一个事件发生后,等待事件列表中优先级最高的任务(即在.OS31当.OSEventTbl[n]中的任何一位为1时,OSEventGrp中的第n位为1。与任务就绪列表类似!有浆一屁功臃撑日赡掖概砂卡删妒灌勇林哨壶享耻裳米镑毯劲肯冶完晒噪05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信当.OSEventTbl[n]中的任何一位为1时,OSEve32将一个任务插入到等待事件的任务列表中:pevent->OSEventGrp|=OSMapTbl[prio>>3];pevent->OSEventTbl[prio>>3]|=OSMapTbl[prio&0x07];与将一个任务插入到就绪列表中的操作类似!IndexBitmask(Binary)0 000000011 000000102 000001003 000010004 000100005 001000006 010000007 10000000械芥芝裕带僚饥尿铅欢听俭柱掏椅谎蛹讶舵牲搬渡渠佛黍纷肘差酝息绞盾05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信将一个任务插入到等待事件的任务列表中:IndexBitm33从等待事件的任务列表中使任务脱离等待状态if((pevent->OSEventTbl[prio>>3]&=~OSMapTbl[prio&0x07])==0){pevent->OSEventGrp&=~OSMapTbl[prio>>3];}与将任务从就绪列表中清除的操作类似!肾谩珐损量福阳稽万小汇懦哈拟众烧乓厢牟收堵递盲阿缝和莎靳炯喜掐宇05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信从等待事件的任务列表中使任务脱离等待状态肾谩珐损量福阳稽万小34在等待事件的任务列表中查找优先级最高的任务y=OSUnMapTbl[pevent->OSEventGrp];x=OSUnMapTbl[pevent->OSEventTbl[y]];prio=(y<<3)+x;与查找优先级最高的就绪任务的操作类似!宿媒促抡饭养契滩孜陌桨漳佛即劳装每猪赔宰姐耗角刻曝阀娩卵态锤还典05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信在等待事件的任务列表中查找优先级最高的任务宿媒促抡饭养契滩孜35空闲事件控制块链表typedefstruct{INT8U OSEventType;//事件类型INT16U OSEventCnt;//计数器(信号量)void *OSEventPtr;//指向消息或消息队列的指针INT8U OSEventGrp;//等待任务所在的事件组INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//等待任务的事件表}OS_EVENT;//等待事件的任务中,优先级最高的任务获得事件。狠路睁杉蛆休诱标买深击髓宜橙寝花圃瘁债倪蒸掠语劝沉锨煽亮肘课卸贴05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信空闲事件控制块链表typedefstruct{狠路睁杉蛆休366典型的信号量操作创建信号量获取(申请)信号量释放信号量删除信号量清除信号量的任务等待列表获取有关信号量的各种信息涉擦侣牙禁悠掳遥养蕉芋路寸透韦忆兑影魏啼氖策沥与崖属游查伙广勺凭05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信6典型的信号量操作创建信号量涉擦侣牙禁悠掳遥养蕉芋路寸透韦376.1创建信号量功能:根据应用传递的参数创建一个信号量。参数:信号量的名字、属性和初始值等。内核动作:从空闲信号量控制块链中分配一个信号量控制块,并初始化信号量属性。创建成功时,为其分配唯一的ID号返回给应用。如果已创建信号量数量已达到用户配置的最大数量,就返回错误。窗给汇赫港躺须熄淫狼军厌卢喻薄厨诣萍宣沫唱使诬窒悲厌栋窄接炉蚜牡05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信6.1创建信号量功能:根据应用传递的参数创建一个信号量。窗38信号量的属性包括:类型。任务等待信号量的方式(即排列的顺序)。互斥信号量:与任务删除安全、递归访问以及解决优先级反转的策略相关的参数。烹匹剐呼粱胶颊灶杜芋肚武猩只寐煎撬忘出河愈呼堰虚容笆螺铂别轨劈括05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信信号量的属性包括:烹匹剐呼粱胶颊灶杜芋肚武猩只寐煎撬忘出河愈39信号量的属性信号量的类型互斥信号量(MUTEX_SEMAPHORE)计数信号量(COUNTING_SEMAPHORE)二值信号量(BINARY_SEMAPHORE)任务等待信号量的方式先进先出(FIFO)顺序优先级(PRIORITY)顺序优先级反转问题的解决方法(只适用于互斥信号量)优先级继承算法(INHERIT_PRIORITY)优先级天花板算法(PRIORITY_CEILING),需给出所有可能获得此信号量的任务中优先级最高的任务的优先级。字笋漾透戳撞扼盈炔损掘壶口斩仕左票远蛀者隅棘黍织支仿徽瞳借碌紫沁05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信信号量的属性信号量的类型互斥信号量(MUTEX_SEMAPH40OS_EVENT*OSSemCreate(INT16Ucnt){ OS_EVENT*pevent; pevent=OSEventFreeList;//从空闲事件控制块链中取得一个ECB if(OSEventFreeList!=(OS_EVENT*)0){ OSEventFreeList=(OS_EVENT*)OSEventFreeList->OSEventPtr; } if(pevent!=(OS_EVENT*)0){//初始化ECB的各个域 pevent->OSEventType=OS_EVENT_TYPE_SEM;//事件类型为信号量 pevent->OSEventCnt=cnt;//信号量的初始计数值 pevent->OSEventPtr=(void*)0; OS_EventWaitListInit(pevent);//初始化等待任务列表 } return(pevent);//调用者需检查返回值,如果为NULL则表示建立失败}茎升洲份耿召女阂呻嘿很绳岭猿娩誓掇乌庚方釉椿拳撇鸣浅裹冷垒疟汀兑05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信OS_EVENT*OSSemCreate(INT16U416.2获取(申请)信号量功能:试图获得应用指定的信号量。if 信号量的值大于0then 将信号量的值减1else 根据接收信号量的选项,将任务放到等待队列中,或是直接返回菊刘具嫁赛蹄穆烤逛淘堤党攻分立企控驭踢酗慎呛衡乏憾眨悔旷蓝士骆纲05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信6.2获取(申请)信号量功能:试图获得应用指定的信号量。菊42当所申请的信号量不能被立即获得时,可以有以下几种选择:永远等待。不等待,立即返回,并返回一个错误状态码。指定等待时限(可有效避免死锁)。注意:不允许在ISR中选择等待。当任务选择等待时,将被按FIFO或优先级顺序放置在等待队列中。鲤鉴量日泽缘因沼噎即惨顷福赏跋觉听仪抗声扰慈摊罢猾吕痢朋河糖水湃05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信当所申请的信号量不能被立即获得时,可以有以下几种选择:鲤鉴量4344t0t0t1t2t3t4t5t6t7t8CriticalsectionguardedbyStimeτ1τ2t9t0t10t11t12t13t14t15t16t18t17假定在时间t1,任务T2获得信号量S2,进入临界区。在时间t3,任务T2又试图获得信号量S1,但一个高优先级任务T1在这个时候就绪,抢占任务T2并获得信号量S1,接下来任务T1又试图获得信号量S2。这样就出现了死锁现象。摹聂坝敦穆轻蜡拨皑孵埃骡慢雕诺何砚糟森歧煮穴鲤芦逻口洲肯彭立考奔05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信44t0t0t1t2t3t4t5t6t7t8Critical44如果任务等待一个使用优先级继承算法的互斥信号量,且它的优先级高于当前正占有此信号量的任务的优先级,那么占有信号量的任务将继承这个被阻塞的任务的优先级。如果任务成功地获得一个采用优先级天花板算法的互斥信号量,它的优先级又低于优先级天花板,那么它的优先级将被抬升至天花板。

唱唁孤莉派寨放嘿模矿休挪既奉桃距言捉扮要挂逞谈辑棚妹影滤七李坟二05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信如果任务等待一个使用优先级继承算法的互斥信号量,且它的优先级45voidOSSemPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err){ if(pevent->OSEventCnt>0){//信号量值大于0,成功获得信号量并返回 pevent->OSEventCnt--; *err=OS_NO_ERR; return;} OSTCBCur->OSTCBStat|=OS_STAT_SEM;//设置任务状态为等待信号量 OSTCBCur->OSTCBDly=timeout;//设置等待时限 OS_EventTaskWait(pevent);//将任务放置到信号量的等待列表中

OS_Sched();//内核实施任务调度,系统切换到另一就绪任务执行 if(OSTCBCur->OSTCBStat&OS_STAT_SEM){//判断任务恢复执行的原因,如果等待时限超时但仍然未获得信号量,则返回超时信息 OSEventTO(pevent); *err=OS_TIMEOUT; return;} OSTCBCur->OSTCBEventPtr=(OS_EVENT*)0; *err=OS_NO_ERR;//任务由于获得信号量而恢复执行,本调用成功返回}获取(等待)信号量彻驾历情都杉脾娄搐惑饼线骋卫饯赞京撂辙特瑰焚疟诱嘎坍技蜘棉启饭镰05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信voidOSSemPend(OS_EVENT*peve46INT16UOSSemAccept(OS_EVENT*pevent){ INT16Ucnt; cnt=pevent->OSEventCnt; if(cnt>0){ pevent->OSEventCnt--; } return(cnt);}注意:即使不能成功获得信号量(返回值为0),调用者也不会被阻塞。此函数可以在中断处理程序中使用。获取(无等待地请求)信号量魁仗渠堤坚山媳吊却迭介涧盗坠筹傈户冈股壮狗衍赊冀倪糊低腺神蕉梆课05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信INT16UOSSemAccept(OS_EVENT*476.3释放信号量功能:释放一个应用指定的信号量。if 没有任务等待这个信号量then 信号量的值加1else 将信号量分配给一个等待任务(将相应的任务移出等待队列,使其就绪)如果使用了优先级继承或优先级天花板算法:执行该功能(系统调用)的任务的优先级将恢复到原来的优先级。秽颁重什锅桐浙劳编稳迫秧黑云崇纺伊近勺仅皑纬豌束硫防滁则汛铝斯澄05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信6.3释放信号量功能:释放一个应用指定的信号量。秽颁重48INT8UOSSemPost(OS_EVENT*pevent){ if(pevent->OSEventGrp!=0x00){//如果有任务在等待该信号量 OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM);//使等待任务列表中优先级最高的任务就绪

OS_Sched();//内核实施任务调度 return(OS_NO_ERR);//成功返回 } if(pevent->OSEventCnt<65535){//如果没有任务等待该信号量,并且信号量的值未溢出 pevent->OSEventCnt++;//信号量的值加1 return(OS_NO_ERR);//成功返回 } return(OS_SEM_OVF);//信号量溢出}吐冠舅烟今劳瘦痴贮侄岂剪牢等础哥缀履氓讫卞暗扑覆吊夸获蒸擦敷记嚼05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信INT8UOSSemPost(OS_EVENT*pev496.4删除信号量功能:从系统中删除应用指定的一个信号量。内核动作:将信号量控制块返还给系统。删除信号量的不一定是创建信号量的任务。如果有任务正在等待获得该信号量:执行此功能将使所有等待这个信号量的任务回到就绪队列中。赊妹封出魁奉舀键蝴欢刃颅局辑意僳苦泅诛吧型季湿秉岸攘传汰仿佰岿测05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信6.4删除信号量功能:从系统中删除应用指定的一个信号量。赊50企图获取已删除的信号量将返回一个错误;互斥信号量:正被使用时(已经被某任务获取),不能删除它。因为该信号量正在保护一个共享资源或临界代码段,该动作可能造成数据崩溃或其他严重问题。甲帘们吧竹喇樊赂帕窜忱没炙腾心豺累癌蜀泌赴亢酥芝娱长讶赛朝袱伺茸05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信企图获取已删除的信号量将返回一个错误;甲帘们吧竹喇樊赂帕窜忱51OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8Uopt,INT8U*err){ BOOLEANtasks_waiting; if(pevent->OSEventGrp!=0x00{//根据是否有任务在等待信号量设置等待标志 tasks_waiting=TRUE; }else{ tasks_waiting=FALSE; } switch(opt){ caseOS_DEL_NO_PEND://如果有任务等待信号量则不删除信号量 if(task_waiting==FALSE{//没有任务等待,释放ECB回空闲链 pevent->OSEventType=OS_EVENT_TYPE_UNUSED; pevent->OSEventPtr=OSEventFreeList; OSEventFreeList=pevent;//调整空闲ECB链头指针 *err=OS_NO_ERR; return((OS_EVENT)0); }else{ *err=OS_ERR_TASK_WAITING;//有任务等待,删除信号量失败 return(pevent); }显驼的青倚厉斩瞧眠庭唬炳埃耙墒灶旗茂哑孕啡独搬榜祁牛收婚腻奴睛鼻05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信OS_EVENT*OSSemDel(OS_EVENT*p52 caseOS_DEL_ALWAYS://无论有无任务等待都删除信号量

//将等待列表中的每个任务都设置成就绪 while(pevent->OSEventGrp!=0x00){ OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM);}

//释放该信号量的ECB回空闲控制块链 pevent->OSEventType=OS_EVENT_TYPE_UNUSED; pevent->OSEventPtr=OSEventFreeList; OSEventFreeList=pevent;

//如果之前有任务等待信号量,内核实施任务调度 if(tasks_waiting==TRUE){OS_Sched();} *err=OS_NO_ERR; return((OS_EVENT*)0); default: *err=OS_ERR_INVALID_OPT; return(pevent); }}秦井蜕譬味因雁拙隘猪怎二你瑟异淡胯稳俭喘核荷巳造痛吹车泥烂趣咸果05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信 caseOS_DEL_ALWAYS://无论有无任务等53第三节

邮箱和消息队列1通信方式概述2消息队列机制的主要数据结构3典型的消息队列操作4消息队列的其他典型使用冲茅终艾差扑慑华橡巨琐卑骇苞害届妇近诊巡更逗圣扁逞胡醋翰丝阳痞引05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信第三节

邮箱和消息队列1通信方式概述冲茅终艾差扑慑华橡巨54任务间的通信方式直接通信。在通信过程中双方必须明确地知道(命名)彼此:send(P,message)–发送一个消息到任务P。receive(Q,message)–从任务Q接收一个消息。

间接通信。通信双方不需要指出消息的来源或去向,而通过中间机制来通信。如:send(A,message)–发送一个消息给邮箱A。receive(A,message)–从邮箱A接收一个消息。1通信方式概述描箍靠氟庄龄丸某敖益心溯悲嘿做僧床硝绣肩浇柱涤柳熊腋番帆操悍仓证05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信任务间的通信方式1通信方式概述描箍靠氟庄龄丸某敖益心溯悲嘿55消息队列:属于间接通信方式。消息:内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户定义。对消息内容的解释由应用完成。从操作系统观点看,消息没有定义的格式,所有的消息都是字节流,没有特定的含义。从应用观点看,根据应用定义的消息格式,消息被解释成特定的含义。应用可以只把消息当成一个标志,这时消息机制用于实现同步。沤日字考赚垦黎难塘厦衬铸斑训搂碎谨里贼值怪害瓦私宠陪县寨杰凭伟养05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信消息队列:属于间接通信方式。沤日字考赚垦黎难塘厦衬铸斑训搂碎56一些操作系统内核把消息进一步分为:邮箱:仅能存放单条消息,它提供了一种低开销的机制来传送信息。每个邮箱可以保存一条大小为若干个字节的消息。消息队列:可存放若干消息,提供了一种任务间缓冲通信的方法。消息机制可支持定长与可变长度两种模式的消息可变长度的消息队列需要对队列中的每一条消息增加额外的存储开销。鳞缎距穷恐匆吊豪籽滇琵足追眉杰篓炭瑟貌涨朵嫉氯笔康降悲朗缮莫方苗05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信一些操作系统内核把消息进一步分为:鳞缎距穷恐匆吊豪籽滇琵足追572消息队列机制的主要数据结构队列控制块队列长度QCB1队列名或IDTask3Task4……接收任务等待列表Task1Task2……发送任务等待列表最大消息长度QCB2……消息队列及其相关的参数和支持数据结构触徐函央清捻书赫弗垣挤敝猿搂署蛤钢成鹊范驹染韶误尔赢磕卖胺缨岁寸05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信2消息队列机制的主要数据结构队列控制块队列长度QCB1队列582.1消息队列状态图非空满队列创建消息数为0消息队列状态图消息发送消息数加1空消息发送消息数为1消息接收消息数为0消息接收消息数减1消息接收消息数减1消息发送消息数等于队列长度霓签署铡裔顽蠕湛雷糟支灭创滥将咆馏旋纵妇绑恒赦夯颊色胰仙剁资乐髓05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信2.1消息队列状态图非空满队列创建消息队列状态图消息发送空592.2消息队列机制的主要数据结构消息队列控制块管理所有创建的消息队列,系统运行时动态分配和回收消息队列控制块消息队列缓冲区存放发送到该队列的消息,接收者从缓冲区中取出消息。消息的发送或接收有两种方法:将数据从发送任务的空间完全拷贝到接收任务的空间中(效率较低,执行时间与消息大小有关)。只传递指向数据存储空间的指针(提高系统性能)。诞芥赠芥控拴虚啡窄茶律獭趁懈替铀费葡居灸滚突外汕耪募闽讳量试川陛05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信2.2消息队列机制的主要数据结构消息队列控制块诞芥赠芥控拴60SendingTaskReceivingTaskMessage1Message1Message1发送任务的内存区域消息队列的内存区域接收任务的内存区域1stcopy2ndcopy发送和接收消息的消息拷贝和内存使用这种消息传递方法效率低、占用空间大一种效率更高的方式是传递消息指针谭蛹搞财吴耪耸黄颓坍纲只革播宇函药窍狭葛默澎挎剥备袖爵廓慧裁伞涅05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信SendingTaskReceivingTaskMess61number_of_messagemax_message_countnumber_of_messagemax_message_sizewait_disciplinewait_queuequeue_startqueue_inqueue_outqueue_endmessagemessagemessagemessagemessagemessagemessagemessagemessagemax_message_count消息队列控制块消息队列缓冲区聊粟谊扰格瑟朝油效败坝宵释副猴感蓉尽睬倒嗜难嚎碍藤普尊睁倾张粕疵05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信number_of_messagemax_message_c62消息队列的环形缓冲max_message_countqueue_endqueue_startqueue_outnumber_of_messagequeue_in消息指针森奈硝榔甄渍肮土篓逻惠你侍懒骆说籍耀杏筋樊确岳永字障兹场入芽莽沾05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信消息队列的环形缓冲max_message_countqueu633典型的消息队列操作创建消息队列发送普通消息发送紧急消息发送广播消息接收消息删除消息队列获取有关消息队列的各种信息茶惑口镊哇铆焙欣僻掘谐柜豺茫挞浆盖矾薄彰场温助致淄稳台框氖幸聪镐05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信3典型的消息队列操作创建消息队列茶惑口镊哇铆焙欣僻掘谐柜豺643.1创建消息队列创建消息队列时,调用者可以指定如下参数:消息的最大长度。每个消息队列中最多的消息数。消息队列的属性。任务等待消息时的排队方式:FIFO或PRIORITY系统为新创建的消息队列分配唯一的ID。幻遮齿恢叠响留荧赢钡瑚拉翱少啡鹤悉操奥豪覆汇回累柒赛窿旅针情搬裤05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信3.1创建消息队列创建消息队列时,调用者可以指定如下参数:653.2发送消息根据紧急程度的不同,消息通常可分为普通消息与紧急消息。如果有任务正在等待消息(即消息队列为空),则普通消息发送和紧急消息发送的执行效果是一样的。任务从等待队列移到就绪队列中,消息被拷贝到任务提供的缓冲区中。如果没有任务等待:发送普通消息将消息放在队列尾发送紧急消息将消息放在队列头统捌鸦秤鱼皑摄焉英毕匣惦氢识蜗窖胸砖洽匣权虫茁头寨引婶运泊协锐吓05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信3.2发送消息根据紧急程度的不同,消息通常可分为普通消息与66Msg3接收任务等待列表Msg2Msg1消息队列发送普通消息-先进先出(FIFO)次序Msg3接收任务等待列表Msg2Msg1消息队列发送紧急消息-后进先出(LIFO)次序鞠氦顽音归愉放械智悔闪吟搜蹦忿淑笺鞠粹某箭误安亨蕾反前危闪敬涛酥05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信Msg3接收任务Msg2Msg1消息队列发送普通消息-67如果发送消息时队列已被填满,则不同的操作系统可能采取不同的处理办法:挂起试图向已满的消息队列中发送消息的任务(不适用于中断服务程序)。简单地丢弃该条消息并向调用者返回错误信息。广播消息在此之前所有试图从队列中接收消息的任务此时都将获得相同的消息。该功能拷贝消息到各任务的消息缓冲中,并唤醒所有的等待任务。喘劳熬锤萤驾驱韵郝重盟懂掷诣浇骂汲悟想狮螟嘉耀螺莉置末尺趾泥侣载05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信如果发送消息时队列已被填满,则不同的操作系统可能采取不同的处683.3接收消息如果指定的消息队列中有消息,则将其中的第一条消息拷贝到调用者的缓冲区,并从消息队列中删除它。如果此时消息队列中没有消息,则可能出现以下几种情况:永远等待消息的到达:等待消息的任务按FIFO或优先级高低顺序排列在等待队列中。等待消息且指定等待时限:等待消息的任务按FIFO或优先级高低顺序排列在等待队列中。不等待,强制立即返回。任脚甫烫挑丛滇伙拥教惊即唱有狐僧颁夷夕撩断售籽幕纵戏八寡董猾冻峰05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信3.3接收消息如果指定的消息队列中有消息,则将其中的第一条69限时等待可有效预防死锁。中断服务程序接收消息时必须选择不等待,因为中断服务程序是不能被阻塞的。如果消息队列被应用删除,则所有等待该消息队列的任务都被返回一个错误信息,并回复到就绪状态。蝴湃絮差宵捡菱冈芹呢放凑寐篙尉耕践荆蔼篓塞楼蹬程枣庞素膨腰账巳餐05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信限时等待可有效预防死锁。蝴湃絮差宵捡菱冈芹呢放凑寐篙尉耕践荆70Task4High消息队列接收任务等待列表任务等待列表-基于优先级的次序Task2mediumTask3mediumTask1LowTask4High消息队列接收任务等待列表任务等待列表-先进先出(FIFO)次序Task2mediumTask3mediumTask1Low瘟畔匠磐凳状乍扩荤停线讳肯罚叮砍渣混炎典乏糠瓤贞起儿耍太差仇把棘05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信Task4消息队列接收任务等待列表任务等待列表-基于Tas713.4删除消息队列从系统中删除指定的消息队列,释放消息队列控制块及消息队列缓冲区。任何知道此消息队列ID号的代码都可以删除它。消息队列被删除后,所有等待从这个消息队列接收消息的任务都回到就绪态。遍见馅衡龋唁亥揣破戮宜捏槐汀没锑秃佛褒柞翘嫁俘癣停毁并贺菏粟痈咐05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信3.4删除消息队列从系统中删除指定的消息队列,释放消息队列724消息队列的其他典型使用紧耦合的单向数据通信:发送任务发送消息后要求一个响应信号,表明接收任务已经成功接收到消息。Task1Task2

及座夜仓姥唐凋思戒惶转慑百钦荒擦裹剑榜锻咒酚或僚闻话昼敬鸥锥恃唬05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信4消息队列的其他典型使用紧耦合的单向数据通信:发送任务发送73紧耦合的双向数据通信:如果数据需要在任务之间双向流动,则可以采用紧耦合的双向数据通信模式(也称为全双工通信)。Task1Task2聊蛋呸煌彭暮冤廉洞霄出鞠森苗吟鲜涟橱袒要错券龚妓酗程堂找稗排队溶05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信紧耦合的双向数据通信:如果数据需要在任务之间双向流动,则可74第四节

事件1概述2事件机制的主要数据结构3典型的事件操作4事件机制的典型应用哀宴紫莉解泻坏乖靴眨牙艇钢鸳翁照庚当赫录赖储七闺例偏戎厢借娜嚷大05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信第四节

事件1概述哀宴紫莉解泻坏乖靴眨牙艇钢鸳翁照庚当赫75事件是指一种表明预先定义的系统事件已经发生的机制。用于任务与任务之间、任务与ISR之间的同步。主要的特点是可实现一对多的同步。

一个事件就是一个标志,不具备其它信息。一个或多个事件构成一个事件集。事件集可以用一个指定长度的变量(比如一个8bit,16bit或32bit的无符号整型变量,不同的操作系统其具体实现不一样)来表示,而每个事件由在事件集变量中的某一位来代表。1概述胃簿钵缓擒融搞恼浆疏燥周诽严饱甩掣壕趋屠思劈植密果澄寺主簧促闺褂05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信事件是指一种表明预先定义的系统事件已经发生的机制。1概述胃76事件及事件集有以下特点:事件间相互独立。事件仅用于同步,不提供数据传输功能。事件无队列多次发送同一事件,在未经过任何处理的情况下,其效果等同于只发送一次。事件机制的意义在于:当某任务要与多个任务或中断服务同步时,就需要使用事件机制。若任务需要与一组事件中的任意一个发生同步,可称为独立型同步(逻辑“或”关系)。任务也可以等待若干事件都发生时才同步,称为关联型同步(逻辑“与”关系)。照柠脸智靠糙积恕壮骇殖炬毫卑犀歹猖扒恃乏斑趁宦冉维娶疟歧逢霜峨群05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信事件及事件集有以下特点:照柠脸智靠糙积恕壮骇殖炬毫卑犀歹猖77“或”同步和“与”同步任务任务任务任务ISRISRORAND“与”型同步“或”型同步事件集事件集POSTPOSTPENDPEND赴平趾酵俺步础瘤体类末倔梁隔雪拥差淡峡轿檄傲垂刹介渴岿苇嗅裔菜慎05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信“或”同步和“与”同步任务任务任务任务ISRISRORAND78用多个事件的组合发信号给多个任务任务任务任务ISRORAND事件集事件集事件集(8,16或32位)POSTPENDPEND拣夯医雌盔幽尝伪嗓纽趟勋并将罗晾猫焙奥剑庶菜蹦彪葬并宰格爱革帧真05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信用多个事件的组合发信号给多个任务任务任务任务ISRORAND79术语:发送事件集。指在一次发送过程中发往接收者(比如任务)的一个或多个事件的组合。待处理事件集。指已被发送到一个接收者,正在等待处理的所有事件的集合。事件条件“或”同步:待处理事件集只要包括等待的任一事件即可满足要求;“与”同步:待处理事件集必须包括等待的全部事件方可满足要求。闹印窒逗萄梨颗测衷烽乔厉硬候段厕本瘴氓腥年计短论残疑邪旦蝶搓菇吹05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信术语:闹印窒逗萄梨颗测衷烽乔厉硬候段厕本瘴氓腥年计短论残疑邪802事件机制的主要数据结构事件集控制块:管理所有创建的事件集或者事件集附属于任务,不需创建,其相关参数成为任务控制块的一部分。络栓霖给涕喉矗颓洼陷溶洋否窖豫反施杖文肺基踏钥撰搞必耐穷灶迂横班05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信2事件机制的主要数据结构事件集控制块:管理所有创建的事件集81事件的内部实现机制实例说明-µC/OS-II事件标志组数据结构typedefstruct{ INT8U OSFlagType;//指示本数据结构的类型 void *OSFlagWaitList;//等待事件标志的任务链表 OS_FLAGS OSFlagFlags;//各事件标志的当前状态}OS_FLAG_GRP;事件标志节点数据结构typedefstruct{ void *OSFlagNodeNext;//后驱指针 void *OSFlagNodePrev;//前驱指针 void *OSFlagNodeTCB;//任务控制块指针 void *OSFlagNodeFlagGrp;//指回OS_FLAG_GRP结构 OS_FLAGS OSFlagNodeFlags;//所等待的事件标志组合 INT8U OSFlagNodeWaitType;//等待类型(与、或)}OS_FLAG_NODE;钎盯晨陕陆结侦逐业即渍瞬毛涅秘官眨埋伏棒测荡钓营靴停侩她钧狞锈殷05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信事件的内部实现机制实例说明-µC/OS-II事件标志组数据结82事件标志组、事件标志节点及任务控制块之间的关系OS_FLAG_GRPOS_FLAG_NODE.OSTCBFlagNodeFlagGrp.OSFlagNodeFlags.OSFlagNodeWaitType.OSFlagNodeNext.OSFlagNodePrev.OSFlagNodeTCB.OSFlagWaitList.OSFlagFlags.OSFlagTypeANDorORANDorORANDorOROS_EVENT_TYPE_FLAG00.OSTCBFlagNodeOS_TCB叉亡将属非到挛沧溉成掖府轿牡楼趁懈蹬二捂筐腰赡尿赠闻仁膀内乞忍怜05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信事件标志组、事件标志节点及任务控制块之间的关系OS_FLAG833典型的事件操作创建事件集删除事件集发送事件(集)接收事件(集)获取有关事件集的各种信息疥玫距蓝拭并痉命州夹会闻构艺刘调类沈咏亩庞头傀没簇欲调逸蔼专旭祥05嵌入式系统开发-Chapter6-同步、互斥与通信05嵌入式系统开发-Chapter6-同步、互斥与通信3典型的事件操作创建事件集疥玫距蓝拭并痉命州夹会闻构艺刘调843.1创建事件集申请空闲事件集控制块,设置事件集属性,初始化控制块中的域,分配ID号。弓肉擒尺胆卒忠岸巫溜庄蜗小央忌拎望案快送亩学斋讼崇级历唯精迂霞锯05嵌入式

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论