STM32裸板程序的编译

声明:由于本人知识有限,错误之处,欢迎指正。

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),

扫描二维码关注公众号,回复: 174081 查看本文章

    参数-T options 中text=0写8000000 定义代码段的开始位置(此地址是物理地址,因为裸板程序一般不开启MMU,在操作系统中MMU会把cpu发过来的虚拟地址转换为真实的物理地址)。

    参数-e entry 是定义程序的入口地址。这里一般使用函数名,(函数名代表了函数的入口地址)。

第三步:objcopy - copy and translate object files。拷贝转换二进制文件。

     参数-O  binary 是只拷贝链接文件中的二进制代码。链接后的文件中有一部分是关于该程序的描述,不属于可执行代码,在操作系统中会检查该部分内容然后去除,在裸板程序中没有其他操作剔除这部分内容,会执行出错。关于程序的描述内容可使用file a.out 查看。

最后得到的文件才是可以在裸板上执行的裸板程序。

MDK5 将这些操作细节都屏蔽了。在学习过程中,我们需要知道裸板程序是怎么来的。

猜你喜欢

转载自blog.csdn.net/register_k/article/details/79798449