uCOS-II之邮箱
2016-01-05 15:18
741 查看
多任务操作系统中,常常需要再任务与任务之间通过传递一个数据(注意这里是1个数据,而不是多个数据)的方式进行通信,为了达到这个目的,可以在内存中创建一个存储空间作为该数据的缓冲区,如果把这个缓冲区称为消息缓冲器,这样在任务间传递数据(消息)的最简单的办法就是传递消息缓冲区的指针,我们把用来传递消息缓冲区指针的数据结构叫做邮箱(消息邮箱)。
在ucos中,我们通过事件控制块的OSEventPrt来传递消息缓冲区指针(在信号量中,不需要该指针),同时使实践控制块的成员OSEventType设定为常数OS_EVENT_TYPE_MBOX,则该事件控制块ECB就叫做消息邮箱。
与消息邮箱相关的几个函数分别为:
1、创建邮箱函数:OS_EVENT *OSMboxCreate(void *msg),函数中的参数msg为消息的指针,函数的返回值为消息邮箱的指针。该函数的实现方法是:先判断是否在中断中调用该函数,如果是则无效返回;定义一个空ECB,类型为消息邮箱,将OSEventPrt赋初值为某个指针。返回一个指向上述ECBB的指针。
2、向邮箱发送消息函数:INT8U OSMboxPost(OS_EVENT *pevent,void *pmsg),函数实现过程:检查了事件控制块是否是一个邮箱后[L6.16(1)],OSMboxPost()函数还要检查是否有任务在等待该邮箱中的消息[L6.16(2)]。如果事件控制块中的OSEventGrp域包含非零值,就暗示着有任务在等待该消息。这时,调用OSEventTaskRdy()将其中的最高优先级任务从等待列表中删除[见6.02节,使一个任务进入就绪状态,OSEventTaskRdy()][L6.16(3)],加入系统的就绪任务列表中,准备运行。然后,调用OSSched()函数[L6.16(4)],检查该任务是否是系统中最高优先级的就绪任务。如果是,执行任务切换[仅当OSMboxPost()函数是由任务调用时],该任务得以执行。如果该任务不是最高优先级的任务,OSSched()返回,OSMboxPost()的调用函数继续执行。如果没有任何任务等待该消息,指向消息的指针就被保存到邮箱中[L6.16(6)](假设此时邮箱中的指针不是非NULL的[L6.16(5)])。这样,下一个调用OSMboxPend()函数的任务就可以立刻得到该消息了。
注意:在OSMboxPost函数中,有判断邮箱中是否已经有了消息,如果已经有消息,则返OS_ERR_MBOX_FULL,这就代表,ucos中的邮箱一次只能发送1个指针,即1个数据,这在使用上就有些局限。
3、等待一个邮箱中的消息函数:OSMboxPend(OS_EVENT *pevent,INT32U timeout,INT8U *perr),函数的实现过程:它和OSSemPend()也很相似,因此,在这里只讲述其中的不同之处。OSMboxPend()首先检查该事件控制块是由OSMboxCreate()函数建立的[L6.15(1)]。当.OSEventPtr域是一个非NULL的指针时,说明该邮箱中有可用的消息[L6.15(2)]。这种情况下,OSMboxPend()函数将该域的值复制到局部变量msg中,然后将.OSEventPtr置为NULL[L6.15(3)]。这正是我们所期望的,也是执行OSMboxPend()函数最快的路径。如果没有消息可用,则等待。
在ucos中,我们通过事件控制块的OSEventPrt来传递消息缓冲区指针(在信号量中,不需要该指针),同时使实践控制块的成员OSEventType设定为常数OS_EVENT_TYPE_MBOX,则该事件控制块ECB就叫做消息邮箱。
与消息邮箱相关的几个函数分别为:
1、创建邮箱函数:OS_EVENT *OSMboxCreate(void *msg),函数中的参数msg为消息的指针,函数的返回值为消息邮箱的指针。该函数的实现方法是:先判断是否在中断中调用该函数,如果是则无效返回;定义一个空ECB,类型为消息邮箱,将OSEventPrt赋初值为某个指针。返回一个指向上述ECBB的指针。
2、向邮箱发送消息函数:INT8U OSMboxPost(OS_EVENT *pevent,void *pmsg),函数实现过程:检查了事件控制块是否是一个邮箱后[L6.16(1)],OSMboxPost()函数还要检查是否有任务在等待该邮箱中的消息[L6.16(2)]。如果事件控制块中的OSEventGrp域包含非零值,就暗示着有任务在等待该消息。这时,调用OSEventTaskRdy()将其中的最高优先级任务从等待列表中删除[见6.02节,使一个任务进入就绪状态,OSEventTaskRdy()][L6.16(3)],加入系统的就绪任务列表中,准备运行。然后,调用OSSched()函数[L6.16(4)],检查该任务是否是系统中最高优先级的就绪任务。如果是,执行任务切换[仅当OSMboxPost()函数是由任务调用时],该任务得以执行。如果该任务不是最高优先级的任务,OSSched()返回,OSMboxPost()的调用函数继续执行。如果没有任何任务等待该消息,指向消息的指针就被保存到邮箱中[L6.16(6)](假设此时邮箱中的指针不是非NULL的[L6.16(5)])。这样,下一个调用OSMboxPend()函数的任务就可以立刻得到该消息了。
注意:在OSMboxPost函数中,有判断邮箱中是否已经有了消息,如果已经有消息,则返OS_ERR_MBOX_FULL,这就代表,ucos中的邮箱一次只能发送1个指针,即1个数据,这在使用上就有些局限。
3、等待一个邮箱中的消息函数:OSMboxPend(OS_EVENT *pevent,INT32U timeout,INT8U *perr),函数的实现过程:它和OSSemPend()也很相似,因此,在这里只讲述其中的不同之处。OSMboxPend()首先检查该事件控制块是由OSMboxCreate()函数建立的[L6.15(1)]。当.OSEventPtr域是一个非NULL的指针时,说明该邮箱中有可用的消息[L6.15(2)]。这种情况下,OSMboxPend()函数将该域的值复制到局部变量msg中,然后将.OSEventPtr置为NULL[L6.15(3)]。这正是我们所期望的,也是执行OSMboxPend()函数最快的路径。如果没有消息可用,则等待。
相关文章推荐
- 使用Ajax实时检测"用户名、邮箱等"是否已经存在
- 邮箱网站不能用mail.xxx.com:8888的方式访问原因
- hotmail,MSN 邮箱无法登陆的解决方法 秘密通道
- jQuery实现Email邮箱地址自动补全功能代码
- jquery实现邮箱自动填充提示功能
- jquery验证邮箱格式是否正确实例讲解
- jquery验证邮箱格式并显示提交按钮
- jQuery 实现自动填充邮箱功能(带下拉提示)
- jQuery实现文本框邮箱输入自动补全效果
- php验证邮箱和ip地址最简单方法汇总
- php邮箱地址正则表达式验证
- Ajax实时验证用户名/邮箱等是否已经存在的代码打包
- php email邮箱正则
- java使用正则表达式判断邮箱格式是否正确的方法
- Python自动登录126邮箱的方法
- 用IMAP4访问Exchange邮箱:Exchange2003学习系列之七
- Corning北京公司高调部署防垃圾邮件系统
- Exchange Server 2007灾难恢复(AD+Ex)
- 利用OWA访问Exchange邮箱
- Flex 一些数据的验证(邮箱,字符串,日期,年龄...)