下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

内核
最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

FreeRTOS 队列
[任务间通信和同步]

FreeRTOS 队列

[另请参阅阻塞多个 RTOS 对象]

队列是任务间通信的主要形式。 它们可以用于在任务之间以及中断和任务之间发送消息。 在大多数情况下,它们作为线程安全的 FIFO(先进先出)缓冲区使用,新数据被发送到队列的后面, 尽管数据也可以发送到前面。


向队列中写入和从队列中读取。 在此示例中,队列被创建来容纳 5 个项目, 并且队列从不会满。


用户模型:最大的简单性和灵活性……

FreeRTOS 队列使用模型既简单又灵活, 这两者通常是不可兼得的。 消息通过队列以副本的方式发送, 这意味着数据(可以是更大的缓冲区的指针)本身被复制到队列中, 而不是队列始终只存储对数据的引用。 这是最好的方法,因为:
  • 已经包含在 C 语言变量(整数、 小结构体等)中的小消息可以直接送入队列。 没有 必要为消息分配一个缓冲区, 然后将变量复制到分配的缓冲区中。 同样,可以直接从队列中将消息读取到 C 变量中 。

    此外,以这种方式向队列发送消息, 允许发送任务立即覆盖发送到队列的变量或缓冲区, 即使发送的消息仍在队列中。 由于变量中包含的数据已复制到队列中, 因此变量本身可重复使用 。 对于发送消息的任务 和接收消息的任务同意哪个任务拥有该消息, 以及哪个任务负责在不再需要时释放该消息, 没有相关要求。

  • 使用按副本传递数据的队列不会阻止队列用于按引用传递数据 。 当消息的大小达到一定程度, 将整条消息逐字节复制到队列中是不现实的, 此时可以定义队列来保存指针, 并将消息的一个指针复制到队列中 。 这正是 FreeRTOS-Plus-UDP 实现 在 FreeRTOS IP 堆栈中传递大型网络缓冲区的方式。

  • 内核独自负责分配用于队列存储区的内存 。

  • 可变大小的消息可以通过定义队列来保存结构体, 其中包含一个指向队列消息的成员, 以及另一个保存队列消息大小的成员。

  • 单个队列可用于接收不同的消息类型, 以及来自多个地点的消息, 方法是将队列定义为保存一个结构体,该结构的一个成员持有消息类型, 另一个成员保存消息数据(或消息数据的一个指针)。 如何解释数据 取决于消息类型。 正是使用这种方式, FreeRTOS-Plus-UDP IP 堆栈的任务才能使用一个队列来接收 ARP 定时器事件、 从以太网硬件接收的数据包、 从应用程序接收的数据包、网络故障事件等的通知。

  • 该实现适用于在内存保护环境中使用 。 一个被限制在受保护的内存区域的任务可以将数据传递给一个被限制在不同的受保护内存区域的任务, 因为通过调用队列发送函数 来调用 RTOS 将提高微控制器的权限等级 。 队列存储区 仅可由 RTOS 访问(具有完整权限)。

  • 提供一个单独的 API 用于中断内部。 将 RTOS 任务中使用的 API 与中断服务程序中使用的 API 分开, 意味着 RTOS API 函数的实现 不承担每次执行时检查其调用上下文的开销。 使用单独的中断 API 也意味着,在大多数情况下,创建 RTOS 感知的中断服务程序对终端用户而言更简单—— 与其他 RTOS 产品相比。

  • 在任何意义上来说,API 都更加简单了。

FreeRTOS 教程书籍 提供更多信息,包括队列、二进制信号量量、互斥锁、计数信号量、 递归信号量,以及包含在配套的示例项目中的简单示例。


阻塞队列

队列 API 函数允许指定阻塞时间。

当一个任务试图从一个空队列中读取时,该队列将 进入阻塞状态(因此它不会消耗任何 CPU 时间,且其他任务可以运行) 直到队列中的数据变得可用,或者阻塞时间过期。

当一个任务试图写入到一个满队列时,该队列将 进入阻塞状态(因此它不会消耗任何 CPU 时间,且其他任务可以运行) 直到队列中出现可用空间,或者阻塞时间过期。

如果同一个队列上有多个处于阻塞状态的任务, 那么具有最高优先级的任务将最先解除阻塞。

参见用户文档的队列管理部分,获取所有与队列相关的 API 函数。 请搜索 FreeRTOS/Demo/Common/Minimal 目录下的文件,您将会看到它们的多个用法示例。

请注意,中断只能使用以 "FromISR" 结尾的 API 函数。





Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.