17.2-uC/OS-III消息管理(任务消息队列)

时间:2023-03-10 00:16:14
17.2-uC/OS-III消息管理(任务消息队列)

1.任务的消息队列

uC/OS-III在任务中内建了一个消息队列。用户可以直接发送消息给
任务而不通过外部消息队列。 这个特性不仅简化了代码, 还提供了效
率。每个任务都内建一个消息队列。

17.2-uC/OS-III消息管理(任务消息队列)

uC/OS-III中与任务消息队列相关的服务都是以OSTask???()开头的。

设置OS_CFG.H中的OS_CFG_TASK_EN使能任务的消息队列服务。

与任务消息队列相关的代码在OS_TASK.C中。

2.双向通信

两个任务可以通过两个消息队列同步,这叫做双向通信, 这两个任务间可能互相发送消息给对方。

任务与ISR间不能双向通信,因为ISR不能在消息队列中等待。

17.2-uC/OS-III消息管理(任务消息队列)

这两个消息队列都被初始化为空。当左边的任务到达约定点时,它就会发送消息给顶部消息队列并在底部消息队列中等待消息。

类似的,当右边的任务到达某个时刻,它就会发送消息给底部消息队列,并在顶部消息队列中等待消息。

实现双向通信:

17.2-uC/OS-III消息管理(任务消息队列)

3.流量控制

任务间的通信经常通过从任务A中传送数据给任务B。然而,任务A创建该数据需要时间,且任务B可能在该数据被创建后经过很

长时间才接收到该数据。 换句话说, 如果更高优先级的任务抢占了任务B, 那么任务A所存放在消息队列中的数据就可能被溢出。

解决这个问题的一种方法是在处理中添加流量控制 。

17.2-uC/OS-III消息管理(任务消息队列)

在这里,使用了一个信号量计数值,该值初始化为任务B中消息队列长度。

任务A在发送消息给任务B之前必须获得信号量。任务B消息队列的空余量为多少,

信号量计数值就为多少。

17.2-uC/OS-III消息管理(任务消息队列)

4.保持数据在作用域中

消息通常指向结构体、变量、数组等。然而,数据必须被保持在其作用域( 结构体、 变量、 数组)

中直到接收者完成对这些数据的操作。 消息一旦被发送, 发送者就不能访问被发送的消息中所包含的数

据。这看起来很显然,但经常被忘记。

通过uC/OS-III中的分区管理器动态地分配和回收

内存块用于传递这些数据(消息中所包含的数据)。