- 1、本文档共71页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章 消息 本章主要讨论消息邮箱和消息队列 要求掌握消息邮箱和消息队列的概念、功能和差别,重点掌握各种函数的调用方法。 6.1 消息邮箱管理 6.1.1 概述 邮箱是一种通信机制,它能使任务或中断服务向另一个任务发送一个指针型的变量,这个指针指向一个包含指定“消息”的数据结构。邮箱发送的不是消息本身,而是消息的地址指针。 使用邮箱之前,必须先建立邮箱,并且要指定指针的初始值。一般情况下,这个初始值是NULL,但也可以在初始化时,就使其在最开始就包含一条消息。 邮箱主要用于两种目的: (1)通知一个事件的发生;(2)作二值信号量用。 6.1.1.1 消息邮箱初始值的设置方法 邮箱初始值的设置方法如下: 如果使用邮箱是用于通知一个事件的发生(发送一条消息),那么就要初始化该邮箱为NULL,因为在开始时,事件还没有发生; 如果作二值信号量用,即用于共享某些资源,那么就要初始化该邮箱为一个非NULL的指针。 6.1.1.2 消息邮箱的特点 邮箱具有如下特点: 邮箱中的内容是一个指向消息的指针,指针指向的内容即是消息; 邮箱为满时,邮箱只包含一个指向消息的指针;邮箱为空时,邮箱消息的指针指向NULL; 邮箱只能接收和发送一则消息,邮箱为满时,将丢弃新消息,保留旧消息。 6.1.1.3 消息邮箱管理函数 如表6.1所示,μC/OS-II提供了7种对邮箱的操作,邮箱函数所属文件是OS_MBOX.C。 6.1.1.4 消息邮箱的配置常量 在使用邮箱函数之前,必须将 OS_CFG.H文件中相应的配置常量设置为0或1,以确定是编译还是裁剪该函数,其配置常量如表6.2所示。 6.1.1.5任务、中断服务子程序与邮箱之间的关系 图6.1任务、中断服务子程序与邮箱之间的关系 6.1.2 建立一个邮箱,OSMboxCreate() 6.1.2.1 函数原型 OS_EVENT *OSMboxCreate(void *msg) 在使用邮箱之前,必须建立一个邮箱,OSMboxCreate()函数用于建立并初始化一个消息邮箱。消息邮箱允许任务或中断向其它一个或几个任务发送消息。 OSMboxCreate()函数只有一个参数msg,指向消息的指针。该参数的设置方法如前一节所述,可以为空,也可以不为空。如果该指针不为空,建立的消息邮箱将含有消息。 函数的返回值是:指向分配给所建立的消息邮箱的事件控制块的指针。如果没有可用的事件控制块,则返回空指针。 该函数所属文件:OS_MBOX.C,调用者:任务或启动代码,开关量:OS_MBOX_EN。 6.1.2.2 程序流程与源代码 图6.2 OSMboxCreate()流程与源代码 OS_EVENT 6.1.2.3 范例 6.1.3 删除一个邮箱 6.1.3.1 函数原型 OS_EVENT *OSMboxDel( OS_EVENT *pevent,INT8U opt,INT8U *err) 该函数用于删除邮箱, 所属文件:OS_MBOX.C, 调用者:任务, 开关量:OS_MBOX_EN和OS_MBOX_DEL_EN。 函数有如下3个参数: pevent 指向邮箱的指针,该指针是邮箱建立时,返回给应用程序的指针; opt 用于定义邮箱删除条件的选项,可供选择的值如下: OS_DEL_NO_PEND 选择只能是没有任何任务在等待该邮箱的消息时,才能删除邮箱; OS_DEL_ALWAYS 不管有没有任务在等待邮箱的消息,都立即删除邮箱。删除后,所有等待邮箱消息的任务都立即进入就绪状态。 err 指向出错代码的指针,返回的出错代码可以是以下几种之一: OS_NO_ERR 调用成功,表明邮箱已被删除; OS_ERR_DEL_ISR 试图在中断服务子程序中删除邮箱; OS_ERR_INVALID_OPT 无效的opt参数; OS_ERR_EVENT_TYPE pevent不是指向邮箱的指针; OS_ERR_PEVENT_NULL 没有可以使用的OS_EVENT数据结构。 6.1.3.2 返回值 返回空指针NULL,表示邮箱已被删除; 返回pevent,表示邮箱没有删除,在这种情况下,应该进一步查看出错代码,找到出错原因。 6.1.3.3 注意事项 使用这个函数调用时,须特别小心,因为其它任务可能还要使用这个邮箱。 当挂起的任务进入就绪时,中断是关闭的,这就意味着中断延迟时间与等待邮箱的消息的任务数有关。 调用OSMboxAccpet()函数也不可能知道邮箱是否已经被删除了。 范例 6.1.4 等待一个邮箱中的消息 6.1.4.1 函数原型 void *OSMboxPend( OS_EVNNT *peve
您可能关注的文档
- 《七年级下册仁爱英语多媒体教学课件》Unit 8 Topic 2 Section D.ppt
- 《七年级下册仁爱英语多媒体教学课件》Unit 8 Topic 3 Section A.ppt
- 《七年级下册仁爱英语多媒体教学课件》Unit 8 Topic 3 Section B.ppt
- 《七年级下册仁爱英语多媒体教学课件》Unit 8 Topic 3 Section C.ppt
- 《七年级下册仁爱英语多媒体教学课件》Unit 8 Topic 3 Section D.ppt
- 《嵌入式操作系统》第1章 嵌入式系统导论.ppt
- 《嵌入式操作系统》第1章-范例.doc
- 《嵌入式操作系统》第2章 嵌入式操作系统中的基本概念.ppt
- 《嵌入式操作系统》第2章-实时系统概念.doc
- 《嵌入式操作系统》第3章-内核结构.doc
文档评论(0)