17.4-uC/OS-III消息管理(任务消息队列使用)

时间:2023-03-10 06:20:53
17.4-uC/OS-III消息管理(任务消息队列使用)

任务消息队列跟任务信号量一样,均隶属于某一个特定任务, 不需单独创建,任务在则在,

只有该任务才可以接收这个任务消息队列的消息,其他任务只能给这个任务消息队列发送消息,

却不能接收。任务消息队列与(普通)消息队列极其相似,只是任务消息队列已隶属于一个特定任务,

所以它不具有等待列表, 省去了等待任务插入和移除列表的动作,所以工作原理相对更简单一点,

效率也比较高一些。

1.原理

如果想要使用任务消息队列,就必须事先使能任务消息队列。消息队列的使能位于
“os_cfg.h”。

特别声明,任务消息队列和(普通)消息队列公用一个消息池。一般任务消息队列或普
通消息队列的最大消息容量不要超过消息池的消息数目。

2.OSTaskQPost ()
OSTaskQPost () 函数用于向任务消息队列发布一个消息。OSTaskQPost () 函数的定义也位于“os_task.c”。
其实,不管是否使能了中断延迟发布,最终都是调用 OS_TaskQPost () 函数进行发布任务消息。只是

使能了中断延迟发布的发布过程会比较曲折,中间会有许多插曲。

在 OS_TaskQPost () 函数中,会调用 OS_MsgQPut () 函数从消息池获取一个消息插入到消息队列。 OS_MsgQPut () 函数的定义位于“os_msg.c”。

3.OSTaskQPend ()
与 OSTaskQPost () 任务消息队列发布消息函数相对应,OSTaskQPend () 函数用于等待获
取任务消息队列的消息。 OSTaskQPend () 函数的定义也位于“os_task.c”。
在 OSTaskQPend () 函数中,会调用 OS_MsgQGet () 函数从任务消息队列获取一个消息。OS_MsgQGet () 函数的定义位于“os_msg.c”。

4.OSTaskQPendAbort ()
OSTaskQPendAbort () 函数用于 中止任 务对其任 务 消息 队列的 等待。 要使用
OSTaskQPendAbort () 函数, 除了要先使能前面的 OS_CFG_TASK_Q_EN 外,还得使能
OS_CFG_TASK_Q_PEND_ABORT_EN(位于“os_cfg.h”)。

OSTaskQPendAbort () 函数的定义位于“os_task.c”。