八位微控制器的代码优化技巧
据开销。
向编译器提供尽可能多的信息
8051 可提供 64K 的地址空间 XDATA、256 字节的堆栈与间接寻址空间 IDATA 以及 256 字节的直接寻址空间 DATA 等多个存储器空间。在大多数情况下,代码编写人员都知道指针指向了哪个存储器空间。如果用户指定了存储器空间,编译器就无需包含对例程中的所有三类存储器进行寻址的代码,只需使用一个即可。由于指针无需包含数据空间信息,因此有助于节约数据空间。
在我的 8051 编译器中,上述变量可通过包含 OPTR 字符串的库例程进行存取。在列表和库文件中搜索对OPTR的引用可以发现长变量被多次使用,而且由于在代码中假定了指针的大小,其中某些长变量还会导致一些问题。
在变量声明中使用 const 关键词可以实现两方面的优化:第一,编译器不必再存储变量的初始值;第二,编译器能在编译时间而非执行时间执行一些数学运算。查看示例程序的编译输出,以确定对 const与 #define 的处理是否真的一样。以下是我对代码的测试:
经过测试,得到以下输出,表明它并不清楚 const 变量的值。
汇编语言
不少嵌入式固件工程师信誓旦旦的表示他们始终能比编译器做得更好,不仅如此,他们还认为应该使用汇编语言重新编写所有代码。然而事实上,现代编译器提供的许多特性已经能赶上人脑的水平了。
变量共享:一些 8 位处理器尚无有效的机制来存取堆栈上的变量。一般的解决方案是创建调用树,并在相互不进行调用的函数间共享变量。在汇编程序中要想保持这种结构相当困难,且容易出错。
可靠性:任何从事专业软件或固件开发工作的人员都能读懂 C 语言程序。如果您需要将代码交给其它开发人员处理,他们无需掌握那些为发挥汇编语言的最大效率而需要的所有技巧便可立即开始修改代码。
可移植性:C 语言最初的开发目的之一就是要提供一种非常抽象,以便可以在多种处理器上应用的语言。这一目标至今仍然非常重要。
代码共享:许多 8 位编译器都能在链接时间之后进行优化,这使得编译器不仅能执行许多人工能完成的优化,而且还能完成一些人工所不能完成的优化。例如,现在许多编译器都能搜索不同函数 中 共 有的代码字符串,并将其合并为一个新的函数。而人类是不可能记住每个编译周期中执行此函数所需要的全部细节的。
汇编语言现在仍占有一席之地。不过,在使用汇编语言之前应首先考虑上述所有因素。
结论
在撰写本文的过程中,我将成熟程序的大小从 0x6000 多字节缩减到了 0x5f2b 字节,节约了 200 多字节。该程序过去曾是多次试图优化程序大小的目标。
- 高效率嵌入式程序开发(04-10)
- 高带宽嵌入式应用中SoC微控制器的新型总线设计 (02-02)
- 基于红外超声光电编码器的室内移动小车定位系统(06-30)
- 基于微控制器的web服务器设计(07-04)
- 低成本ARM系列LM3S101微控制器的结构与应用(03-28)
- 嵌入式应用中的USB主设备功能(05-11)