1. 首页
  2. 文档大全

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

上传者:2****5 2022-07-25 13:35:27上传 PPT文件 3.73MB
第7章 任务间的同步与通讯之消息邮箱_第1页 第7章 任务间的同步与通讯之消息邮箱_第2页 第7章 任务间的同步与通讯之消息邮箱_第3页

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

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

2、U OSEventType; /* 事件类型 */ INT8U OSEventGrp; /* 等待任务所在的组 */ INT16U OSEventCnt; /* 计数器(当事件是信号量时) */ void *OSEventPtr; /* 指向消息或者消息队列的指针 */INT8U OSEventTblOS_EVENT_TBL_SIZE; /* 等待任务列表 */ OS_EVENT;第七章 任务间的同步与通讯消息邮箱l什么是消息邮箱什么是消息邮箱l消息邮箱的数据结构消息邮箱的数据结构l消息邮箱相关函数消息邮箱相关函数 消息邮箱函数一览表消息邮箱函数一览表消息邮箱函数所属文件是消息邮箱函数所属文件

3、是OS_MBOX.COS_CFG.H文件中消息邮箱的配置常数一览表文件中消息邮箱的配置常数一览表任务、中断服务子程序与消息邮箱之间的关系消息邮箱的操作 OSMboxCreate() OSMboxDel() OSMboxPend() OSMboxPost() OSMboxPostOpt() OSMboxAccept() OSMboxQuery()建立一个邮箱,OSMboxCreate()函数OSMboxCreate()的原型如下:OS_EVENT *OSMboxCreate(void *msg); 参数:msg 参数用来初始化建立的消息邮箱。如果该指针不为空,建立的消息邮箱将含有消息。 返回值:

4、指向分配给所建立的消息邮箱的事件控制块的指针。如果没有可用的事件控制块,返回空指针。邮箱作用:邮箱作用: 通知一个消息(此时,通知一个消息(此时,msg为空)为空) 作为二值信号量作为二值信号量范例OS_EVENT *RxMbox; /*定义消息邮箱指针*/void main(void) . OSInit(); RxMbox = OSMboxCreate(void *)0); /*建立消息邮箱,初始值为空 */ OSStart(); /*启动多任务内核 */OSMboxCreate()函数返回前,事件控制块的内容邮箱特点 消息邮箱的内容是一个指向消息的指针,指针指消息邮箱的内容是一个指向消息的

5、指针,指针指向的内容就是消息向的内容就是消息 邮箱只能接收和发送一条消息,当邮箱满时,将邮箱只能接收和发送一条消息,当邮箱满时,将丢弃新消息,保持旧消息丢弃新消息,保持旧消息 当邮箱为满是,邮箱里存放指向消息的指针;当当邮箱为满是,邮箱里存放指向消息的指针;当邮箱为空时,邮箱指针为邮箱为空时,邮箱指针为NULL消息邮箱的操作 OSMboxCreate() OSMboxDel() OSMboxPend() OSMboxPost() OSMboxPostOpt() OSMboxAccept() OSMboxQuery() 删除消息邮箱OSMboxDel()函数原型如下:函数原型如下:OS_EVEN

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

7、END:选择只能是没有任何任务在等待该消息邮箱的消息时,:选择只能是没有任何任务在等待该消息邮箱的消息时,才能删除消息邮箱。才能删除消息邮箱。 OS_DEL_ALWAYS:不管有没有任务在等待消息邮箱的消息,都立即删除消息:不管有没有任务在等待消息邮箱的消息,都立即删除消息邮箱。删除后,所有等待消息邮箱消息的任务都立即进入就绪状态。邮箱。删除后,所有等待消息邮箱消息的任务都立即进入就绪状态。(3) err:指向出错代码的指针。:指向出错代码的指针。 OS_NO_ERR:调用成功,表明邮箱已被删除。:调用成功,表明邮箱已被删除。 OS_ERR_DEL_ISR:试图在中断服务子程序中删:试图在中断

8、服务子程序中删除邮箱。除邮箱。 OS_ERR_INVALID_OPT:无效的:无效的opt参数。参数。 OS_ERR_EVENT_TYPE:pevent不是指向邮箱的不是指向邮箱的指针。指针。 OS_ERR_PEVENT_NULL:没有可以使用的:没有可以使用的OS_ EVENT数据结构数据结构返回值返回值OSMboxDel()函数的返回值为如下内容之一:函数的返回值为如下内容之一:(1) 返回空指针返回空指针NULL,表示消息邮箱已被删除。,表示消息邮箱已被删除。(2) 返回返回pevent,表示消息邮箱没有删除,在这种情况下,表示消息邮箱没有删除,在这种情况下,应该进一步查看出错代码,找到

9、出错原因。应该进一步查看出错代码,找到出错原因。. 范例。OS_EVENT *RxMbox/*定义消息邮箱指针定义消息邮箱指针*/void task( void *pdata) INT8U *err; pdata = pdata; for (;) RxMbox = OSMboxDel (RxMbox,OS_DEL_ALWAYS,&err); 应用程序;应用程序; 消息邮箱的操作 OSMboxCreate() OSMboxDel() OSMboxPend() OSMboxPost() OSMboxPostOpt() OSMboxAccept() OSMboxQuery()等待邮箱中的消息

10、,OSMboxPend()函数OSMboxPend()的原型如下:void *OSMboxPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err ); 参数:pevent:是指向即将接受消息的消息邮箱的指针。timeout:允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的消息时恢复运行。err:是指向包含错误码的变量的指针。OSMboxPend()函数返回的错误码可能为下述几种: OS_NO_ERR :消息被正确的接收。 OS_TIMEOUT :消息没有在指定的周期数内送到。 OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了

11、不允许从中断调用该函数,但C/OS-仍然包含了检测这种情况的功能。 OS_ERR_EVENT_TYPE :pevent 不是指向消息邮箱的指针。返回值:OSMboxPend()函数返回接收的消息并将 *err置为OS_NO_ERR。如果没有在指定数目的时钟节拍内接受到需要的消息,OSMboxPend()函数返回空指针并且将 *err设置为OS_TIMEOUT。范例OS_EVENT *RxMbox; /*定义消息邮箱指针*/void Task(void *pdata) INT8U err; void *msg; pdata = pdata; for (; ;) 应用程序代码; msg = OSM


文档来源:https://www.renrendoc.com/paper/212728143.html

文档标签:

下载地址