【Keil5-编译4个阶段】

■ 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动态申请堆空间,编译器会优化,不把堆空间计算在内)。
在这里插入图片描述

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光芒Shine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值