第7章任务间的同步与通讯之消息邮箱概要

上传人:今*** 文档编号:107469176 上传时间:2019-10-19 格式:PPT 页数:53 大小:4.35MB
返回 下载 相关 举报
第7章任务间的同步与通讯之消息邮箱概要_第1页
第1页 / 共53页
第7章任务间的同步与通讯之消息邮箱概要_第2页
第2页 / 共53页
第7章任务间的同步与通讯之消息邮箱概要_第3页
第3页 / 共53页
第7章任务间的同步与通讯之消息邮箱概要_第4页
第4页 / 共53页
第7章任务间的同步与通讯之消息邮箱概要_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《第7章任务间的同步与通讯之消息邮箱概要》由会员分享,可在线阅读,更多相关《第7章任务间的同步与通讯之消息邮箱概要(53页珍藏版)》请在金锄头文库上搜索。

1、第七章 任务间的同步与通讯,消息邮箱,什么是消息邮箱 消息邮箱的数据结构 消息邮箱相关函数,消息邮箱,指针 消息邮箱,任务1,任务2,发送消息,请求消息,消息缓冲区,(发送消息缓冲区指针),(读取消息缓冲区指针),消息邮箱是一种通信机制,它能使任务或中断服务向另一个任务发送一个指针型的变量,这个指针指向一个包含指定“消息”的数据结构。消息邮箱发送的不是消息本身,而是消息的地址指针。,第七章 任务间的同步与通讯,消息邮箱,什么是消息邮箱 消息邮箱的数据结构 消息邮箱相关函数,消息邮箱的数据结构,typedef struct INT8U OSEventType; /* 事件类型 */ INT8U

2、OSEventGrp; /* 等待任务所在的组 */ INT16U OSEventCnt; /* 计数器(当事件是信号量时) */ void *OSEventPtr; /* 指向消息或者消息队列的指针 */ INT8U OSEventTblOS_EVENT_TBL_SIZE; /* 等待任务列表 */ OS_EVENT;,第七章 任务间的同步与通讯,消息邮箱,什么是消息邮箱 消息邮箱的数据结构 消息邮箱相关函数,消息邮箱函数一览表,消息邮箱函数所属文件是OS_MBOX.C,OS_CFG.H文件中消息邮箱的配置常数一览表,任务、中断服务子程序与消息邮箱之间的关系,消息邮箱的操作,OSMboxCr

3、eate() OSMboxDel() OSMboxPend() OSMboxPost() OSMboxPostOpt() OSMboxAccept() OSMboxQuery(),建立一个邮箱,OSMboxCreate(),函数OSMboxCreate()的原型如下: OS_EVENT *OSMboxCreate(void *msg); 参数: msg 参数用来初始化建立的消息邮箱。如果该指针不为空,建立的消息邮箱将含有消息。 返回值: 指向分配给所建立的消息邮箱的事件控制块的指针。如果没有可用的事件控制块,返回空指针。,邮箱作用: 通知一个消息(此时,msg为空) 作为二值信号量,范例,OS

4、_EVENT *RxMbox; /*定义消息邮箱指针 */ void main(void) . OSInit(); RxMbox = OSMboxCreate(void *)0); /*建立消息邮箱,初始值为空 */ OSStart(); /*启动多任务内核 */ ,OSMboxCreate()函数返回前,事件控制块的内容,邮箱特点,消息邮箱的内容是一个指向消息的指针,指针指向的内容就是消息 邮箱只能接收和发送一条消息,当邮箱满时,将丢弃新消息,保持旧消息 当邮箱为满是,邮箱里存放指向消息的指针;当邮箱为空时,邮箱指针为NULL,消息邮箱的操作,OSMboxCreate() OSMboxDel

5、() OSMboxPend() OSMboxPost() OSMboxPostOpt() OSMboxAccept() OSMboxQuery(),删除消息邮箱OSMboxDel(),函数原型如下: OS_EVENT *OSMboxDel(OS_EVENT *pevent,INT8U opt,INT8U *err) 该函数用于删除消息邮箱,所属文件为OS_MBOX.C,调用者为任务,开关量为OS_MBOX_EN和OS_MBOX_ DEL_EN。 参数: (1) pevent:指向消息邮箱的指针,该指针是消息邮箱建立时,返回给应用程序的指针。 (2) opt:用于定义消息邮箱删除条件的选项。可供

6、选择的值如下: OS_DEL_NO_PEND:选择只能是没有任何任务在等待该消息邮箱的消息时,才能删除消息邮箱。 OS_DEL_ALWAYS:不管有没有任务在等待消息邮箱的消息,都立即删除消息邮箱。删除后,所有等待消息邮箱消息的任务都立即进入就绪状态。,(3) err:指向出错代码的指针。 OS_NO_ERR:调用成功,表明邮箱已被删除。 OS_ERR_DEL_ISR:试图在中断服务子程序中删除邮箱。 OS_ERR_INVALID_OPT:无效的opt参数。 OS_ERR_EVENT_TYPE:pevent不是指向邮箱的指针。 OS_ERR_PEVENT_NULL:没有可以使用的OS_ EVE

7、NT数据结构,返回值 OSMboxDel()函数的返回值为如下内容之一: (1) 返回空指针NULL,表示消息邮箱已被删除。 (2) 返回pevent,表示消息邮箱没有删除,在这种情况下,应该进一步查看出错代码,找到出错原因。,. 范例,。 OS_EVENT *RxMbox /*定义消息邮箱指针 */ void task( void *pdata) INT8U *err; pdata = pdata; for (;) RxMbox = OSMboxDel (RxMbox,OS_DEL_ALWAYS,&err); 应用程序; ,消息邮箱的操作,OSMboxCreate() OSMboxDel()

