uCOS-II之邮箱
来源:互联网 发布:自学泰语软件下载 编辑:程序博客网 时间:2024/05/01 10:54
多任务操作系统中,常常需要再任务与任务之间通过传递一个数据(注意这里是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-II之邮箱
- uCOS-II任务间通信之邮箱
- ucos II 任务间 通信之四:邮箱
- uCOS-II任务间通信之邮箱 [转载]
- uCOS-II中的消息邮箱
- UCOS邮箱之二
- UCOS之邮箱
- uCOS-II邮箱和消息队列
- uCOS-II邮箱和消息队列
- uCOS-II邮箱和消息队列
- ucos-ii示例4:邮箱测试
- ucos II 任务间 通信:邮箱
- ucos ii学习笔记2 邮箱&&信息量
- UCOS-II任务间通信:邮箱
- ucos-ii 之 OSTimeTick
- uCOS-II之信号量
- Ucos II 移植之二
- ucos-ii 之OSTaskDel函数
- 修改oracle用户密码永不过期
- 验证正则表达式2
- maven -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME
- github搜索小技巧
- java回调
- uCOS-II之邮箱
- java加密解密和编码转换
- 动态批量删除SQL数据库中的表
- 使用shareperference实现缓存cache功能
- shape在Android中的使用
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)
- 数据库连接池性能比对
- 数据存取之SQLite浅析
- 养成良好的编程习惯