tag 标签: RVMDK

相关博文
  • 热度 17
    2014-11-24 11:43
    1236 次阅读|
    2 个评论
       EDN博客精华文章   作者: likee   想不想知道在RVMDK环境下面是怎么将STM32的各个用户代码链接成一个HEX文件的呢?下面一一讲解。   我们随便打开一个工程文件,例如:下面一个工程文件,       进行编译一下,出现以下信息:   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).   这里我们可以看到,编译一开始,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 ,点击确定,再次编译,将会发现,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)     }   }   呵呵,如果觉得对你有帮助的话,麻烦帮我点击左上方的“顶一下”,谢谢!
相关资源
  • 所需E币: 0
    时间: 2022-1-8 09:18
    大小: 3.58MB
    上传者: 西风瘦马
    RVMDK介绍,MDK内容简介
  • 所需E币: 4
    时间: 2019-12-25 12:46
    大小: 511.33KB
    上传者: quw431979_163.com
    创建出色的32位微控制器应用的四步骤DESIGNSTRATEGIESANDMETHODOLOGIES创建出色的32位作者微控制器应用的四步骤RodCrawford使用ARMRealViewMicrocontroller选择问题Database有两个版本,一个是www.keil.DevelopmentKit(RVMDK)微控制器开今天,在选择具备所需外围设备组合com/dd上的在线版本,另一个则内建在发套件的四步式指南。和性能并且价格适当的MCU时,开发人RVMDK中。只有基于Web的版本提供参员可选的余地很大。生产基于ARM内核数搜索功能。指南1:选择正确的微控制器的MCU的半导体公司数量超过16家,其……