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