MDK 链接脚本 sct测试

栏目: 编程语言 · 发布时间: 6年前

内容简介:程序启动时就是在片内的RAM上面跑。显然,片内RAM不可能很大。所以在这里就需要增加片外的SDRAM。说来就内存。但是片外内存不可能一开始就能跑程序的。一没初始化,二没有设置时间参数,CPU怎么可能知道片外SDRAM的访问(s3c2440 nand启动,是因为集成了一个nand IP内核,小。但是通吃所有Nand)。再者系统启动时的代码地址和运行地址不见得是一样。因此就会产生代码重定位了。怎么解决了?main函数调用前做好前面这些就ok了。

main函数调用前

程序启动时就是在片内的RAM上面跑。显然,片内RAM不可能很大。所以在这里就需要增加片外的SDRAM。说来就内存。

但是片外内存不可能一开始就能跑程序的。一没初始化,二没有设置时间参数,CPU怎么可能知道片外SDRAM的访问(s3c2440 nand启动,是因为集成了一个nand IP内核,小。但是通吃所有Nand)。再者系统启动时的代码地址和运行地址不见得是一样。因此就会产生代码重定位了。怎么解决了?

main函数调用前做好前面这些就ok了。

__main之前初始化SDRAM

以rt1052初始化为例子

//startup_MIMXRT1052.s
Reset_Handler:
    ...
    LDR     R0, =SystemInit
    BLX     R0
    ...
    LDR     R0, =__main
    BX      R0
    ...

显然是调用 __main 函数之前调用了 SystemInit

查看链接脚本以及*.map文件。反汇编文件

*.map文件

__main                                   0x60002401   Thumb Code     0  entry.o(.ARM.Collect$$$$00000000)
    _main_stk                                0x60002401   Thumb Code     0  entry4.o(.ARM.Collect$$$$00000003)
    _main_scatterload                        0x60002405   Thumb Code     0  entry5.o(.ARM.Collect$$$$00000004)
    ...
    __scatterload                            0x60002861   Thumb Code    28  init.o(.text)
    __scatterload_rt2                        0x60002861   Thumb Code     0  init.o(.text)

连接脚本

//MIMXRT1052xxxxx_nor_txt_sdram.scf
#define m_text_start                   0x60002400
#define m_text_size                    0x03FFDC00

#define m_data_start                   0x80000000
#define m_data_size                    0x01E00000

LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_size {   ; load region size_region
  ...
  ER_m_text m_text_start m_text_size { ; load address = execution address
    * (InRoot$$Sections)
    .ANY (+RO)
  }

 ...
}

汇编文件

** Section #4 'ER_m_text' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR]
    ...
    __main
    _main_stk
    0x60002400:    f8dfd00c    ....    LDR      sp,__lit__00000000 ; [0x60002410] = 0x20020000
    _main_scatterload
    0x60002404:    f000fa2c    ..,.    BL       __scatterload ; 0x60002860

可以看到 __main 地址为0x60002400。置放在ER_m_text 节区的。然后在汇编文件中可以看,

_main_stk设置好SP指针。跳转到 __scatterload

有关 __scatterload 详细内容。在这里看,不细说。

__scatterload会将FLASH中的RW-data复制到RAM中。

  • __scatterload此时在 ER_m_text 节区。

怎么进行重定位的

  • 待续

参考资料

MDK的编译过程及文件类型全解 https://flash-rtd.readthedocs.io/zh_CN/latest/
STM32 _main 里做了什么  http://elmagnifico.me/2017/04/01/STM32-Startup-_main/

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

父与子的编程之旅

父与子的编程之旅

桑德 (Warren Sande)、桑德 (Carter Sande) / 苏金国、易郑超 / 人民邮电出版社 / 2014-10-1 / CNY 69.00

本书是一本家长与孩子共同学习编程的入门书。作者是一对父子,他们以Python语言为例,详尽细致地介绍了Python如何安装、字符串和操作符等程序设计的基本概念,介绍了条件语句、函数、模块等进阶内容,最后讲解了用Python实现游戏编程。书中的语言生动活泼,叙述简单明了。 为了让学习者觉得编程有趣,本书编排了很多卡通人物及场景对话,让学习者在轻松愉快之中跨入计算机编程的大门。 第 2 版新增内......一起来看看 《父与子的编程之旅》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具