STMCU小助手
发布时间:2022-8-27 13:59
|
一、链接脚本的作用 链接脚本的作用就是用来指定程序的链接方式的,一个程序中包含各种文件,例如start.o、main.o、led.o等,每个文件有包含如代码段、数据段等各种段,而链接脚本的作用就是用来指定各种文件各种段的链接方式。前面我们都没有使用链接文件,只使用了-Ttext参数来指明代码段的链接地址,其他都是按照默认链接的,使用之前曾强调要将start.o文件放在最前面。 二、编写链接文件 将Makefile中的链接命令改为如下所示
接着编写一个最简单的链接文件stm32f103zet6.ld如下所示,其实这个和之前的-Ttext 0x80100000参数效果是一样的。首先SECTIONS {}是链接文件的语法,表示程序的所有段都在其中;然后. = 0x80100000表示当前地址设置为0x80100000,亦即链接的起始地址为0x80100000;. = ALIGN(4)表示当前地址按4字节对齐;.text表示段名,*(.text)表示将所有文件的代码段都存放在此。
我们打开反汇编文件,可以看到段名为.text的段,同时其链接地址也是从0X8000000开始的
三、指定内存区域 因为对于在STM32F103这类资源紧缺的单片机芯片中: 代码段保存在Flash上,直接在Flash上运行(当然也可以重定位到内存里) 数据段暂时先保存在Flash上,然后在使用前被复制到内存里(只读数据段不复制) 所以我们要给予代码段和数据段不同的保存地址,在链接文件中添加如下内存区域指定说明,分别定义RAM和FLASH两个内存区域,分别对应stm32芯片上的ram和flash区域,其中Flash区域可读可执行,开始地址为0x08000000,长度为512K,Ram区域可读可写可执行,开始地址为0x20000000,长度为 64K
然后添加只读数据段、数据段、BSS段并指定其内存区域,修改完的链接文件如下
然后修改main程序添加如下全局变量
使用make编译,打开反汇编文件,找到如下所示,可以看到这三个段分别存放着刚刚定义的C语言中的全局变量。 首先,只读数据段.rodata中放置加const修饰的变量myconst,其存放在Flash区域; 然后,数据段data中已初始化的全局变量mydata,其存放在Ram区域; 最后,bss段放置未初始化或初始化为零的全局变量,同样也存放在Ram区域。
四、验证 修改mian.c如下所示,添加各个变量地址的打印
编译烧录运行,并于反汇编文件做对比,可以看到,其地址完全符合:
———————————————— Willliam_william |
STM32固件库分享,超全系列整理
【MCU实战经验】基于STM32F103的二轮平衡车(6轴上位机 源代...
10张图带你完全掌握STM32 GPIO,从入门到精通,收藏就够了!
如果你解决了这些问题,就可以直接学STM32
STM32的分类和选型
学习STM32很简单?
STM32到底由什么组成?内核和外设的关系又是怎样的?看这篇!
GD32和STM32的区别在哪里??
入门嵌入式,为什么都要先学STM32??
STM32中断响应延迟优化:从NVIC配置到DMA加速的极致性能调优
微信公众号
手机版