嵌入式基础–管理RTOS内存性能和使用情况的7个技巧

对于开发者为什么拒绝使用RTOS,我通常会为其提供两个借口:
•RTOS内存占用太大
•RTOS的开销太大

这些借口可能在五年前就已经有了一些优点,但是今天它们却毫无价值。典型的RTOS将使CPU负载少于4%,需要少于16 KB的闪存空间和少于4 KB的RAM。在大多数情况下,性能和内存问题与开发人员如何使用RTOS以及他们在如何正确使用和配置RTOS方面的知识空白有关。以下是开发人员可以用来优化其RTOS应用程序内存使用情况的七个技巧。

提示#1 –每个任务的最坏情况堆栈分析

最大的内存浪费者之一是为任务堆栈分配的内存。默认情况下,大多数RTOS将分配一个千字节来容纳任务堆栈,其中包含诸如局部变量,数据结构和函数调用返回地址之类的内容。默认大小的问题在于,刚使用RTOS的开发人员通常不会检查每个任务并正确调整堆栈大小。即使64个字节就足够了,只闪烁几个LED且不执行其他任何操作的任务通常也需要一千字节的堆栈空间。如果不检查每个任务并没有正确调整堆栈大小,则会导致使用的RAM比应用程序实际需要的RAM多得多。

提示2 –避免过多使用堆栈

由于每个任务都有一个堆栈,因此任务堆栈成为运行应用程序所需的RAM的巨大贡献者。开发人员在设计和执行任务时,应尽量减少堆栈使用。这可以通过以下方式完成:
•避免递归函数
•最小化函数调用
•避免大型本地数据结构
开发人员不仅需要编写代码,还需要仔细考虑每个变量,数据结构和函数调用对内存和性能的影响。避免过多的堆栈使用量将使开发人员能够缩小堆栈大小并节省RAM使用量。

技巧3 –使用内存块池

开发人员在开发基于RTOS的应用程序时经常会遇到的一个大问题是,他们需要动态分配内存。动态内存分配的问题在于,通常会从行为类似于字节池的堆中分配内存。堆和字节池具有许多缺点,例如:
•它们可能会碎裂
•内存分配是不确定的
另一方面,块池位于固定的块中,这些块不仅可以确定性地分配,而且也不会分段。对于需要动态分配内存的开发人员,块池是比堆或字节池更好的选择。

提示4 –最小化RTOS对象

实时操作系统 可以帮助开发人员将应用程序分解为可重用的,半独立的程序,这些程序使用RTOS对象(例如信号量,互斥对象和消息队列)来通信和同步任务执行。每个RTOS对象确实都有一个与之关联的控制块,该控制块使用少量的内存。在资源非常有限,受限制的应用程序中,或者如果开发人员过度使用了这些资源,则可能会使用比实际需要更多的内存。因此,开发人员应仔细设计其RTOS应用程序,并尽量减少使用多少RTOS对象。

提示5 –考虑使用事件标志代替信号量

实时操作系统 的功能可能因一个RTOS的不同而有所差异,但在作者使用的几种不同的RTOS中,使用事件标志代替信号量可能会导致占用空间略小。信号量不仅包含控制块,还包含一些用于执行信号量操作(如发出和获取信号量)的基本代码。通常,与事件标志相比,此代码趋向于更慢并且使用更多的内存。事件标志实际上只不过是一个存储位置,其中存储位置中的每个位都代表一个事件,例如按下按钮或刚刚对温度传感器进行采样。

提示#6 –最小化任务优先级

实时操作系统允许开发人员设置可以设置任务的优先级。例如,许多系统的默认值是0到31。在某些情况下,默认值的范围可能是0到128,甚至0到1024。通常,任务优先级越低,则可以提高性能并减少内存使用量。开发人员应尝试将优先级设置保持在0到31之间,除非有充分的理由进行设置。

提示#7 –优化RTOS配置文件

实时操作系统 通常将具有一个配置文件,允许开发人员对RTOS行为进行微调。该配置文件允许开发人员设置功能,例如默认堆栈大小,多少可用优先级以及构建中将包括哪些同步对象。在许多情况下,对配置文件进行修改可以为开发人员提供较小的RTOS占用空间,甚至可以根据可用的配置选项来提高性能。确保您检查了RTOS配置文件并了解所有可用选项。

结论
如果未正确使用RTOS,可能会导致应用程序所需的内存占用量膨胀到无法使用的水平。在许多情况下,高内存使用量是由于开发人员使用RTOS的方式而不是RTOS本身的指示。在本文中,我们研究了开发人员可以遵循的一些技巧,以帮助最大限度地减少自己的RTOS应用程序占用空间。

2 thoughts 上 “Embedded Basics –管理RTOS内存性能和使用情况的7个技巧”

  1. 你好雅各布,

    我没有’不能理解技巧#3 –使用内存块池…
    能否请您提供有关它的更多详细信息?

    最好的祝福,
    阿雷兹基

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.