内容简介:程序启动时就是在片内的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/
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Types and Programming Languages
Benjamin C. Pierce / The MIT Press / 2002-2-1 / USD 95.00
A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. The study of typ......一起来看看 《Types and Programming Languages》 这本书的介绍吧!