处理器运行原理:代码存储地址和运行地址

因此我们现在需要做的就是确定一下本试验最终的可执行文件其运行起始地址,也就是
链接地址。这里我们要区分“存储地址”和“运行地址”这两个概念,“存储地址”就是可执
行文件存储在哪里,可执行文件的存储地址可以随意选择。“运行地址”就是代码运行的时候
所处的地址,这个我们在链接的时候就已经确定好了,代码要运行,那就必须处于运行地址
处,否则代码肯定运行出错。比如 I.MX6U 支持 SD 卡、EMMC、NAND 启动,因此代码可以
存储到 SD 卡、EMMC 或者 NAND 中,但是要运行的话就必须将代码从 SD 卡、EMMC 或者
NAND 中拷贝到其运行地址(链接地址)处,“存储地址”和“运行地址”可以一样,比如
STM32 的存储起始地址和运行起始地址都是 0X08000000。
本教程所有的裸机例程都是烧写到 SD 卡中,上电以后 I.MX6U 的内部 boot rom 程序会将
可执行文件拷贝到链接地址处,这个链接地址可以在 I.MX6U 的内部 128KB RAM 中
(0X900000~0X91FFFF),也可以在外部的 DDR 中。本教程所有裸机例程的链接地址都在 DDR
中,链接起始地址为 0X87800000。I.MX6U-ALPHA 开发板的 DDR 容量有两种:512MB 和
256MB,起始地址都为 0X80000000,只不过 512MB 的终止地址为 0X9FFFFFFF,而 256MB 容
量的终止地址为 0X8FFFFFFF。之所以选择 0X87800000 这个地址是因为后面要讲的 Uboot 其
链接地址就是 0X87800000,这样我们统一使用 0X87800000 这个链接地址,不容易记混。
确定了链接地址以后就可以使用 arm-linux-gnueabihf-ld 来将前面编译出来的 led.o 文件链
接到 0X87800000 这个地址,使用如下命令:
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf

 

 

当 BOOT_MODE1 为 0,BOOT_MODE0 为 1 的时候此模式使能,串行下载的意思就是可
以通过 USB 或者UART 将代码下载到板子上的外置存储设备中,我们可以使用 OTG1这个USB
口向开发板上的 SD/EMMC、NAND 等存储设备下载代码。我们需要将 BOOT_MODE1 拨到
“OFF”,将 BOOT_MODE0 拨到“ON”。这个下载是需要用到 NXP 提供的一个软件,一般用来最终量产的时候将代码烧写到外置存储设备中的,我们后面讲解如何使用。

在图 9.2.1 中 BT_FREQ 模式为 0,可以看到,boot ROM 会将 I.MX6U 的内核时钟设置为
396MHz,也就是主频为 396Mhz。System PLL=528Mhz,USB PLL=480MHz,AHB=132MHz,
IPG=66MHz。关于 I.MX6U 的系统时钟,我们后面会详细讲解。
内部 boot ROM 为了加快执行速度会打开 MMU 和 Cache,下载镜像的时候 L1 ICache 会打
开,验证镜像的时候 L1 DCache、L2 Cache 和 MMU 都会打开。一旦镜像验证完成,boot ROM
就会关闭 L1 DCache、L2 Cache 和 MMU。
中断向量偏移会被设置到 boot ROM 的起始位置,当 boot ROM 启动了用户代码以后就可
以重新设置中断向量偏移了。一般是重新设置到我们用户代码的开始地方,关于中断的内容后
面会详细讲解。

 

因此,处理器内部bootRom程序会执行CPU最初初的一些初始化。然后才是xx.startup文件(自己可编写,在烧录的bin内)执行,最后才是main函数(自己可编写,在烧录的bin内)执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值