![](https://csdnimg.cn/release/download_crawler_static/3464159/bg1.jpg)
Ucos 学习 作者 : 李述铜 Email: blievethink@gmail.com QQ:527676163 2009-1-25
Ucos
Ucos
Ucos
Ucos 学习之邮箱与消息队列
一、 相关背景知识
邮箱与消息队列常用于任务间的通信,也可用于任务间的同步。 一般的邮箱常常保存 了
任务收发的消息。发消息任务负责将将消息发送至邮箱,收消息则从邮箱取消息。消息的 内
容可为结构化的,也可为非结构化的。
邮箱可由操作系统维护, 也可由任务自身维护。 由操作系统维护即意味着操作系统必 须
暂存任务发来的消息,增加了操作系统负担;由任务维护意味着由任务自己管理邮箱,任 务
间发送的消息直接发送至任务的邮箱,只需要操作系统进行适当的管理工作。
消息间的传递可以为 定向 、也可为 非定向的 。若任务A要接收一消息,可以指定接收 任
务B发来的消息,也可接收任何任务发送的。前者为定向的,后者为非定向的。对任务A 而
言, 若任务A接收消息时直至接收到才返回, 称为 阻塞的接收 ; 而若仅查收邮箱后立即返
回,
则称为 非阻塞式的接收 。同理,若任务B可发送一消息,其可以指定发送给任务B,也可 以
发送给被多个任务共享的邮箱。对于任务B而言, 如果在发送消息后立即返回,而不管是 否
被接收,则称为 非阻塞的发送 ;如果直至接收后才返回,则称为 阻塞的发送 。
二、 ucos
ucos
ucos
ucos 邮箱与消息队列
Ucos 提供了邮箱与消息队列用于任务间的通信。二者都是基于事件控制块结构
OS_EVENT 。与邮箱相比,消息队列在 OS_EVENT 结构基础之上添加了一循环队列,可 以
同时容纳多个消息,而邮箱只能容纳一个。因此,可以将消息队列看作同时接收多条消息 的
邮箱。
1、 ucos
ucos
ucos
ucos 的邮箱实现 .
.
.
.
与信号量一样 , 邮箱 MBOX 同样基于 OS_EVENT 实现。
typedef struct {
INT8U OSEventType; // 事件控制块的类型
INT8U OSEventGrp; // 等待的任务组
INT16U OSEventCnt; // 此处不用
void *OSEventPtr; // 消息存放处。
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; // 等待任务表
} OS_EVENT; ( ucos_II.H )
.OSEventPtr 用于存放消息的指针。 因为邮箱是由操作系统进行维护,为避免消息传递 时
不必要的复制,采用了传指针方式进行消息的传递。
基于邮箱的操作包括:邮箱的创建,删除,消息的发送、接收。所有的操作定义大
OS_MBOX.C 文件中。部分操作依赖于 OS_CORE.C 中的基于 OS_EVENT 的操作。
邮箱的创建与删除:
OS_EVENT *OSMboxCreate (void *msg) ;
OS_EVENT *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *err);
消息的发送与接收:
void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);
INT8U OSMboxPost (OS_EVENT *pevent, void *msg);
INT8U OSMboxPostOpt (OS_EVENT *pevent, void *msg, INT8U opt);;
void *OSMboxAccept (OS_EVENT *pevent);