我一直致力于为我们的特定产品开发一项功能。有人请求将相同的功能移植到另一个产品。该产品基于 M16C 微控制器,传统上具有 64K 闪存和 2k RAM。
它是一个成熟的产品,因此只剩下 132 字节的 Flash 和 2 字节的 RAM。
要移植请求的功能(功能本身已经过优化),我需要 1400 字节的闪存和 ~200 字节的 RAM。
有人对如何通过代码压缩检索这些字节有任何建议吗?当我试图压缩已经存在的工作代码时,我会寻找哪些具体的东西?
任何想法都将不胜感激。
谢谢。
我一直致力于为我们的特定产品开发一项功能。有人请求将相同的功能移植到另一个产品。该产品基于 M16C 微控制器,传统上具有 64K 闪存和 2k RAM。
它是一个成熟的产品,因此只剩下 132 字节的 Flash 和 2 字节的 RAM。
要移植请求的功能(功能本身已经过优化),我需要 1400 字节的闪存和 ~200 字节的 RAM。
有人对如何通过代码压缩检索这些字节有任何建议吗?当我试图压缩已经存在的工作代码时,我会寻找哪些具体的东西?
任何想法都将不胜感激。
谢谢。
您有两个选择:首先是查找冗余代码并将其移至单个调用以消除重复;第二个是删除功能。
仔细查看您的 .map 文件,看看是否有可以删除或重写的函数。还要确保确实需要正在使用的库调用。
除法和乘法之类的某些事情会引入大量代码,但使用移位和更好地使用常量可以使代码更小。还可以查看字符串常量和printf
s 之类的内容。例如,每个printf
都会吃掉你的 rom,但你可以有几个共享的格式字符串,而不是一遍又一遍地重复那个字符串常量。
对于内存,看看您是否可以摆脱全局变量并在函数中使用自动变量。还要避免在主函数中使用尽可能多的变量,因为它们会像全局变量一样占用内存。
查看列表文件(汇编器)输出以查找您的特定编译器特别不擅长的东西总是值得的。
例如,您可能会发现局部变量非常昂贵,如果应用程序足够简单,值得冒险,将一些循环计数器移动到静态变量中可能会节省大量代码。
或者数组索引可能非常昂贵,但指针操作要便宜得多。或相反亦然。
但是看汇编语言是第一步。
例如,-Os
GCC 中的编译器优化在速度和代码大小之间提供了最佳平衡。避免-O3
,因为它可能会增加代码大小。
对于 RAM,请检查所有变量的范围 - 您是否使用 int 可以使用 char?缓冲区是否比他们需要的大?
代码压缩非常依赖于应用程序和编码风格。您剩下的金额表明,代码可能已经经过了一些挤压,这可能意味着几乎没有剩下的东西了。
还要仔细看看整体功能 - 是否有一些没有真正使用并且可以丢弃的东西?