历史上的今天
今天是:2024年12月21日(星期六)
2020年12月21日 | TQ210学习笔记——uboot代码搬移
2020-12-21 来源:eefocus
学习资料:TQ210开发板+国嵌教学视频
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
代码搬移:指的是启动过程中,将剩下的启动代码搬移到内存里面(对于210来说,bootloader代码大于96KB时,肯定要将BL2搬移到内存,因为210启动过程规定,BL2不能大于80KB)
本文讲的是从SRAM搬移到内存中,不是nandflash搬移到内存。原因如下:
(1)若要从nandflash搬移到内存,必须先对nandflash初始化,这部分还没学到,故暂时无法从nandflash搬移到内存
(2)只有当bootloader大于一定值时,BL1才会将BL2从nandflash搬移到内存,我们现在写的uboot远小于4kb,故暂时不需要从nandflash搬移到内存,可以直接在SRAM中运行。之所以将从SRAM搬移到内存,只是是为了学习搬移方法。更规范的应该是从nandflash搬移到内存。
如何进行代码搬移?
搞清楚起点、终点、搬移方式
一、210搬移起点:
210的SRAM就是IRAM,起始地址是0xd0020000。如下图

就是IRAM地址了,为什么是它?因为210启动时候,IROM内固化的程序(BL0)会将BL1自动拷贝到BL1内,也就是拷贝到96KB空间的IRAM中,IRAM就相当于2440和6410中的steppingstone了,只不过210没有这一说法罢了。看下图。

二、搬移终点:
1、连接器脚本文件中的链接地址的作用,下面介绍两个作用
(1)在C语言编程中,若中途调用了摸个函数,如调用reset()函数,则PC指针就会被赋予reset的链接地址。属于绝对跳转
(2)在汇编时,若用到伪指令ldr跳转到reset函数处ldr pc, =reset,则PC也会被赋予reset的链接地址。属于绝对跳转
2、关于相对跳转和绝对跳转。
(1)相对跳转 b跳转是相对跳转
跳转后,PC=当前PC值+欲跳转标号跟当前PC在相对地址表中的差值(也就是链接地址的差值,这部分描述可能有问题,反正是这个意思)如下图(uboot代码)

Start是程序入口,连接器脚本中设置的地址是0x20000000。第一条语句是b reset,跳转到reset执行。整个程序编译链接后生成elf格式文件,用arm-linux-objdump反汇编,查看反汇编得到的文件,可以看到第一条语句地址(也就是bl reset这句)是0x20000000

而reset标号所在地址(也就是跳转的目的地)是0x2000005c,如下图

如果执行的是相对跳转的话(b指令正是相对跳转),执行这条指令后,PC=当前PC+(0x2000005c-0x20000000)。芯片上电后,PC值必为0,故当前PC就是0。所以,执行完该语句后,PC=0+(0x2000005c-0x20000000)。
(2)绝对跳转
上面1中的两个例子都是绝对跳转,执行完绝对跳转后,PC指针值就会变成链接地址了。即若果通过绝对跳转去执行reset,则执行完跳转指令后,PC=0x2000005c(跳到内存里去了)
链接起始地址,决定着程序第一行代码在内存中的位置即程序在内存的起始地址。搬移的时候,要参考链接起始地址,将代码搬移到内存中相应的位置。
链接起始地址就是代码搬移的终点。视频教程是这么讲的,但是不是特别理解,这部分后续琢磨,知道的朋友麻烦介绍下,或者给个链接我自己看。下面贴上代码搬移程序。
@专题9 代码搬移
copy_to_ram:
ldr r0, =0xd0020000 @搬移起点
ldr r1, =0x20000000 @搬移终点
add r3, r0, #(1024*4) @r3=起点+复制的数据量(4KB)
copy_loop:
ldr r2, [r0], #4 @开始读数据,因为一次32位,所以读完后地址要后移4个字节
str r2, [r1], #4 @将读出的数据拷贝到内存中,同样一次拷贝32位,拷贝完后内存地址后移4字节
cmp r0, r3 @判断有没搬移完4KB数据
bne copy_loop
mov pc, lr @回到调用点
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:25 编辑 【何谓天下会】 LabVIEW天下会是美国国家仪器公司(NI)与 GSDZone 网站联合举办的全球华人LabVIEW开发者竞赛,旨在提供一个让广大LabVIEW爱好者互相交流开发经验,切磋编程技术的平台。 LabVIEW天 ...… 查看全部问答> |
|
Java 1、有电子地图开发经历、或工作流开发相关经历,没有此项经验者勿投! 2、有三年以上java开发经验,有Webservice开发相关项目经验,有良好的编程习惯,熟悉J2EE体系架构及B/S三层结构系统的开发。 3、有一定的设计能力,至少一个大中型w ...… 查看全部问答> |
|
int MAX_SIZE = 256; HKEY hKey1; wchar_t *key1Value = L\"abc\";//这里写成中文结果也相同 char *key1buf = new char[MAX_SIZE]; &nb ...… 查看全部问答> |
|
我正在做一个东西,需要将蓝牙协议栈整个移植到arm9的Linux2.4.18中,源码是Bluez,PC上装了Red Hat9,现在毫无头绪,不知哪位大虾做过这方面的工作,请多多指点,先谢谢了! E_MAIL.:duan.gexin@byd.com.cn… 查看全部问答> |
|
基于FSSDC-9B506-EK Easy Kit的作品(1) 去年暑假期间,富士通公司举办了“2010-2011富士通半导体杯创意未来电子竞赛”,我有两个学生参加这个比赛。做了点东西,应该说还行吧。现在富士通在论坛征集建议,刚好他们使用的开发板就是Cortex-M3 Easy Kit,作为响应吧,我就把他们 ...… 查看全部问答> |
|
因为我们省的电子设计比赛里希望我们用TI的单片机,所以我学了一下LM3S,发现这个单片机没什么优点……(也许是我太菜了,说错请喷)AD不能当IO,一组IO最多8个口,还有4个的(为什么不把4个的合成8个?),定时器少而且PWM不能分频(WHY?),100 ...… 查看全部问答> |




