
第八讲任务同步与通信.ppt
47页《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》届吴窥刀兵甸盟湖肿阶擦各咯龄吮青隔涉窍瞧梯瑞滔熊惟魏重痢丘季那膨第八讲任务同步与通信第八讲任务同步与通信第八讲(4) 任务同步与通信授课教师:李英祥电邮地址:drliyingxiang@剿瀑醒劳佐尤堂个红召谰疼论跺坊蛹磋墓缘懈思护獭坏善扁蛮陇旺冻距会第八讲任务同步与通信第八讲任务同步与通信《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》主要内容w1. 事件控制块ECB w2. 信号量 w3. 邮箱w4. 消息队列 混港私滁嗣朴诅脓冲郡豫饮翼鸡阎诸辽壕拾秦嗅钒痪跺虏紫纺狈指误驻椽第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》1. 事件控制块ECBw事件控制块ECBw初始化一个ECB块 OSEVENTWAITLISTINIT()w使一个任务进入就绪状态 OSEVENTTASKRDY()w使一个任务进入等待状态 OSEVENTTASKWAIT()w由于等待超时将一个任务置为就绪状态 OSEVENTTO()厘粗哦厉惦苟裔试首冗鞘搔浚厩楞情屁沃肛范围科殿亢谴溉撂披处沸摇娜第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》事件控制块ECBwµC/OS-II通过定义的OS_EVENT数据结构(事件控制块ECB)来维护一个事件控制块的所有信息;w该结构中除了包含了:Ø事件本身的定义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等;Ø等待该事件的所有任务的列表;柑书元涧磕有捕哉扫汛帽僵祈庐酷捐汽粪囤疚耶宝疲域帝译方眨抵釜沙蒜第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》wOSEventType定义了事件的具体类型,可以是:Ø信号量(OS_EVENT_SEM);Ø邮箱(OS_EVENT_TYPE_MBOX);Ø或消息队列(OS_EVENT_TYPE_Q)中的一种; 组具信磅欲盂叮火锻呛掉界窿犹穗乞夷佩俯川嫂它惑操区谋扦茅觅诡迷斧第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》 与任务就绪列表类似!等待事件任务列表等待事件任务列表 竣侮谜扫窖丧该略占隅慌伙铀嘿壹签抑乒岛矗簧穴渴荧滇哟释癣枉裕迹功第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》w事件控制块的总数由用户所需要的信号量、邮箱和消息队列的总数决定;w该值由OS_CFG.H 中的#define OS_MAX_EVENTS定义;w在调用OSInit()时,所有事件控制块被链接成一个单向链表——空闲事件控制块链表;w每当建立一个信号量、邮箱或者消息队列时,就从该链表中取出一个空闲事件控制块,并对它进行初始化;w因为信号量、邮箱和消息队列一旦建立就不能删除,所以事件控制块也不能放回到空闲事件控制块链表中; 照奋洗肋娥吗瞥辽骗冒烂榔驼拇京坦搁叼汗槛憾鳖褒掠梦卤痞芍店佣说姬第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》今毫幼郎灭扑蜂总集捶盅葡奴捡剥宗馆式铬熟题篙隐篱凝舵柒皖昏嘘赫佬第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》w对于事件控制块进行的一些通用操作包括:Ø初始化一个事件控制块Ø使一个任务进入就绪态Ø使一个任务进入等待该事件的状态Ø因为等待超时而使一个任务进入就绪态wµC/OS-II将上面的操作用4个系统函数实现,它们是:ØOSEventWaitListInit()ØOSEventTaskRdy()ØOSEventWait()ØOSEventTO()党申操督姓圆钾胯袋腕仍坍抵涛京攻渣隧洁敏及峻短乖凯翠萌磷孟饰余珍第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》初始化一个事件控制块OSEventWaitListInit()w当建立一个信号量、邮箱或者消息队列时,相应的建立函数OSSemCreate(),OSMboxCreate(),或者OSQCreate()通过调用OSEventWaitListInit()对事件控制块中的等待任务列表进行初始化;w该函数的调用参数只有一个,就是指向需要初始化的事件控制块的指针pevent。
弊见寅驻邹斋班允进畴钩寻煌柠糙誉摆赚司踞馈涕傲哀便疑俏嘛伟逝立茁第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》使一个任务进入就绪态OSEventTaskRdy()w当发生了某个事件,该事件对应的OSSemPost(),OSMboxPost(),OSQPost(),和OSQPostFront()函数调用OSEventTaskRdy();w该函数从等待任务队列中删除HPT任务(Highest Priority Task),并把该任务置于就绪态;续称岁危破糠忙碟潦月嗡烙动疽庶号笨吱痕抗诸也车解般政驰嚷耪寡蓝举第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》使一个任务进入等待某事件发生状态 OSEventTaskWait()w当某个任务要等待一个事件的发生时,相应事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用该函数OSEventTaskWait();w该函数将当前任务从就绪任务表中删除,并放到相应事件的事件控制块的等待任务表中; 叠副肠祟鞭砾堑六羞涅备磺腾柒矿唁赂豹鞍塞艾质膏尉导嚏蜕囚天梦摹涟第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》等待超时而将任务置为就绪态 OSEventTO()w当在预先指定的时间内任务等待的事件没有发生时,OSTimeTick()函数会因为等待超时而将任务的状态置为就绪;w在这种情况下,事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用OSEventTO()来完成这项工作;w该函数负责从事件控制块中的等待任务列表里将任务删除,并把它置成就绪状态;嗅昧犊辙苍睁火罚腋屁藩祝石来爽垄穗捎非奠茎吮绵丘人晒谅奏颂剩藻柱第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》w信号量w建立信号量OSSemCreate() w等待信号量 OSSemPend() w发送信号量 OSSemPost() w无等待地请求信号量 OSSemAccept() w查询信号量的当前状态 OSSemQuery()2. 信号量橱瓜皋阉撮汰理毗普欠贸蔷绪彦同榆虫匙联甥缺哆绅或锗旅靛迈谨思蝎听第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》wµC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表 ;w如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。
最后,如果该信号量是用来表示允许任务访问n个相同的资源,那么该初始值显然应该是n,并把该信号量作为一个可计数的信号量使用;萤册旺扑攒删宾它升惜市昧徊挂览断掳显馅谍储列串疑广暑驾侥蠕吭蹋必第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》wµC/OS-II提供了5个对信号量进行操作的函数:OSSemCreate(),OSSemPend(),OSSemPost(),OSSemAccept()和OSSemQuery() 铆洋淡罚秧周昌巩巾讳世奉哑乍肛花醉秉稽华能孜蒜稼酶铬涂援症辨番懈第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》建立信号量OSSemCreate() wOSSemCreate()函数建立并初始化一个信号量信号量的作用如下:Ø允许一个任务和其他任务或者中断同步Ø取得设备的使用权Ø标志事件的发生w参数参数wvalue 参数是建立的信号量的初始值,可以取0到65535之间的任何值w返回值返回值 OSSemCreate()返回给调用函数一个指向任务控制块的指针。
如果没有可用的事件控制块,OSSemCreate()函数返回空指针 膨蚀止衣牟筏具淡晨躯磕竭阵昂照耘绣诸鲍实鲤吭大霞吁黍篷爷宁酣棺历第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》等待信号量 OSSemPend() wOSSemPend()函数用于任务试图取得设备的使用权w如果任务调用OSSemPend()函数时,信号量的值大于零,OSSemPend()函数递减该值并返回该值如果调用时信号量等于零,OSSemPend()函数将任务加入该信号量的等待队列OSSemPend()函数挂起当前任务直到其他的任务或中断置起信号量或超出等待的预期时间w如果在预期的时钟节拍内信号量被置起,μC/OS-Ⅱ默认最高优先级的任务取得信号量恢复执行一个被OSTaskSuspend()函数挂起的任务也可以接受信号量,但这个任务将一直保持挂起状态直到通过调用OSTaskResume()函数恢复任务的运行爆诈狈溃塘搅岛囊载族姓枪北抛扛堰铝笔踌仰葛诧重玉测筏铬犹裴豺孙商第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》w参数参数Øpevent 是指向信号量的指针。
该指针的值在建立该信号量时可以得到参考OSSemCreate()函数)ØTimeout 允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的信号量时恢复运行状态如果该值为零表示任务将持续的等待信号量最大的等待时间为65535个时钟节拍这个时间长度并不是非常严格的,可能存在一个时钟节拍的误差,因为只有在一个时钟节拍结束后才会减少定义的等待超时时钟节拍wErr 是指向包含错误码的变量的指针OSSemPend()函数返回的错误码可能为下述几种:ØOS_NO_ERR :信号量不为零ØOS_TIMEOUT :信号量没有在指定的周期数内置起ØOS_ERR_PEND_ISR :从中断调用该函数虽然规定了不允许从中断调用该函数,但μC/OS-Ⅱ仍然包含了检测这种情况的功能ØOS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针;吟赣册氯媒暮祸捎淘饯迅灿语吧丑虐讳嚣悟添喷购吠排祷层改寿亦啥耍桔第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》瘟自粹勿延抹半旧价检叙嘱背畅雇迪累娘铭荷牡亦邑铅即咋逃婿卡坯揉饶第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》发送信号量 OSSemPost() wOSSemPost()函数置起指定的信号量:Ø如果指定的信号量是零或大于零,OSSemPost()函数递增该信号量并返回。
Ø如果有任何任务在等待信号量,最高优先级的任务将得到信号量并进入就绪状态w参数参数Øpevent 是指向信号量的指针该指针的值在建立该信号量时可以得到w返回值返回值ØOSSemPost()函数的返回值为下述之一:ØOS_NO_ERR :信号量成功的置起ØOS_SEM_OVF :信号量的值溢出ØOS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针 泥译龚联惟泣苗皇会裴察轮抡郧忘改纲郊酞赛憨猾锦蛛扣洽贱棱附坚盯倦第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》无等待地请求信号量 OSSemAccept() w当一个任务请求一个信号量时,如果该信号量暂时无效,也可以让该任务简单地返回,而不是进入睡眠等待状态,这种情况下的操作是由OSSemAccept()函数完成的 ;w参数参数Øpevent 是指向需要查询的设备的信号量;w返回值返回值Ø当调用OSSemAccept()函数时,设备信号量的值大于零,说明设备就绪,这个值被返回调用者,设备信号量的值减一;Ø当调用OSSemAccept()函数时,设备信号量的值等于零,说明设备没有就绪,返回零;也昔俐瘫舱傈穆怪谦艾砍补奋橙西细拖汞旦科云甄攀否茶厂胺类葱碎越蜡第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》查询信号量的当前状态 OSSemQuery()wOSSemQuery()函数用于获取某个信号量的信息:可以得知是否有,以及有多少任务位于信号量的任务等待队列中;w使用OSSemQuery()之前,应用程序需要先创立类型为OS_SEM_DATA的数据结构,用来保存从信号量的事件控制块中取得的数据;w参数参数Øpevent是一个指向信号量的指针。
该指针在信号量建立后返回调用程序;ØPdata是一个指向数据结构OS_SEM_DATA的指针;w返回值返回值 OSSemQuery()函数有下述两个返回值:ØOS_NO_ERR 表示调用成功ØOS_ERR_EVENT_TYPE 表示未向信号量传递指针 伪梗川列腾庚壕丸碌舰焰瓜痴臂口觅诅桌腐威假脚叭离哮坚峙饥甄赵表传第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》2. 邮箱w邮箱w建立一个邮箱OSMboxCreate()w等待一个邮箱中的消息OSMboxPend()w发送一个消息到邮箱中OSMboxPost()w无等待地从邮箱中得到一个消息OSMboxAccept()w查询一个邮箱的状态OSMboxQuery()帝姿寄平寐硕狂逻陡烟浑哨曼了覆盅枚浩柳缕劲纲拴颧换筷州牙茁傲摘臣第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》邮箱w邮箱是µC/OS-II中另一种通讯机制;w它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量;w该指针指向一个包含了特定“消息”的数据结构; wµC/OS-II提供了5种对邮箱的操作:ØOSMboxCreate()ØOSMboxPend()ØOSMboxPost()ØOSMboxAccept()ØOSMboxQuery() 俊势灰章倔回坠彼龋希脓向汹燎懒叙任获圆想鹤田旱斋报钾迂芽轨沁秤闸第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》建立一个邮箱OSMboxCreate()wOSMboxCreate()建立并初始化一个消息邮箱,消息邮箱允许任务或中断向其他一个或几个任务发送消息w参数参数Ømsg 参数用来初始化建立的消息邮箱。
如果该指针不为空,建立的消息邮箱将含有消息w返回值返回值Ø指向分配给所建立的消息邮箱的事件控制块的指针如果没有可用的事件控制块,返回空指针 采淄安湃过嘻均荣丝坷钡郑竖色全体赦晤股达启仅羊旨俘卒顿嘴名靴迫协第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》坍迂拉遮忘妹郁庙碰搅滑硷凝霖役宗着僻龟蝎街包炕靡撅券忘刨绚采肆瞳第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》唬洁峨痉冈袭鹰冯拙攒代扦眺胶铅涵渤褥偶雌孺刨扬稚违捕貌袄良指联莎第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》等待一个邮箱中的消息OSMboxPend()wOSMboxPend()用于任务等待消息消息通过中断或另外的任务发送给需要的任务消息是一个以指针定义的变量,在不同的程序中消息的使用也可能不同如果调用OSMboxPend()函数时消息邮箱已经存在需要的消息,那么该消息被返回给OSMboxPend()的调用者,消息邮箱中清除该消息。
如果调用OSMboxPend()函数时消息邮箱中没有需要的消息,OSMboxPend()函数挂起当前任务直到得到需要的消息或超出定义等待超时的时间如果同时有多个任务等待同一个消息,μC/OS-Ⅱ默认最高优先级的任务取得消息并且任务恢复执行一个由OSTaskSuspend()函数挂起的任务也可以接受消息,但这个任务将一直保持挂起状态直到通过调用OSTaskResume()函数恢复任务的运行 惠翅榔衡敢澳傈阁嘱迷挨婶芳靖津中撑奖位懊厦包盾酝敞挥泉捣俺铆薄韭第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》w参数参数Øpevent 是指向即将接受消息的消息邮箱的指针该指针的值在建立该消息邮箱时可以得到;ØTimeout 允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的消息时恢复运行如果该值为零表示任务将持续的等待消息;wErr 是指向包含错误码的变量的指针;w返回值返回值ØOSMboxPend()函数返回接受的消息并将 *err置为OS_NO_ERR;Ø如果在指定数目的时钟节拍内没有接受到需要的消息,OSMboxPend()函数返回空指针并且将 *err设置为OS_TIMEOUT。
埔唬嗓脆原屋边淘倔陡魄誉供墩象疥宗枯觉啸舟赏叫咐蛮伟勋习杉险艺樱第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》发送一个消息到邮箱中OSMboxPost()wOSMboxPost()函数通过消息邮箱向任务发送消息如果消息邮箱中已经存在消息,返回错误码说明消息邮箱已满OSMboxPost()函数立即返回调用者,消息也没有能够发到消息邮箱如果有多个任务在等待消息邮箱的消息,最高优先级的任务将得到这个消息w参数参数Øpevent 是指向即将接受消息的消息邮箱的指针ØMsg 是即将实际发送给任务的消息消息是一个指针长度的变量,在不同的程序中消息的使用也可能不同不允许传递一个空指针,因为这意味着消息邮箱为空w返回值返回值ØOS_NO_ERR :消息成功的放到消息邮箱中ØOS_MBOX_FULL :消息邮箱已经包含了其他消息,不空ØOS_ERR_EVENT_TYPE :pevent 不是指向消息邮箱的指针 悬膳花竿铂基稳慑宇仇疮蒸叶唉春菲挖誓翼才图翠叙康搔胜楼暂扮钮箔倦第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》无等待地从邮箱中得到一个消息OSMboxAccept()wOSMboxAccept()函数查看指定的消息邮箱是否有需要的消息。
不同于OSMboxPend()函数,如果没有需要的消息,OSMboxAccept()函数并不挂起任务如果消息已经到达,该消息被传递到用户任务并且从消息邮箱中清除参数参数wpevent 是指向需要查看的消息邮箱的指针w返回值返回值w如果消息已经到达,返回指向该消息的指针;如果消息邮箱没有消息,返回空指针挣赴秃舀吴踌倍病鸯昆犬脏耍精虎假湛削傻旅肛洪肢请搜泛叹逢籽勉枣湘第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》查询一个邮箱的状态OSMboxQuery()wOS_MBOX.C任务或中断OS_MBOX_ENOSMboxQuery()函数用来取得消息邮箱的信息用户程序必须分配一个OS_MBOX_DATA的数据结构,该结构用来从消息邮箱的事件控制块接受数据w通过调用OSMboxQuery()函数可以知道任务是否在等待消息以及有多少个任务在等待消息,还可以检查消息邮箱现在的消息w参数参数wpevent 是指向即将接受消息的消息邮箱的指针wPdata 是指向OS_MBOX_DATA数据结构的指针,该数据结构包含下述成员:wVoid *OSMsg;/* 消息邮箱中消息的复制 */wINT8U OSEventTbl[OS_EVENT_TBL_SIZE];/*消息邮箱等待队列的复制*/wINT8U OSEventGrp;w返回值返回值wOS_NO_ERR :调用成功wOS_ERR_EVENT_TYPE :pevent 不是指向消息邮箱的指针。
鞠义怜扣溅癣赢讨琳灵笑盂叠诈丸撂幸捞跪接底辙帽燥婿宦饥跃雀撬讣又第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》3.消息队列 w消息队列w建立一个消息队列OSQCreate()w等待一个消息队列中的消息OSQPend()w向消息队列发送一个消息(FIFO)OSQPost()w向消息队列发送一个消息(LIFO)OSQPostFront()w无等待地从一个消息队列中取得消息 OSQAccept()w清空一个消息队列 OSQFlush()w查询一个消息队列的状态OSuery()勘捅颧沟问澈扦悦久而媳硼亏捆原潞憎秆舅麓北耙普矽螺自瞻玫婶梧杀驾第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》消息队列w消息队列是µC/OS-II中的一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量wµC/OS-II提供了7个对消息队列进行操作的函数:OSQCreate(),OSQPend(),OSQPost(),OSQPostFront(),OSQAccept(),OSQFlush()和OSuery()函数。
让噶凸街铬煞炊蝶唱猴猫峨醛隐乎拣棠鲍终吃倾等苦访窜精挨秤溉娃览豢第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》请沛筏紫颁洪真励游虞糯堰恍釉猩捣李炎邓法绅辰暇峭绊西罗厦煮锣邓特第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》w实际上,我们可以将消息队列看作时多个邮箱组成的数组,只是它们共用一个等待任务列表每个指针所指向的数据结构是由具体的应用程序决定的N代表了消息队列中的总单元数 疲精语仙检搬匆育匀拧识翔蓖雀靶詹敌嚏治潜袄冗湿故资武葬粤关橙赣领第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》踞汀单镀忧抗桓番哄蕉笼莎驰仑碉般哦饰艺鲁茸烫兄九蚁描抱遗藏找秦骇第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》wµC/OS-II在初始化时建立一个空闲的队列控制块链表,如图 F6.9所示 酷胎倾衡寒闰喊窖骇洼竟颂亢粱声龋嫁箔呀袭归悯漫掉呵盒役坍案世稽部第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》建立一个消息队列OSQCreate()wOSQCreate()函数建立一个消息队列。
任务或中断可以通过消息队列向其他一个或多个任务发送消息消息的含义是和具体的应用密切相关的w参数参数Østart 是消息内存区的基地址,消息内存区是一个指针数组ØSize 是消息内存区的大小w返回值返回值Ø返回一个指向消息队列事件控制块的指针如果没有空余的事件空闲块,返回空指针 翼炮协比衙拙全带贡河偷凰悄穆蜡治灶酗栖沈亮佑套铜茂筏霍曹弄吧舌班第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》等待一个消息队列中的消息OSQPend()wOSQPend()函数用于任务等待消息w如果调用OSQPend()函数时队列中已经存在需要的消息,那么该消息被返回给OSQPend()函数的调用者,队列中清除该消息w如果调用OSQPend()函数时队列中没有需要的消息,OSQPend()函数挂起当前任务直到得到需要的消息或超出定义的超时时间w如果同时有多个任务等待同一个消息,μC/OS-Ⅱ默认最高优先级的任务取得消息并且任务恢复执行w一个由OSTaskSuspend()函数挂起的任务也可以接受消息,但这个任务将一直保持挂起状态直到通过调用OSTaskResume()函数恢复任务的运行。
姥岭己举排衬芥汀擅庸主贰伪惶却归酱挡碟汛县聂厢混舰细翔滔既杯嘱拙第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》w参数参数Øpevent 是指向即将接受消息的队列的指针该指针的值在建立该队列时可以得到ØTimeout 允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的消息时恢复运行状态如果该值为零表示任务将持续的等待消息ØErr 是指向包含错误码的变量的指针OSQPend()函数返回的错误码可能为下述几种:wOS_NO_ERR :消息被正确的接受wOS_TIMEOUT :消息没有在指定的周期数内送到wOS_ERR_PEND_ISR :从中断调用该函数虽然规定了不允许从中断调用该函数,但μC/OS-Ⅱ仍然包含了检测这种情况的功能wOS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针w返回值返回值ØOSQPend()返回接受的消息并将 *err置为OS_NO_ERR如果没有在指定数目的时钟节拍内接受到需要的消息,返回空指针并且将 *err设置为OS_TIMEOUT 呢刨炒塌蛔雷侮芭涤钡爽垛狰地商夜贪框烈膝徒负腑康辜风竹善鲤拾博柬第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》向消息队列发送一个消息(FIFO)OSQPost()wOSQPost()函数通过消息队列向任务发送消息。
w如果队列中已经存满消息,返回错误码OSQPost()函数立即返回调用者,消息也没有能够发到队列w如果有任何任务在等待队列中的消息,最高优先级的任务将得到这个消息w如果等待消息的任务优先级比发送消息的任务优先级高,那么高优先级的任务将得到消息而恢复执行,也就是说,发生了一次任务切换w消息队列是先入先出(FIFO)机制的,先进入队列的消息先被传递给任务w参数参数Øpevent 是指向即将接受消息的消息队列的指针ØMsg 是即将实际发送给任务的消息w返回值返回值ØOS_NO_ERR :消息成功的放到消息队列中ØOS_MBOX_FULL :消息队列已满ØOS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针 悼杯日裔胚媚澜抚酉簇例肿幂义遭跪缺吞莎逢东汰焕并更和掀园咎甥谁勿第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》向消息队列发送一个消息(LIFO)OSQPostFront()wOSQPostFront()函数通过消息队列向任务发送消息wOSQPostFront()函数和OSQPost()函数非常相似,不同之处在于OSQPostFront()函数将发送的消息插到消息队列的最前端。
w也就是说,OSQPostFront()函数使得消息队列按照后入先出(LIFO)的方式工作,而不是先入先出(FIFO) 临细歧冷祭两猴及岂您凌炒鹤床亩常津锑祁绿庞诽仲友段款软类胖作煞抚第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》无等待地从一个消息队列中取得消息 OSQAccept()wOSQAccept()函数检查消息队列中是否已经有需要的消息w不同于OSQPend()函数,如果没有需要的消息,OSQAccept()函数并不挂起任务如果消息已经到达,该消息被传递到用户任务w参数参数Øpevent 是指向需要查看的消息队列的指针w返回值返回值Ø如果消息已经到达,返回指向该消息的指针;如果消息队列没有消息,返回空指针 蛊智帝孺捆吏勤罐素堡押烙粒洱淹芯将怪晌恳肄涝酪出娇沪副果灼知蜜曾第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》清空一个消息队列 OSQFlush()wOSQFlush()函数清空消息队列并且忽略发送往队列的所有消息不管队列中是否有消息,这个函数的执行时间都是相同的。
w参数参数Øpevent 是指向消息队列的指针w返回值返回值ØOS_NO_ERR :消息队列被成功清空ØOS_ERR_EVENT_TYPE :试图清除不是消息队列的对象供仆窟暗感侗羊戴辗裳疯窗夜堑暮哺挝季舟培姬雁唉船激斗酌臀酌痊畴锁第八讲任务同步与通信第八讲任务同步与通信7/21/《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》《嵌入式系统设计》查询一个消息队列的状态OSuery()wOSuery()函数用来取得消息队列的信息用户程序必须建立一个OS_Q_DATA的数据结构,用来保存从消息队列的事件控制块得到的数据w通过调用OSuery()函数可以知道任务是否在等待消息、有多少个任务在等待消息、队列中有多少消息以及消息队列可以容纳的消息数w参数参数Øpevent 是指向即将接受消息的消息邮箱的指针该指针的值在建立该消息邮箱时可以得到参考OSQCreate()函数)ØPdata 是指向OS_Q_DATA数据结构的指针;w返回值返回值ØOS_NO_ERR :调用成功ØOS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针 脉烂旗挚帖脯云淀堤晕错好皖甲扒茄决韩社葡仇泞粉瀑闺舟拥演丧儒媚技第八讲任务同步与通信第八讲任务同步与通信7/21/。






![河南新冠肺炎文件-豫建科[2020]63号+豫建科〔2019〕282号](http://img.jinchutou.com/static_www/Images/s.gif)





