需要在 STM32 上运行 RTOS?

Need for an RTOS on an STM32?

我正在开始一个使用 LittleVGL 作为其 GUI 库的项目。

我使用的是 STM32H743,运行 480MHz。 (它相当强大,但只比速度只有一半但 RAM 和闪存更少的东西贵 1/15%,后者本身需要额外的成本才能使用外部闪存。)

最坏情况下的屏幕绘制时间为 10 毫秒。当我使用 ChromART/DMA2D 实现 LittleVGL 的 blitting 和填充挂钩时,这会变得相当好。

None 的板的非 GUI 操作如果延迟最多 20 毫秒将受到影响。

如果屏幕绘制速度较慢,需要被更紧急的操作打断,则显然需要 RTOS。

当所有操作都快于最紧急的截止日期时,是否有理由使用 RTOS 而不是单个无限循环?

(我不熟悉 FreeRTOS,最重要的是,我没有调试 FreeRTOS 项目的经验。)

我从题块中挑出主要问题开始:

Are there reasons to use an RTOS, rather than a single infinite loop, when all operations are quicker than the deadline of the most urgent?

是的,有。最重要的是:RTOS 是一种将复杂软件划分为易于(甚至微不足道!)维护的部分的方法。此分区考虑了 CPU 在当前软件上花费的时间。只要你的软件在同一个 CPU/controller 上做几件不相关的事情,你就可以简单地应用它。我想将其与将大型整体源代码拆分为小模块和函数进行比较,这些模块和函数负责一小部分内存和程序代码。相比之下,每个 RTOS 任务负责控制器固件完成的一件事。

这就是原因的琐碎部分,为了突出重点,我冒昧地回答了一点。现在出于不那么重要的原因:

使用 RTOS,您还可以拆分软件的某些部分,这些部分不是 运行 独立的,而是代表从输入数据(测量值)到输出数据(设定值)的不同处理阶段。在实际的嵌入式系统中,您经常需要处理如此多的需求,以至于在单个主循环中实现所有需求最终会导致(或在此过程中崩溃)一些您可以一次写下但很难写下的程序代码维护(通过修复越来越小的错误,通过将软件扩展到一些新的想法和需求)如果你 return 一个多星期后对代码进行维护。

对我来说,使用一些 RTOS 的主要动机(它不一定是免费的,但它根本不是一个糟糕的开始)以便将一个单一的软件分解成我的头脑能够处理。

你的问题原本指向不同的方面:

I am starting a project which uses [...] GUI [...]

I'm using an STM32H743, running at 480MHz. (It's rather over-powered, but only /15% more expensive than something half as fast with less RAM and flash, which would itself need external flash at additional cost.)

The worst case screen draw is 10ms. [...] None of the [...] operations would suffer if delayed by up to 20ms.

If the screen drawing was slower, and needed to be interrupted by a more urgent operation, the need for an RTOS would be obvious.

你是对的,使用 RTOS 的另一个原因是以或多或少的动态方式交织系统上的不同进程,以便每项任务在截止日期之前完成。我没有调查您具体案例的所有情况(请参阅引文中的省略号),但我确信这个论点不适用于您目前的情况。关于这个观点的一些注意事项:

  • 您比较单件 µC 硬件的最终价格,这些硬件可能焊接到一些随时可用的评估板上。这是个好主意,我正在为私人项目做同样的事情。但是一旦你为商业产品做专业的嵌入式软件,你就必须考虑多个控制器的价格(取决于你的行业分支,有的几百到几十亿),还有µC本身的价格,因为它是焊接到PCB上的正好适合您正在编程的产品。那么可能没有人会给你一个 STM32H7 之类的东西,除非你真的证明这是控制器 class 你需要实现所有的软件要求。

  • 你只是向我们描述了STM32驱动的screen/GUI,并没有说明屏幕的用途。通常,设备用途暗示了对与控制器 I/O 相关的外围设备的一些实时要求。然后,您可能被迫以少于 10-20 毫秒的延迟处理程序的某些部分。这会引导您首先使用中断,然后(除非您想通过大量手动中断抑制处理上下文之间的每个数据传输)使用 RTOS。

也许我错了,你没有任何限制来执行任何快于 20 毫秒的反应,或者有一天用更便宜的 STM32 替换 STM32H7。然后,剩下的唯一论点就是处理复杂性。当然你可以尝试继续主循环。只要需求足够简单,您可以使用一种“全脑”架构来处理所有需求,您就会成功。

感谢那些在早期评论中贡献了部分答案的人:@Lundin,@Clifford