消息队列在任务间可以传递多条消息,由3部分组成:事件控制块、消息队列和消息、
OSEventType=OS_EVENT_TYPE_Q时,描述的就是消息队列。
1.消息指针数组
消息队列的核心iushi消息指针数组。
OSQSize: 数组的长度;
OSQEnter:已存放消息指针的元素数目;
OSQStart: 指针,指向消息指针的起始数组;
OSQEnd:指针,指向消息指针数组结束单元的下一个单元,它使得数组构成了一个循环的缓冲区;
OSQIn:指针,指向插入下一条消息的位置,当它移动到OSQEnd相等时,是调整到指向数组的起始单元;
OSQOut:指针,指向被取出消息的位置,当它移动到与OSQEnd相等时,被调整到指向数组的起始单元
2种插入数据方式:
先进先出: OSQIn:插入, OSQOut:输出;
后进先出: OSQOut;
2. 队列控制块
消息指针数组的管理: 消息指针数组的基本参数都记录在一个教队列控制块的结构中;
typedef struct os_q
{
struct os_q *OSQPtr;
void ** OSQStart;
void ** OSQEnd;
void ** OSQIn;
void ** OSQOut;
INT16U OSQSize;
INT16U OSQEntries;
}OS_Q;
3. 创建消息队列
OS_EVENT OSQCreate(
void * *start, //指针数组的地址
INT16U size // 数组长度
);
4. 请求消息队列
为了从消息队列中获取消息。函数原型:
void * OSQPend( OS_EVENT *pevent,
INT16U timeout,
INT8U *err);
返回值: 消息指针;
希望任务无等待地请求一个消息队列,则需要调用OSQAccept(),函数原型:
void OSQAccept( OS_EVENT *pevent);
5. 向消息队列发送消息
OSQPost():先进先出; OSQPostFront():后进先出‘
INT8U OSQPost(OS_EVENT *pevnet, void *msg);
INT8U OSQPostFront( OS_EVENT *pevent, void *msg)
任务希望以广播的方式通过消息队列发送消息:函数原型:
INT8U OSQPostOpt(OS_EVENT *pevent, void *msg, INT8U opt);
6.清空消息队列
INT8U OSQFlush( OS_EVENT *pevent);
7. 删除消息队列
OS_EVENT *OSQDel( OS_EVENT *pevent);
8. 查询消息队列
INT8U OSQQuery(OS_EVENT *pevent, OS_Q_DATA *pdata);
pdata:c存放状态信息的结构;
typedef struct {
void *OSMsg;
INT16U OSNMsgs;
INT16U OSQSize;
INT8U OSEventTbl[OS_EVENT_TBL_SIZE];
INT8U OSEventGrp;
}OS_Q_DATA;