声明:由于本人知识有限,错误之处,欢迎指正。
STM32 的开发环境是keil uvision5(也称MDK5)。这个软件集成了很多功能,但它不适合学习。 因为它屏蔽了很多内部细节。比如编译,链接的细节。
接下来介绍不使用MDK5来编译裸板程序。
在linux下,编译的基本步骤如下:
1) arm-linux-gcc -c -nostdlib source -o dest
2) arm-linux-ld -nostdlib -nostartfiles -T text=0x48000000 -e entry sources -o dest
3) arm-linux-objcopy -o binary source dest
第一步:编译成目标文件,参数 nostdlib 是不使用标准库文件。因为裸板成没有库可供使用。
第二步:链接多个目标文件,
参数nostdlib 是不使用标准库文件,
参数nostartfiles是不在程序的头部添加标准启动代码。(标准启动是供操作系统调用的一段代码,_start),
参数-T options 中text=0写8000000 定义代码段的开始位置(此地址是物理地址,因为裸板程序一般不开启MMU,在操作系统中MMU会把cpu发过来的虚拟地址转换为真实的物理地址)。
参数-e entry 是定义程序的入口地址。这里一般使用函数名,(函数名代表了函数的入口地址)。
第三步:objcopy - copy and translate object files。拷贝转换二进制文件。
参数-O binary 是只拷贝链接文件中的二进制代码。链接后的文件中有一部分是关于该程序的描述,不属于可执行代码,在操作系统中会检查该部分内容然后去除,在裸板程序中没有其他操作剔除这部分内容,会执行出错。关于程序的描述内容可使用file a.out 查看。
最后得到的文件才是可以在裸板上执行的裸板程序。
MDK5 将这些操作细节都屏蔽了。在学习过程中,我们需要知道裸板程序是怎么来的。