UCOS操作系统——任务内嵌消息队列(十三)

UCOS操作系统

前言

同任务内嵌信号量一样,UCOSIII的每个任务中也有内建消息队列。而且多个任务等待同一个消息队列的应用很少见,UCOSIII中每个任务多有其内建消息队列的话用户可以不用通过外部的消息队列而直接向任务发布消息。
如果需要使用任务内建消息队列功能的时候需要将宏OS_CFG_TASK_Q_EN置1来使能相关的代码。

一、相关函数

在这里插入图片描述

二、使用方法

1.等待任务内建消息

函数 OSTaskQPend()用来请求消息,该函数让任务直接接收从其他任务或者 ISR 中发送来
的消息,不需要经过中间的消息队列,函数原型如下:

void *OSTaskQPend (OS_TICK timeout,
 OS_OPT opt,
 OS_MSG_SIZE *p_msg_size,
 CPU_TS *p_ts,
 OS_ERR *p_err)

timeout: 等待消息的超时时间,如果在指定的时间没有接收到消息的话,任务就会被唤醒,接着运行。这个参数也可以设置为 0,表示任务将一直等待下去,直到接收到消息。
opt: 用来选择是否使用阻塞模式,有两个选项可以选择。
OS_OPT_PEND_BLOCKING 如果没有任何消息存在的话就阻塞任务,一直等待,直到接收到消息。
OS_OPT_PEND_NON_BLOCKING 如果消息队列没有任何消息的话任务就直接返回。
p_msg_size: 指向存放消息大小的变量。
p_ts: 指向一个时间戳,表明什么时候接收到消息。如果这个指针被赋值为NULL的话,说明用户没有要求时间戳。
p_err: 用来保存调用此函数后返回的错误码。
在这里插入图片描述

2. 发送任务内建消息

函数 OSTaskQPost()可以通过一个任务的内建消息队列向这个任务发送一条消息,同外置的消息队列一样,一条消息就是一个指针,函数原型如下:

void OSTaskQPost (OS_TCB *p_tcb,
 void *p_void,
 OS_MSG_SIZE msg_size,
 OS_OPT opt,
 OS_ERR *p_err)

p_tcb: 指向接收消息的任务的 TCB,可以通过指定一个 NULL 指针或该函数调用者的TCB 地址来向该函数的调用者自己发送一条消息。
p_void: 发送给一个任务的消息。
msg_size: 指定发送的消息的大小(字节数)。 opt: 指定发送操作的类型,LIFO 和 FIFO 只能二选一。
OS_OPT_POST_FIFO 待发送消息保存在消息队列的末尾
OS_OPT_POST_LIFO 待发送的消息保存在消息队列的开头
上面两个选项可以搭配下面这个选项一起使用。
OS_OPT_POST_NO_SCHED 指定该选项时,在发送后不会进行任务调度,因此,该函数的调用者还可以继续运行。
p_err: 用来保存调用此函数后返回的错误码
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_51963216/article/details/123937142