内容简介:程序启动时就是在片内的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/
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 静态链接和动态链接
- linux中硬链接、软链接的建立
- 微信公众号开发C#系列-10、长链接转短链接
- linux – 硬链接或软链接占用文件系统中的任何空间吗?
- Linux 环境下 gcc 链接库 编译、链接(概览) 以及 自动化工具Makefile的编写
- iPhone慎点链接
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web协议与实践
克里希纳穆尔蒂 (KrishnamurthyBalachander) / 范群波 / 科学出版社 / 2003-7 / 46.0
本书全面论述了传输Web内容的系统和协议,重点讲述了Web中业已成熟和稳定的技术,如TCP/IP协议及DNS技术、HITP/1.0的设计及其与TCP之间的交互;深入阐述了Web高速缓存技术和多媒体流播技术的最新技术动态;分析了Apache Web服务器和Squid代理;还探讨了通信量的分析和测量技术。书中使用了大量示例、技术发展水平报告以及案例分析来阐述Web的工作原理和各个组件之间的交互。本书是......一起来看看 《Web协议与实践》 这本书的介绍吧!