;
}
}
·本文件定义了启动区域和三个执行区域。在大括号外面定义了启动区域(LOAD_FLASH),里面三个定义了执行区域(EXEC_FLASH,32bitRAM,16bitRAM)。
·为了提高运行速度,异常向量(在vectors.s)和异常句柄(在int_handler.c)被重新放置到32bitRAM的零地址开始的地方。
·可以读写的变量被复制到16bitRAM的0x2000地址开始的地方。
·零初始化的数据和可读写数据放在16bitRAM内。
·其他不需要搬运的代码只需要还放在Flash里就好。
3.1 RVCT 的优化级别与优化方向 提到RVCT就不能不提
ARMcc的四个优化级别和两个编译选项,-O1、-O2、-O3、-O4,以及-Otime、-Ospace。-Ospace与-Otime负责给编译器提供代码优化的大方向,告知编译器编译任务的主要目标是代码密度(-Ospace)还是代码性能(-Oti
me)。而-O1、-O2、-O3、-O4则分别代表4种逐次递进的不同优化级别。
OSpace 还是OTime? 显然代码密度与代码执行速度在很多情况下是一对矛盾。以下面的代码为例。例1中左右两段代码可以完成相同的任务,但是左边的有较高的代码密度,右边的则有较高的执行速度。因为当expr = 0时,标志循环结束时,右边的代码可以顺序执行下去;而左边代码必须先跳转至循环体首部判断expr的值,随后再跳转道循环体尾,继续执行下一条指令。
例1 代码速度与尺寸的对比
while (expr) if (expr) do
{ { do
body; { body; }
while (expr);
} }
那么我们什么时候使用Otime 什么时候使用Ospace呢?Otime与Ospace需要
开发人员根据系统实际需求来决定,最好的情况是在两者之间找到一个合适的平衡点,而不是单纯的追求速度或者代码尺寸的缩小。即,将不同的代码模块根据其特性分别使用不同的编译选项。
此外,RVCT编译器支持很多非常有用的编译选项,如--no_inline(取消所有代码的内联函数)、--split_ldm(限制LDM/STM指令的最大操作寄存器数目)、--split_sections(将每个函数,而不是源文件,作为一个编译单元进行操作)等等。
编译器的所有这一切都可以严格根据开发者的要求,帮助开发人员得到系统真正需要的优化过了的代码。
O3 还是O2? 老的开发工具,如ADS1.2中,只有3种递进的代码优化级别,对应3种编译选项,即-O0(Minimum optimization)、-O1(Restricted optimization)、-O2(High optimization )。使用-O0编译选项时,RVCT编译器只对代码作最基本的优化操作,编译结束后用户得到的代码与用户手写源代码之间的差距很小,这种特性的主要作用是为了方便用户在程序开发阶段的调试工作,避免由于优化而产生的调试屏障。此外,很多资深软件工程师偏向于手写优化代码,在这种情况下,由于代码已经被优化过,可以使用-O0编译选项减少RVCT的工作量,节省编译链接的时间。
-O1与-O2则分别是相对于-O0更加高级别的编译优化选项,前者提供有限的优化;后者则会对代码进行较大程度的优化改进操作。RVDS中新增加了-O3(Maximum optimization)编译选项,它可以最大程度的发挥RVCT编译器的优势,将代码编译成最优。O3与O2都是较高级别的编译优化选项,但-O3相比较于-O2,主要优