如何在嵌入式系统软件中优化或减小RAM大小?

Jeg*_*raj 11 embedded

我正在研究汽车领域的嵌入式软件项目.在我的一个项目中,应用软件占用了近99%的RAM内存.可用的实际RAM大小为12KB.我们使用TMS470R1B1 Titan F05微控制器.我做了一些优化,比如在软件中查找未使用的消息并删除它们,但它仍然不值得减少RAM.你能否通过一些软件优化建议一些减少RAM的好方法?

Cra*_*een 21

与速度优化不同,RAM优化可能需要在这里通过代码"稍微有点".另一方面,可能会出现一些"低悬的果实".

数组和查找表

阵列和查找表可以是很好的"悬挂水果".如果您可以从链接器获取内存映射,请检查RAM中的大型项目.

检查没有const正确使用声明的查找表,它将它们放在RAM而不是ROM中.特别要注意指针的查找表,它需要const在正确的一侧*,或者可能需要两个 const声明.例如:

const my_struct_t * param_lookup[] = {...};  // Table is in RAM!
my_struct_t * const param_lookup[] = {...};  // In ROM
const char * const strings[] = {...};    // Two const may be needed; also in ROM
Run Code Online (Sandbox Code Playgroud)

堆栈和堆

也许您的链接器配置为堆和堆栈保留了大量的RAM,大于应用程序所需的RAM.

如果你不使用堆,你可以消除它.

如果您测量堆栈使用情况并且分配得很好,您可以减少分配.对于ARM处理器,对于多种操作模式,可能有多个堆栈,您可能会发现为异常或中断操作模式分配的堆栈大于所需的堆栈.

其他

如果您已经检查过轻松节省,并且仍然需要更多,您可能需要查看代码并保存"这里有点,有一点".您可以检查以下内容:

全局与局部变量

检查不必要的使用static或全局变量,其中可以使用局部变量(在堆栈上).我已经看到在函数中需要一个小的临时数组的代码,这个代码被声明static,显然是因为"它需要太多的堆栈空间".如果在代码中发生这种情况足够多次,它实际上会节省总体内存使用量,以使这些变量再次本地化.它可能需要增加堆栈大小,但会在减少的全局/静态变量上节省更多内存.(作为附带好处,函数更可能是可重入的,线程安全的.)

较小的变量

变量可以更小,例如int16_t(short)或int8_t(char)而不是int32_t(int).

枚举可变大小

enum可变大小可能比必要大.我不记得ARM编译器通常会做什么,但是我过去默认使用的一些编译器将enum变量enum设为2个字节,即使该定义实际上只需要1个字节来存储其范围.检查编译器设置.

算法实现

重做你的算法.一些算法具有一系列可能的实现,具有速度/存储器权衡.例如,AES加密可以使用动态密钥计算,这意味着您不必将整个扩展密钥存储在内存中.这可以节省内存,但速度较慢.


dan*_*n78 6

删除未使用的字符串文字对RAM使用没有任何影响,因为它们不存储在RAM中,而是存储在ROM中.代码也是如此.

您需要做的是减少实际变量以及可能的堆栈/堆栈大小.我会寻找可以调整大小和未使用的变量的数组.此外,由于内存碎片的危险,最好避免动态分配.

除此之外,您还需要确保查找表等常量数据存储在ROM中.通常可以使用const关键字来实现.


pet*_*mcc 5

确保链接器生成MAP文件 - 它将显示RAM的使用位置.有时你可以找到保存在RAM中的字符串文字/常量之类的东西.有时您会发现其他人将未使用的数组/变量放在那里.

如果你有链接器映射文件,它也很容易攻击使用最多RAM的模块.