FreeRTOS 回调与队列

问题描述 投票:0回答:1

我的 FreeRTOS 应用程序中有两个代码模块:

  • 解析器(从 UART 接收字节并将其解析为消息)
  • Handler(处理这些消息)

将消息从解析器传递到处理程序的最佳方式是什么?

我当前正在使用handler提供的回调函数。一旦parser有消息,它就会调用该函数。我知道回调函数是在 parser 内的接收任务上下文中执行的,尽管它在逻辑上属于 handler...但我想不出这会成为问题的原因。

我还可以使用队列。然后parser会将消息放入队列中,而handler将接收并处理它们。这将是任务之间更清晰的分离。但它会要求 FreeRTOS 在收到消息时进行上下文切换(这真的有多昂贵吗?),我想这也意味着更高的延迟。

只要我不需要运行具有不同优先级的两个模块,是否有任何正当理由不应该使用回调函数?

task ipc freertos
1个回答
0
投票

在不了解您真正想要解析的内容、数据流的速度有多快、传入消息的频率是多少、是否是周期性的、您的 MCU 的功能是什么等的情况下,给出具体的答案并不容易.

我认为最佳实践是使用 DMA 将传入数据存储在缓冲区中。这使 CPU 免于连续读取总线的负担。一旦有足够的字节数可供解析,或者无论解析缓冲区数据的条件是什么,您都可以在任务中进行解析并将解析的信息保留在队列中。然后消费者(处理程序)任务等待队列的内容不为 NULL,一旦有东西需要处理,它就会从队列中获取对象并执行它想做的任何事情。

要回答上下文切换有多昂贵并不容易。如果您使用的是最新的 32 位 MCU,我会说它非常“便宜”。相反,如果您正在尝试使用小型平台(例如 ATMEGA328)进行实验,那么它可能会相当昂贵。无论如何,如果您谈论的是 UART(通常是任何通信接口),那么上下文切换不太可能是您担心延迟的瓶颈。

FreeRTOS 具有非常轻量级但功能强大的内核,用于从汽车到机器人控制的许多实时工业应用。最后,答案严格取决于您真正想要实现的目标。我不明白为什么你需要一个 RTOS。但是,如果您有两个任务,即生产者和消费者,那么您的示例就是竞争条件的典型示例,并且在不使用同步 API 的情况下无法解决它。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.