原创 RVMDK环境下STM32的链接过程

2008-7-24 16:55 10378 11 15 分类: MCU/ 嵌入式

想不想知道在RVMDK环境下面是怎么将STM32的各个用户代码链接成一个HEX文件的呢?下面一一讲解。


我们随便打开一个工程文件,例如:下面一个工程文件,


rar


进行编译一下,出现以下信息:


Build target 'EK-STM32F'


assembling STM32F10x.s...


compiling STM32_Init.c...


compiling Retarget.c...


compiling Usart.c...


compiling LCD.c...


linking...


Program Size: Code="2288" RO-data=268 RW-data=288 ZI-data=1040 


FromELF: creating hex file...


".\Obj\Usart.axf" - 0 Error(s), 0 Warning(s).


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


这里我们可以看到,编译一开始,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)


  }


}


 


呵呵,如果觉得对你有帮助的话,麻烦帮我点击左上方的“顶一下”,谢谢!


 


 


 


 
PARTNER CONTENT

文章评论4条评论)

登录后参与讨论

用户1290934 2009-10-2 16:34

写的很不错,谢谢了。

用户160040 2008-8-3 09:17

跟C还是有些区别啊.

用户158444 2008-8-2 22:55

谢谢,学习了.

用户162278 2008-7-28 10:07

兄弟,学习了,你写的博客真是不一样!
相关推荐阅读
daiqiumiao_806246054 2011-01-06 13:57
linux下yum代理设置
    我们在安装好linux后,经常会使用yum来更新系统,但是系统默认的代理是国外的,国内一般的网络不能访问,这里讲解具体做法,把代理换成国内的。attachment download      ...
daiqiumiao_806246054 2010-12-30 09:48
【转】ORACLE 10g下载地址
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit...
daiqiumiao_806246054 2010-11-29 11:06
找工作的进来看
如下是我所有的开放性问题回答,希望对大家有帮助!1.      When choosing your first job/employer, what will you consider and wh...
daiqiumiao_806246054 2010-11-29 09:47
中长期规划---螺旋式上升方式修改完善职业之路
一、中长期职业发展的自我准备1、心态上随时做好准备 机会是给有准备的人的------“有准备”是你在做准备的过程中让“别人”认为你“有准备”!别人是包括你现在的老板和别的老板,以及你身边的人!他们对你...
daiqiumiao_806246054 2010-03-17 21:26
移动
分集方式传输损耗和距离关系光纤网络G网...
daiqiumiao_806246054 2010-03-17 09:40
GSM
特点  使用直观  GSM系统有几项重要特点:防盗拷能力佳、网络容量大、手机号码资源丰富、通话清晰、稳定性强不易受干扰、信息灵敏、通话死角少、手机耗电量低。  技术特点  1.频谱效率。由于采用了高效...
EE直播间
更多
我要评论
4
11
关闭 站长推荐上一条 /3 下一条