8、 OSMboxPend() OSMboxPost() OSMboxPostOpt() OSMboxAccept() OSMboxQuery(),等待邮箱中的消息,OSMboxPend(),函数OSMboxPend()的原型如下: void *OSMboxPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err ); 参数: pevent:是指向即将接受消息的消息邮箱的指针。 timeout:允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的消息时恢复运行。 err:是指向包含错误码的变量的指针。OSMboxPend()函数返回的错误码可能为下

9、述几种: OS_NO_ERR :消息被正确的接收。 OS_TIMEOUT :消息没有在指定的周期数内送到。 OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了不允许从中断调用该函数,但C/OS-仍然包含了检测这种情况的功能。 OS_ERR_EVENT_TYPE :pevent 不是指向消息邮箱的指针。,返回值: OSMboxPend()函数返回接收的消息并将 *err置为OS_NO_ERR。 如果没有在指定数目的时钟节拍内接受到需要的消息,OSMboxPend()函数返回空指针并且将 *err设置为OS_TIMEOUT。,范例,OS_EVENT *RxMbox; /*定义消息邮箱指

10、针 */ void Task(void *pdata) INT8U err; void *msg; pdata = pdata; for (; ;) 应用程序代码; msg = OSMboxPend (RxMbox, 10, ,等待消息说明,消息邮箱已经存在需要的消息,那么该消息被返回给OSMboxPend()的调用者,消息邮箱中清除该消息。 如果调用OSMboxPend()函数时消息邮箱中没有需要的消息,OSMboxPend()函数挂起当前任务直到得到需要的消息或超出定义等待超时的时间。 如果同时有多个任务等待同一个消息,C/OS-默认最高优先级的任务取得消息并且任务恢复执行。 一个由OST

11、askSuspend()函数挂起的任务也可以接受消息,但这个任务将一直保持挂起状态直到通过调用OSTaskResume()函数恢复任务的运行。,消息邮箱的操作,OSMboxCreate() OSMboxDel() OSMboxPend() OSMboxPost() OSMboxPostOpt() OSMboxAccept() OSMboxQuery(),向邮箱发送一则消息,OSMboxPost(),函数OSMboxPost()的原型如下: INT8U OSMboxPost(OS_EVENT *pevent, void *msg); 参数: pevent:指向即将接受消息的消息邮箱的指针。该指针

12、的值在建立该消息邮箱时可以得到。(参考OSMboxCreate()函数)。 msg:即将实际发送给任务的消息。消息是一个指针长度的变量,在不同的程序中消息的使用也可能不同。不允许传递一个空指针,因为这意味着消息邮箱为空。 返回值: OS_NO_ERR :消息成功的放到消息邮箱中。 OS_MBOX_FULL :消息邮箱已经包含了其他消息,不空。 OS_ERR_EVENT_TYPE :pevent 不是指向消息邮箱的指针。,调用者是任务或中断,开关量是OS_MBOX_EN和OS_MBOX_POST_EN,发送消息说明,如果消息邮箱中已经存在消息,返回错误码说明消息邮箱已满。 如果有多个任务在等待消

13、息邮箱的消息,最高优先级的任务将得到这个消息。 如果等待消息的任务优先级比发送消息的任务优先级高,那么高优先级的任务将得到消息而恢复执行,也就是说,发生了一次任务切换。,消息邮箱的操作,OSMboxCreate() OSMboxDel() OSMboxPend() OSMboxPost() OSMboxPostOpt() OSMboxAccept() OSMboxQuery(),广播发送消息到消息邮箱中OSMboxPostOpt(),函数原型如下: INT8U OSMboxPostOpt(OS_EVENT *pevent, void *msg,INT8U opt),OSMboxPostOpt(

14、)函数与OSMboxPost()函数比较 两者工作方式相同,都用指针传递消息; 不同的是OSMboxPost()只能给一个任务发送消息,而OSMboxPostOpt()允许将消息广播给所有的等待消息邮箱消息的任务,且可以仿真OSMboxPost()。 OSMboxPostOpt()函数的开关量是OS_MBOX_EN和OS_MBOX_POST_OPT_EN,调用者可以是任务,也可以是中断。 在广播方式下,函数的执行时间取决于等待消息邮箱消息的任务数量。,OSMboxpostOpt()函数有如下三个参数: (1) pevent:指向即将接收消息的消息邮箱的指针。该指针的值可以在建立该消息邮箱时得到

15、。 (2) msg:即将发送给任务的消息。消息是以指针表示的某种数据类型的变量,消息的数据类型可能会因具体应用的不同而有所差异。不允许传递空指针,因为这样意味着消息邮箱为空。 (3) opt:定义发送消息方式的选项。它有两种形式: 若opt = OS_POST_OPT_NONE,则定义消息只发给等待消息的任务中优先级最高的任务; 若opt = OS_POST_OPT_BROADCAST,则让所有等待邮箱消息的任务都得到消息。,返回值 (1) OS_NO_ERR:调用成功,消息已经发出。 (2) OS_MBOX_FULL:邮箱中已经有消息。 (3) OS_ERR_EVENT_TYPE:peven

16、t不是指向邮箱的指针。 (4) OS_ERR_PEVENT_NULL:pevent是空指针。 (5) OS_ERR_POST_NULL_PTR:试图发送空指针。根据规则,空指针无效。,消息邮箱的操作,OSMboxCreate() OSMboxDel() OSMboxPend() OSMboxPost() OSMboxPostOpt() OSMboxAccept() OSMboxQuery(),无等待地从邮箱中得到一则消息,OSMboxAccept(),OSMboxAccept()的函数原型如下: void *OSMboxAccept(OS_EVENT *pevent); 参数: pevent:是指向需要查看的消息邮箱

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号