原文地址:http://blog.eccn.com/space.php?uid=353091&do=blog&id=3837
对于现在的嵌入式应用,没必要花大量时间选择一个 C/C++ 交叉编译器,但你应记住详细的难事。稍微详细的资料让我们使用一个特定的交叉编译器容易一些,减少工程中受挫。理想情况下,应从不考虑你的编译器。它只是你用于将系统行为的算法和规则转化为可执行的程序。
但是,世界不是理想的……当比较两个或更多的交叉编译器,以满足你需要的硬件和软件,你应当考虑些什么事情呢?
有一些好的特性形成巨大的不同:
在线汇编 : 尽管 C 语言的发明已超过 25 年,当开发嵌入式系统时,使用一定数量的汇编仍然是 平常的事。
中断函数: 交叉编译器另一个让人满意的特性是指定中断类型。对 PC 平台,这一非标准关键字是 C 语言普遍增加的。当用作函数声明的一部份,它告诉编译器这个函数是一个中断服务程序( ISR )。编译器能产生额外的堆栈信息和寄存器保存以及任何 ISR 需要的恢复。一个好的编译器也会阻止这种方式定义的函数被程序的其它部分调用。应该明白, C/C++ 中与进出 ISR 相关的上层与汇编中是没有差别的。
例如 CodeWarrior, 尽管进一步深入理解一个处理器的中断向表的结构。这种情况,只需简单地向 ISR 标记添加中断类型 (0x1E) 。这使得中断向量表自动生成,并消除了编程人员潜在的误解和错误。
产生汇编语言: 产生汇编语言清单的编译器,作为汇编处理器的一部分是一个令人满意的工具 。这一特性对手工优化代码很有帮助,因为你能容易地看到你高级语言程序的每一行产生了什么代码,如果一个特定的函数对于给定的应用太慢,你将能够容易地选择函数最好的部分用汇编重写。
标准库 : 当你为通用计算机开发应用软件, 你希望你的编译器包含一套标准 C 函数库,数学库和 C++ 类。它们包含各种程序如 memcpy() 、 sin() 和 cout 等。但由于这些库函数不严格地是 C 或 C++ 语言标准的一部分 ( 库标准是分开的 ), 一个编译器提供商可能省略它,这些省略在嵌入系统程序员使用的交叉编译器提供商中是很普遍的。因些在某些情况下你不得不争取得到标准库的权利。
想一下多少次你花时间重写那些自己的函数。因此花些时间坚持将标准库包含在你购买的编译器中。当然不大可能在多数嵌入式系统应用中使用 printf() ,但直到太迟了你才意识到你需要很多其它的函数。
如果提供了标准库,确保它们能再进去。换句话说,那些库中的每个函数能同时执行多次。重入函数能递归调用或多线程执行。对于库程序这意味着不应使用全局变量。其内部所有数据必须在栈上。
起动代码 : 这是在 main() 前先执行的额外的一段程序。起动代码通常用汇编写成并和你建立的可执行代码连接在一起。它为用高级语言写的程序的执行铺路。
显然,一个编译器缺少我们提到的一些特性,也仍可是一个好的编译器。毫无疑问,人们会争论非标准特性象 “asm” 和 interrupt 关键字减少了代码的兼容性。但若你在两个或多个差不多的交叉编译间选择时,你可能会考虑这些事情。正好你被要求完成这些任务,它们会使你的工作容易。它们的确减少编程受挫。