RealView编译工具armcc可以将c/c++ source code编译成arm target的object文件。
关于armcc的指导文档可以参照
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0206ic/Chdefbgg.html
同样可以在上面查找关于ARM体系结构,ARM软件开发工具,RealView链接工具等主题的参考文档。上面的文档构成一个系列,在开始正式面向硬件开始C coding之前,这些基础知识是要熟悉的。不然写出的程序在SOC上怎么跑的都不甚了了,总是个欠缺。
1. 关于armcc
在我用的Keil [miu]Version3中,对于STM32f103 soc的工程,Options for Target '$project_name'->C/C++中Complier control string如下:
-c --device DARMSTM -D__MICROLIB -g -O0 --apcs=interwork -I..\SYSTEM\delay -I..\SYSTEM\sys -I..\SYSTEM\usart -I..\HARDWARE\LED -I..\HARDWARE\KEY -I "d:\Keil\ARM\INC\ST\STM32F10x" -o "*.o" --omf_browse "*.crf" --depend "*.d"
参照上面的RealView编译工具指南,逐个探究其含义。
-c::此选项指示armcc只编译不连接。注意此处是小写字母c。
--device:指示为哪个微控制器或者SoC生成目标代码。
-D:在命令行中定义宏。例如,-D__MICROLIB等效于C语句#define __MICROLIB 1。-D后可以接多个宏,以逗号隔开。注意逗号和宏名称之间不能含有空格。
-g:提示编译过程中生成调试用的符号表。
-O0:-O之后接数字(可取[0-3])表示编译器对source code的优化等级。
--apcs:这些字母是《ARM 体系结构的过程调用标准》的英文首字母缩写。以下是摘录自《RealView编译工具-编译器指南》
“语法
--apcs=qualifer...qualifier
其中,qualifier...qualifier 表示限定符的列表。该列表必须符合下列条件:
• 至少包含一个限定符
• 其中的各限定符之间没有空格分隔。
qualifier 的每个实例必须为下列值之一:
/interwork、/nointerwork
在支持或不支持 ARM/Thumb™ 交互操作的情况下生成代码。缺省值为 /nointerwork(缺省值为 /interwork 的 ARMv6 及更高版本除外)。
/ropi、/noropi 允许或禁止生成只读位置无关 (ROPI) 代码。缺省为 /noropi。/[no]pic 是 /[no]ropi 的别名。
/rwpi、/norwpi 允许或禁止生成读写且与位置无关 (RWPI) 的代码。缺省为 /norwpi。/[no]pid 是 /[no]rwpi 的别名。/fpic、/nofpic 允许或禁止生成其相对地址引用与程序的加载位置无关的只读且与位置无关的代码。”
-I:include文件搜索路径。
-o:指定输出object文件的名字。若没有指定,-c下.o以源文件名字命名。
--omf_browse:这个选项不知是干嘛的。若有大神知道,还望不吝赐教。
--depend:指定后,生成xxx.d文件,里面含有对其他文件的依赖信息。如:
test.o: test.c
test.o: ..\SYSTEM\sys\sys.h
test.o: ..\SYSTEM\sys\stm32f10x_map.h
test.o: ..\SYSTEM\sys\stm32f10x_conf.h
test.o: ..\SYSTEM\sys\stm32f10x_type.h
test.o: ..\SYSTEM\sys\cortexm3_macro.h
test.o: ..\SYSTEM\sys\stm32f10x_nvic.h
test.o: d:\Keil\ARM\RV31\INC\stdio.h
test.o: d:\Keil\ARM\RV31\INC\string.h
test.o: ..\SYSTEM\delay\delay.h
test.o: ..\HARDWARE\LED\led.h
test.o: ..\SYSTEM\sys\sys.h
test.o: ..\HARDWARE\KEY\key.h
test.o: ..\SYSTEM\sys\sys.h
2. 关于armlink
首选关于armlink的详细介绍可参考博文:
http://blog.csdn.net/sergeycao/article/details/7442319
Options for Target '$project_name'->Linker中Linker control string如下:
--device DARMSTM *.o --library_type=microlib --strict --scatter "TEST.sct"
--autoat --summary_stderr --info summarysizes --map --xref --callgraph --symbols
--info sizes --info totals --info unused --info veneers
--list ".\TEST.map"
-o "TEST.axf"
某些选项与armcc重名,表义也相同。其他的分析如下:
--library_type:选择链接时选用的库类型。可取以下两个值:
standardlib 指定在链接时选择完整的 RealView 编译工具运行时库。
microlib 指定在链接时选择 C 微型库 (microlib)。
--strict:是指严格遵循ISO C/C++语法要求。例如,若从非交互函数获取交互函数的地址,则弹出错误。
--scatter:分散加载文件,作为链接器的输入文件。表明image的组织排布。具体可参考以下博文:
http://blog.chinaunix.net/uid-307610-id-2133296.html
--autoat:此选项控制 __at 节到执行区的自动分配。__at 节是必须放在特定地址的节。
如果启用,则链接器将自动为每个 __at 节选择执行区。 如果不存在适用的执行区,则链接器将创建载入区和执行区以包含 __at 节。
如果禁用,则将应用标准分散加载节选择规则。
--summary_stderr:这个选项不知是干嘛的。若有大神知道,还望不吝赐教。
--info:此选项输出有关特定主题的信息。
--map:此选项启用或禁用内存映射打印。映射包含映像中每个加载区、执行区和输入节 (包括链接器生成的输入节)的地址和大小。
--xref:此选项列出输入节之间的所有交叉引用。输入如下:
ARM Linker, RVCT4.0 [Build 524] for uVision [Standard]
==============================================================================
Section Cross References
stm32f10x.o(RESET) refers to stm32f10x.o(STACK) for __initial_sp
stm32f10x.o(RESET) refers to stm32f10x.o(.text) for Reset_Handler
stm32f10x.o(RESET) refers to usart.o(.text) for USART1_IRQHandler
stm32f10x.o(.text) refers to entry.o(.ARM.Collect$$$$00000000) for __main
--callgraph:此选项创建包含函数静态调用图的文件。 调用图将为映像中的所有函数提供定义和参考信息。缺省输出格式为 HTML。
--symbols :此选项允许列出链接步骤中使用的每一个局部和全局符号及其值。启用后有如下输出:
Image Symbol Table
Local Symbols
Symbol Name Value Ov Type Size Object(Section)
../../microlib/division.c 0x00000000 Number 0 uldiv.o ABSOLUTE
../../microlib/division.c 0x00000000 Number 0 uidiv.o ABSOLUTE
...STM32F10x.s 0x00000000 Number 0 stm32f10x.o ABSOLUTE
cdrcmple.s 0x00000000 Number 0 cdrcmple.o ABSOLUTE
dc.s 0x00000000 Number 0 dc.o ABSOLUTE
handlers.s 0x00000000 Number 0 handlers.o ABSOLUTE
init.s 0x00000000 Number 0 init.o ABSOLUTE
test.c 0x00000000 Number 0 test.o ABSOLUTE
RESET 0x08000000 Section 236 stm32f10x.o(RESET)
.ARM.Collect$$$$00000000 0x080000ec Section 0 entry.o(.ARM.Collect$$$$00000000)
.ARM.Collect$$$$00000001 0x080000ec Section 4 entry2.o(.ARM.Collect$$$$00000001)
.ARM.Collect$$$$00000004 0x080000f0 Section 4 entry5.o(.ARM.Collect$$$$00000004)
.ARM.Collect$$$$00000007 0x080000f4 Section 8 entry7.o(.ARM.Collect$$$$00000007)
.ARM.Collect$$$$00002712 0x080000fc Section 4 entry2.o(.ARM.Collect$$$$00002712)
__lit__00000000 0x080000fc Data 4 entry2.o(.ARM.Collect$$$$00002712)
.emb_text 0x08000100 Section 2 sys.o(.emb_text)
.text 0x08000104 Section 28 stm32f10x.o(.text)
--list:此选项将 --info、--map、--symbols、--verbose、--xref、--xreffrom 和 --xrefto 命令的输出中的诊断消息重定向到指定的file。