MDK 链接脚本 sct测试

26次阅读

共计 1575 个字符,预计需要花费 4 分钟才能阅读完成。

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/

正文完
 0