MCU 上有两个 UART:需要(或明智)FreeRTOS?

Posted

技术标签:

【中文标题】MCU 上有两个 UART:需要(或明智)FreeRTOS?【英文标题】:Two UARTs on MCU: FreeRTOS required (or wise)? 【发布时间】:2021-09-30 13:18:00 【问题描述】:

我想用一个带两个 UART 的小型 stm32G0:

一个 RX 从 RFID 阅读器接收约 300 个字节,大约每秒一次,115kbaud。每次收到消息时,我都会将消息解析为简单的 Modbus 数据(涉及 CRC 校验) RX 每秒接收 8 字节请求 (Modbus),TX 计算 CRC 并在 30-200 毫秒 (Modbus) 后发出 40 字节响应。 9600 波特。

此外,没有任务。

我知道这可以使用 FreeRTOS 完成,但我是新手,虽然会弄明白,但我想知道它是否能像保持简单时一样稳定。但我不得不承认,我还没有想出如何保持这种简单:

每秒接收一个 300 字节的消息(不固定),检查 CRC16,解析出大约 10 个浮点值(在 ascii 中),将它们转换为 IEEE754 浮点,准备好被请求(其中一些,或全部他们) 在另一个 RX 上侦听传入的 Modbus 请求,检索 1-10 个浮点值,创建(=简单)消息并计算 CRC16

我的问题是它是否可以在没有 freeRTOS 的情况下完成。如果是,是否可取。

【问题讨论】:

RTOS 让它变得如此简单。这是明智的,但不是必需的。你甚至不需要使用 C 语言——你可以用汇编程序编写它。或者,如果它硬编码版本 - 直接创建二进制文件,无需汇编器、编译器和链接器 【参考方案1】:

您可能不需要此项目的 RTOS。

主要有3个部分:

    使用 DMA 和/或中断填充 RFID RX 缓冲区的一些逻辑 使用 DMA 和/或中断填充 Modbus RX 缓冲区的一些逻辑 主循环:
do forever 
    Process RFID RX buffer, parse text
    Possibly update Modbus registers using the parsed values
    Process Modbus RX buffer, arm USART TX DMA with the response

如果此循环可以在 Modbus 主站超时或 RFID 阅读器发送另一个包之前执行,那么您就完成了。如果没有,您可以将您的 Modbus 处理(可能比 RFID 具有更严格的时序要求)移动到 ISR。通常,在 ISR 中做耗时的工作不是一个好主意,但在你的情况下,考虑到你的 uC 没有太多事情要做,我认为没关系。

【讨论】:

听起来不错!使用两个 DMA 缓冲区进行接收超出了我的想象。但如果你问我,它完全解决了时间问题。之前没有将 DMA 用于 RX。在那里可以学到一些东西。听起来只是直接接收到内存。我是一般的,比运行 RTOS 开销更好?你说得对,没有其他任务。你会说这比 @JeromeBu1982 , 虽然这个项目不需要 RTOS,但使用它可能是一个很好的学习实践。通过允许在 RFID 解析过程中切换 Modbus 请求处理,可以使编程更容易。同样,使用中断而不是 RTOS 也可以达到类似的效果,但效果会很差。 RTOS 需要一些内存开销,但不必太担心执行时间开销。 好的,太好了。所以有人称它为“明智的”(甚至是“合乎逻辑的”)。稳定的 freeRTOS 应用程序怎么样?它会像拥有良好内存管理的自己的代码一样运行多年吗?我有 32kB 闪存和 8kb RAM FreeRTOS 需要大约 8kB 闪存,具体取决于您的配置。我不知道内核本身的 RAM 使用情况。稳定性与是否使用 RTOS 没有直接关系。但总的来说,要避免动态内存 malloc() 和 free(),因为它们会导致内存碎片并损害系统的稳定性。在初始化期间执行一次 malloc() 可能没问题,这是您在使用 FreeRTOS 时通常会做的事情。 @JeromeBu1982 ,它有自己的动态分配系统,实际上不止一种可供选择。您可以避免它们并使用它提供的静态分配选项,但使用静态分配需要更多的编码。查看 API 参考。

以上是关于MCU 上有两个 UART:需要(或明智)FreeRTOS?的主要内容,如果未能解决你的问题,请参考以下文章

MCU通过UART实现OTA在线升级流程

MCU通过UART实现OTA在线升级流程

STM32 通过引导加载程序闪烁失败 (UART1)

模拟串口UART的实现

pyb库

驱动之SPI,UART,I2C的介绍与应用20170118