如何压缩代码以获得更多闪存和 RAM?

电器工程 嵌入式
2022-01-08 15:42:43

我一直致力于为我们的特定产品开发一项功能。有人请求将相同的功能移植到另一个产品。该产品基于 M16C 微控制器,传统上具有 64K 闪存和 2k RAM。

它是一个成熟的产品,因此只剩下 132 字节的 Flash 和 2 字节的 RAM。

要移植请求的功能(功能本身已经过优化),我需要 1400 字节的闪存和 ~200 字节的 RAM。

有人对如何通过代码压缩检索这些字节有任何建议吗?当我试图压缩已经存在的工作代码时,我会寻找哪些具体的东西?

任何想法都将不胜感激。

谢谢。

4个回答

您有两个选择:首先是查找冗余代码并将其移至单个调用以消除重复;第二个是删除功能。

仔细查看您的 .map 文件,看看是否有可以删除或重写的函数。还要确保确实需要正在使用的库调用。

除法和乘法之类的某些事情会引入大量代码,但使用移位和更好地使用常量可以使代码更小。还可以查看字符串常量和printfs 之类的内容。例如,每个printf都会吃掉你的 rom,但你可以有几个共享的格式字符串,而不是一遍又一遍地重复那个字符串常量。

对于内存,看看您是否可以摆脱全局变量并在函数中使用自动变量。还要避免在主函数中使用尽可能多的变量,因为它们会像全局变量一样占用内存。

查看列表文件(汇编器)输出以查找您的特定编译器特别不擅长的东西总是值得的。

例如,您可能会发现局部变量非常昂贵,如果应用程序足够简单,值得冒险,将一些循环计数器移动到静态变量中可能会节省大量代码。

或者数组索引可能非常昂贵,但指针操作要便宜得多。或相反亦然。

但是看汇编语言是第一步。

例如,-OsGCC 中的编译器优化在速度和代码大小之间提供了最佳平衡。避免-O3,因为它可能会增加代码大小。

对于 RAM,请检查所有变量的范围 - 您是否使用 int 可以使用 char?缓冲区是否比他们需要的大?

代码压缩非常依赖于应用程序和编码风格。您剩下的金额表明,代码可能已经经过了一些挤压,这可能意味着几乎没有剩下的东西了。

还要仔细看看整体功能 - 是否有一些没有真正使用并且可以丢弃的东西?