请选择 进入手机版 | 继续访问电脑版
快捷导航
本帖最后由 袁绪蝶 于 2017-12-22 13:42 编辑

一、邮箱
1 邮箱定义


——邮箱是μC/OS-II中另一种通讯机制;
——用于发送消息(指针型变量):可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定“消息”的数据结构。

2 邮箱的使用

对邮箱的操作
——建立(CREATE)
初始化邮箱
——挂起(PEND)
等待邮箱消息
——发消息(POST)
发送邮箱消息
邮箱的使用方法
——用邮箱来通知任务某一个事件已经发生
如果使用邮箱的目的是用来通知任务某一个事件已经发生(发送一条消息),那么就要初始化该邮箱为NULL,因为在开始时,事件还没有发生。
——用邮箱来共享某些资源
如果用户用邮箱来共享某些资源,那么就要初始化该邮箱为一个非NULL的指针。在这种情况下,邮箱被当成一个二值信号量使用。

任务、ISR和邮箱的关系

ISR:即中断服务程序
用符号“I”表示邮箱。邮箱包含的内容是一个指向一条消息的指针。一个邮箱只能包含一个这样的指针(邮箱为满时),或者一个指向NULL的指针(邮箱为空时)。

3 用邮箱做二值信号量

——一个邮箱可以被用作二值的信号量。 首先,在初始化时,将邮箱设置为一个非零的指针(如void *1)。这样,一个任务可以调用 OSMboxPend()函数来请求一个信号量,然后通过调用OSMboxPost()函数来释放一个信号量。
——如果用只需要二值信号量和邮箱,这样做可以节省代码空间。

*********************************************************************
二、邮箱的通用操作
1 建立一个邮箱

OSMboxCreate()
建立一个邮箱
基本上和函数OSSemCreate()(信号量)相似。不同之处在于使用OSEventPtr域来容纳消息指针,而不是使用OSEventCnt域。

2 等待一个邮箱中的消息

OSMboxPend()
和OSSemPend()也很相似,不同之处:
—当.OSEventPtr域是一个非NULL的指针时,说明该邮箱中有可用的消息,这种情况下,OSMboxPend()函数将该域的值复制到局部变量msg中,然后将.OSEventPtr置为NULL;
—如果此时邮箱中没有消息是可用的(.OSEventPtr域是NULL指针),OSMboxPend()的调用任务就被挂起,直到邮箱中有了消息或者等待超时。

3 发送一个消息到邮箱

OSMboxPost()
向邮箱发送一则消息
μC/OS-Ⅱ为了兼容以前的版本,使用了2个向邮箱发送消息的函数。
OSMboxPostOpt()是新加的函数,可以替代原有的OSMboxPost()函数。另外,OSMboxPostOpt()函数可以向等待邮箱的所有任务发送消息(广播)。

4 无等待地从邮箱中得到一个消息

OSMboxAccept()
如果邮箱为空,则应用程序也可以从邮箱中得到消息,而不必使任务进入睡眠状态。

5 查询一个邮箱的状态

OSMboxQuery()
OSMboxQuery()函数使应用程序可以随时查询一个邮箱的当前状态。
两个参数:一个是指向邮箱的指针 pevent。该指针是在建立该邮箱时,由 OSMboxCreate()函数返回的;另一个是指向用来保存有关邮箱的信息的 OS_MBOX_DATA(见uCOS_II.H)数据结构的指针pdata。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.

共 0 个关于本帖的回复 最后回复于 2017-12-22 13:42

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2019-2-16 19:20