RVMDK环境下STM32的链接过程

11 篇文章 0 订阅
9 篇文章 0 订阅
编译一开始,RVMDK环境开始对每一个 *.s 文件和 *.c文件进行编译,然后到了“linking”的时候,就是编译器开始对各个文件进行链接。把所有的 *.o文件链接成一个可执行的文件,生成一个 *.hex文件,这个文件就是我们可以下载到flash中执行的文件。

我们再看main()函数下面(在usart.c下面)调用了很多的函数,比如:printf()、lcdWrStr()等等,这个函数根本就不在usart.c函数里面,而是在其它的 *.c函数里面,那在编译的时候编译器根本就不认识这样一些函数,那怎么办呢?于是就只把它当成一个标号预留下来,接着往下编译,直到把所有的*.s 文件和 *.c文件都编译完,那么,在我们所有的目标文件里面会预留相当多的标号,这些标号都会有一些相对的地址,在编译完所有的文件后,即在linking的前面,编译器会将这些所有的标号变成绝对地址,即分配一个物理地址,这样,就实现了对整个工程的链接。

那么,我们怎么知道每段代码的具体位置呢?这个就需要借助一个 *.sct链接脚本的帮助了。在 options 菜单下面我们可以选择系统自带的链接脚本或者自己添加链接脚本。

点击看大图

如上图,如果我们将那个 use Memory Layout from Target Dialog 打钩的话,那么我们就是选择系统自动生成的脚本,如果不打钩的话,那么就是手动添加。我们把钩去掉,按下Scatter File右边的Edit,就可以看到Usart.sct文件的内容了。如下:

; *************************************************************

; *** Scatter-Loading Description File generated by uVision ***

; *************************************************************

LR_IROM1 0x08000000 0x00020000 {    ; load region size_region

ER_IROM1 0x08000000 0x00020000 { ; load address = execution address

   *.o (RESET, +First)

   *(InRoot$$Sections)

   .ANY (+RO)

}

RW_IRAM1 0x20000000 0x00005000 { ; RW data

   .ANY (+RW +ZI)

}

}

我们知道,在启动代码的过程中,对一些全局变量及堆栈的拷贝过程是由一些宏来完成的,这个宏的名字就是 InRoot$$Sections 是由它来完成这样一个定位。

我们来举个例子,如下图所示,

点击看大图

我们将片内ROM空间分成两半,分完后如下:

点击看大图

单击确定。再进行编译,可以看到,Usart.sct文件已经改变了。变成为:

; *************************************************************

; *** Scatter-Loading Description File generated by uVision ***

; *************************************************************

LR_IROM1 0x08000000 0x00010000 {    ; load region size_region

ER_IROM1 0x08000000 0x00010000 { ; load address = execution address

   *.o (RESET, +First)

   *(InRoot$$Sections)

   .ANY (+RO)

}

RW_IRAM1 0x20000000 0x00005000 { ; RW data

   .ANY (+RW +ZI)

}

}

我们可以看到,片内flash已经分为两部分,但是另外一个没有任何文件。我们也可以在另外一部分里面装进数据,如:在 Project workspace里面右击Initialisation,选择“options for Group Initialisation”将“Code/const”选项改为:IROM2 [0x8010000-0x801FFFF],点击确定,再次编译,将会发现,IROM2里面有数据啦~~~

; *************************************************************

; *** Scatter-Loading Description File generated by uVision ***

; *************************************************************

LR_IROM1 0x08000000 0x00010000 {    ; load region size_region

ER_IROM1 0x08000000 0x00010000 { ; load address = execution address

   *.o (RESET, +First)

   *(InRoot$$Sections)

   .ANY (+RO)

}

RW_IRAM1 0x20000000 0x00005000 { ; RW data

   .ANY (+RW +ZI)

}

}

LR_IROM2 0x08010000 0x00010000 {

ER_IROM2 0x08010000 0x00010000 { ; load address = execution address

    STM32_Init.o (+RO)

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值