Keil5-编译
- ■ GCC编译4个阶段
- ■ 预处理->编译->汇编->链接
- ■ GNU工具链开发流程图
- ■ armcc/armasm(编译C和汇编)
- ■ armlink (链接)
- ■ armar (打包)
- ■ fromelf (格式转换器)
- ■ 地址段
■ GCC编译4个阶段
■ 预处理->编译->汇编->链接
■ GNU工具链开发流程图
编译:编译器是armcc和armasm ,每个c/c++和汇编源文件编译成对应的以“.o”为后缀名的对象文件(Object Code,也称目标文件),
链接: 链接器armlink把各个.o文件及库文件链接成一个映像文件“.axf”或“.elf”;
格式转换:一般来说Windows或Linux系统使用链接器直接生成可执行映像文件elf后,内核根据该文件的信息加载后,就可以运行程序了,但在单片机平台上,需要把该文件的内容加载到芯片上,所以还需要对链接器生成的elf映像文件利用格式转换器fromelf转换成“.bin”或“.hex”文件,交给下载器下载到芯片的FLASH或ROM中。
■ armcc/armasm(编译C和汇编)
它调用了-c、 -cpu –D –g –O1等编译选项, 查看MDK的帮助手册,
■ armlink (链接)
armlink是链接器,它把各个O文件链接组合在一起生成ELF格式的AXF文件, AXF文件是可执行的,下载器把该文件中的指令代码下载到芯片后,该芯片就能运行程序了;利用armlink还可以控制程序存储到指定的ROM或RAM地址。
链接器默认是根据芯片类型的存储器分布来生成程序的,该存储器分布被记录在工程里的sct后缀的文件中,有特殊需要的话可自行编辑该文件,改变链接器的链接方式。
■ armar (打包)
armar工具用于把工程打包成库文件
■ fromelf (格式转换器)
fromelf可根据axf文件生成hex、bin文件, hex和bin文件是大多数下载器支持的下载文件格式。
例如如果想利用fromelf生成bin文件,可以在MDK的“Option for Target->User”页中添加调用fromelf的指令:如下
User配置页面中,提供了三种类型的用户指令输入框分别是
编译前(Before Compile c/c++ file)、
构建前(Before Build/Rebuild)
构建后(After Build/Rebuild)执行。
这些指令并没有限制必须是arm的编译工具链,例如如果您自己编写了python脚本,也可以在这里输入用户指令执行该脚本。
■ 地址段
Code: 即代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区。
RO-data: Read Only data,即只读数据域它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。例如C语言中const关键字定义的变量就是典型的RO-data。
RW-data:Read Write data,即可读写数据域例如C语言中使用定义的全局变量,且定义时赋予“非0值”给该变量进行初始化。
ZI-data:Zero Initialie data,即0初始化数据,RW-data的区别是程序刚运行时这些数据初始值全都为0,例如C语言中使用定义的全局变量,且定义时赋予“0值
ZI-data的栈空间(Stack)及堆空间(Heap): 在C语言中,函数内部定义的局部变量属于栈空间,进入函数的时候从向栈空间申请内存给局部变量,退出时释放局部变量,归还内存空间。而使用malloc动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于ZI-data区域的,这些空间都会被初始值化为0值。编译器给出的ZI-data占用的空间值中包含了堆栈的大小(经实际测试,若程序中完全没有使用malloc动态申请堆空间,编译器会优化,不把堆空间计算在内)。