参考手册
for (;;) { . .
err = OSQPost(CommQ, (void *)&CommRxBuf[0]); if (err == OS_NO_ERR) {
. /* 将消息放入消息队列 */ . } else {
. /* 消息队列已满 */ . } . . } }
μC/OS-II:实时操作系统内核
OSQPostFront( )
INT8U OSQPostFront(OS_EVENT *pevent, void *msg);
所属文件 调用者 开关量 OS_Q_EN 任务或中断 OSQPostFront()函数通过消息队列向任务发送消息。OSQPostFront()函数和OSQPost()函数非常相似,不同之处在于OSQPostFront()函数将发送的消息插到消息队列的最前端。也就是说,OSQPostFront()函数使得消息队列按照后入先出(LIFO)的方式工作,而不是先入先出(FIFO)。消息是一个指针长度的变量,在不同的程序中消息的使用也可能不同。如果队列中已经存满消息,返回错误码。OSQPost()函数立即返回调用者,消息也没能发到队列。如果有任何任务在等待队列中的消息,最高优先级的任务将得到这个消息。如果等待消息的任务优先级比发送消息的任务优先级高,那么高优先级的任务将得到消息而恢复执行,也就是说,发生了一次任务切换
OS_Q.C 参数
pevent 是指向即将接受消息的消息队列的指针。该指针的值在建立该队列时可以得到。(参考OSQCreate()函数)。
Msg 是即将实际发送给任务的消息。消息是一个指针长度的变量,在不同的程序中消息的使用也可能不同。不允许传递一个空指针。
返回值
OSQPost()函数的返回值为下述之一:
? OS_NO_ERR :消息成功的放到消息队列中。 ? OS_MBOX_FULL :消息队列已满。
? OS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针。
注意/警告
必须先建立消息队列,然后使用。 不允许传递一个空指针。
范例:
OS_EVENT *CommQ;
INT8U CommRxBuf[100];
void CommTaskRx(void *pdata) {
INT8U err;
pdata = pdata; for (;;) { .
参考手册
err = OSQPostFront(CommQ, (void *)&CommRxBuf[0]); if (err == OS_NO_ERR) {
. /* 将消息放入消息队列 */ } else {
. /* 消息队列已满 */ } . . } }
μC/OS-II:实时操作系统内核
OSQQuery( )
INT8U OSQQuery(OS_EVENT *pevent, OS_Q_DATA *pdata);
所属文件 调用者 开关量 OS_Q_EN 任务或中断 OSQQuery()函数用来取得消息队列的信息。用户程序必须建立一个OS_Q_DATA的数据结构,该结构用来保存从消息队列的事件控制块得到的数据。通过调用OSQQuery()函数可以知道任务是否在等待消息、有多少个任务在等待消息、队列中有多少消息以及消息队列可以容纳的消息数。OSQQuery()函数还可以得到即将被传递给任务的消息的信息。
OS_Q.C 参数
pevent 是指向即将接受消息的消息邮箱的指针。该指针的值在建立该消息邮箱时可以得到。(参考OSQCreate()函数)。
Pdata 是指向OS_Q_DATA数据结构的指针,该数据结构包含下述成员: Void *OSMsg; /* 下一个可用的消息*/ INT16U OSNMsgs; /* 队列中的消息数目*/ INT16U OSQSize; /* 消息队列的大小 */ INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* 消息队列的等待队列*/ INT8U OSEventGrp;
返回值
OSQQuery()函数的返回值为下述之一: ? OS_NO_ERR :调用成功
? OS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针。
注意/警告
必须先建立消息队列,然后使用。
范例:
OS_EVENT *CommQ;
void Task (void *pdata) {
OS_Q_DATA qdata; INT8U err;