Table of Contents
1、代码启动过程简要分析
问题1:代码下载到哪里去?
数据手册上会有说明,位置不是我们想往哪里下载就往哪里下载的,下载错了启动的时候就找不到代码的位置在哪,一般是下载到如下存储设备中:1、内部自带的FLASH, 2、外扩NANDFLASH(EMMC), 3、外扩NORFLASH, 4、SD卡,(存储地址)
1、大部分单片机(stm32)是下载到内部自带FLASH中,起始地址是严格指定的(如0x08000000)
2、大部分运行安卓或者linux的ARM一般是下载到SD卡或者外扩的FLASH(EMMC)中,然而在SD卡或者EMMC中的起始位置是严格规定的(比如第0块开始存放,或者跳过一块,从第1块位置开始存放)
问题2:从哪个位置去加载代码,加载到哪里去运行?
1、以上存储设备分两种,一种是可以直接运行代码的存储设备(内部自带FLASH、外扩NORFLASH),一种是不能直接寻址运行代码的设备(SD卡,NANDFLASH、EMMC)
2、一般芯片都有启动引脚,我们需要根据我们下载代码的位置来正确配置启动引脚的高低电平,这样上电才能正确启动代码
3、对于可以直接运行代码的存储设备,前期不需要加载代码,而是直接从该设备的起始位置运行代码,至于后期是否需要加载代码到其它位置运行就看程序员的期望运行地址(链接脚本里面编写的链接地址),如果没啥期望(用编译软件默认的链接地址,而编译软件默认的链接地址和实际运行地址都是一样的)那就不需要做任何拷贝代码动作,代码从头跑到尾(stm32等单片机之类的芯片就是这种情况),如果程序员希望一部分代码在其他位置运行,就需要修改后期代码的链接地址而不是一直系统默认地址,在前期代码中把后期代码拷贝到理想位置,然后长跳转到理想位置去运行(此情况如下:我们有时候觉得FLASH速度太慢,需要把代码拷贝到RAM中运行)(代码重定位)
4、对于不可以直接运行代码的存储设备,前期芯片内部的固件会把一部分代码加载到默认的内存位置(内部RAM)运行,为什么是一部分呢,因为此情况一般是代码很大(比如跑linux系统)内部RAM资源有限,所以只能加载一部分代码到内部RAM,另外一部分大多数代码就需要加载到外扩的RAM中运行,所以程序员自己编写链接脚本(链接地址)希望把后面的一部分代码能加载到他期望的地址去运行,并且程序员编写前期运行的代码(位置无关码)中包含拷贝函数,拷贝函数把后一部分代码拷贝到理想位置(代码重定位),在运行完前期代码后实现长跳转,跳转到理想的链接位置去运行
总结:
从哪里加载代码根据启动引脚指定,加载到哪里运行代码分前期和后期,前期运行基本都是加载到默认地方运行,后期代码根据自己需求位置来加载运行(大部分单片机还是系统默认,大部分跑

本文深入探讨了嵌入式系统中代码的存储地址、运行地址和链接地址的概念,解析了位置有关码与位置无关码的区别,以及代码重定位的过程。通过实例讲解,帮助读者理解代码在不同存储设备上的加载与运行机制。
最低0.47元/天 解锁文章
1457

被折叠的 条评论
为什么被折叠?



