ARM汇编中的LDR及ADR的区别及其在UBOOT中的应用

发布者:Blissful5最新更新时间:2016-05-10 来源: eefocus关键字:ARM汇编  LDR  ADR  UBOOT 手机看文章 扫描二维码
随时随地手机看文章
我在看U-BOOT的lowlevel_init.S文件时看到以下代码:

lowlevel_init:
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
sub r0, r0, r1
ldr r1, =BWSCON
add r2, r0, #13*4
0:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne 0b
mov pc, lr

这段代码实现了U-BOOT的内存控制器部分的寄存器初始化,一共13个寄存器,对U-BOOT来最重要的就是SDRAM的初始化,显然没有这部分代码,当U-BOOT从NAND FLASH中启动的时候,START.S文件是无法完成代码的relocate的。因为SDRAM没初始化,用不了。

要理解这段代码主要是搞清楚LDR的两种用法。

ldr r0, =SMRDATA的作用是让r0等于U-BOOT编译时已经确定下来的SMRDATA这块内存缓冲池的起始地址。
ldr r1, _TEXT_BASE的作用则是让r1等于_TEXT_BASE这个标号所在的内存里面的内容,也就是 TEXT_BASE。对于MINI2440开发板来说这个值等于 TEXT_BASE = 0x33F80000(\board\samsung\mini2440\config.mk)这个地址是
由于TEXT_BASE实际的地址现在应该是FLASH的0地址(或者内部4KSRAM的0地址),所以第三条指令 sub r0, r0, r1 ,实现了计算SMRDATA当前在arm地址空间里的实际访问地址。
接下去就是通过
ldr r3, [r0], #4 ;从r0这个地址里取一个32bit的数据,放到r3,并将r0+4,指向下一个内存池里的数据。
str r3, [r1], #4 ;这条指令实现了把r3里的数据赋值给r1所标示的地址。r1的地址通过下面这几句实现。以此配置完从0x48000000开始的CPU内部寄存器的值。这样SDRAM就开始工作了。以后就是正常访问0x30000000开始的地址空间了。
#define BWSCON 0x48000000
ldr r1, =BWSCON /* Bus Width Status Controller */
上面的这个配置代码是无法在将U-BOOT直接用OPENJTAG下载到OPENJTAG中时工作的。因为当下载到内存中的时候,SDRAM的地址是随机的,至少不是从0开始的,这样得到的SMRDATA所在的地址按上面的方式是得不到的,所以需要一条在运行时地址与位置无关的指令。这就是 adr指令。下面代码就是改进后的:
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
ldr r0, =SMRDATA
ldr r1, =lowlevel_init /*编译时确定的地址*/
sub r0, r0, r1 /* r0 = r0 -r1 , r0 = SMRDATA相对于lowlevel_init的偏移值 */
adr r3, lowlevel_init /*位置无关*/
add r0,r0,r3 /*r0 = r0 +r3 ,r0存放的是当前SMRDATA的实际地址*/
ldr r1, =BWSCON /* Bus Width Status Controller */
add r2, r0, #13*4
0:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne 0b

关键字:ARM汇编  LDR  ADR  UBOOT 引用地址:ARM汇编中的LDR及ADR的区别及其在UBOOT中的应用

上一篇:移植uboot2010.09到S3C2440二
下一篇:arm汇编adrl以及ldr与adr的区别

推荐阅读最新更新时间:2024-03-16 14:53

cortex-a8 uboot系列:第九章 uboot源码分析5-启动第二阶段
一、start_armboot 4 解析 1. DATAFLASH初始化 CONFIG_HAS_DATAFLASH为串行接口的FLASH,如spi接口的FLASH或者IIC接口的FLASH。小容量的FLASH芯片。但是x210没有这个东西,这部分代码不执行。 2.环境变量设置 环境变量的初始化,这里是对环境变量的重定位,将SD/MMC的环境变量读取到DDR中。 ENV_IS_EMBEDDED表示环境变量是内嵌到设备内部(也就是环境变量时内嵌到text段中)。该宏在程序中没有被定义。因此下面的代码是没有被执行的。 在gd_t结构体中,有reloc_off变量,因为环境变量是内嵌在text段中的,所以这个
[单片机]
cortex-a8 <font color='red'>uboot</font>系列:第九章 <font color='red'>uboot</font>源码分析5-启动第二阶段
ARM9学习3-调试第一个ARM汇编程序
调试第一个ARM汇编程序 1.双击KEIL uVision4图标,打开RVMDK uVision4集成开发环境。 2.通过菜单“projectnew uvision project…”,新建一个工程,选择要存放的位置和工程文件名“Test001”,点击“保存按钮”。 3.CPU选型,选择三星的S3C2410A,继续点击“OK”按钮。 4.不添加启动代码,所以选择“否” 5.点击工具栏上的“ ”New 图标,新建一个文件,键入汇编源代码。 6.点击工具栏上的“ ”Save 图标,保存该汇编源文件,命名为:Test001.s 7.在左边的“Project”目录结构中,右击“Source Group 1”,选择“
[单片机]
ARM9学习3-调试第一个<font color='red'>ARM汇编</font>程序
ARM汇编 MOV PC,LR
终于明白这个LR寄存器了 看下面这个ARM汇编吧 BL NEXT ;跳转到子程序 ......... ;NEXT处执行 NEXT .......... MOV PC,LR ;从子程序返回 这里的BL是跳转的意思,LR(R14)保存了返回地址 PC(R15)是当前地址,把LR给PC就是从子程序返回 这里有一下总结 首先 1.SP(R13) LR(R14)PC(R15) 2.lr(r14)的作用问题,这个lr一般来说有两个作用: 1》.当使用bl或者blx跳转到子过程的时候,r14保存了返回地址,可以在调用过程结
[单片机]
用U盘烧写Uboot.bin到Nor Flash
1.在开发板上面插上U盘 2.打到 NAND flash模式启动U-boot,输入以下命令打开usb设备。 # usb reset //以重启的方式 或者用 # usb start //以直接启动的方式 3.给USB设置驱动号: # usb dev 0 4.给USB设置端口号,有如下显示: # usb part 0 Partition Map for USB device 0 -- Partition Type: DOS Partition Start Sector Num Sectors Type 1 691968 15743232 c 5.查看usb文
[单片机]
GNU ARM汇编--(十四)GNU ARM汇编下做任务调度
以前工作中用过arm7,没有MMU,也没有用任何OS.现在回忆当时的代码结构,我觉得可以叫无限循环的有限状态机.arm7不跑OS,就相当于单片机,单片机跑的肯定是无限死循环.有限状态机是因为整个代码要处理很多外部的事情,那就是大的循环里面来套小循环,以轮询的方式来检查外界的变化,然后系统作出变化,系统在有限的状态中切换. OS的一个标识就是支持多任务的并发.比方说linux,我们看起来是多个进程在同时运行,实际上还是cpu运行一下这个进程,再运行一下其他进程.这个就涉及到上下文切换以及进程调度的算法.当然我这里说的是单核的情况,如果是SMP的话,可能有些区别.暂时也没研究linux下的进程调度,但是通过自己写个最简单
[单片机]
ldradr在使用标号表达式作为操作数的区别
ARM汇编有ldr指令以及ldr、adr伪指令,他门都可以将标号表达式作为操作数,下面通过分析一段代码以及对应的反汇编结果来说明它们的区别。 ldr r0, _start adr r0, _start ldr r0, =_start _start: b _start 编译的时候设置 RO 为 0x30000000,下面是反汇编的结果: 0x00000000: e59f0004 ldr r0, ; 0xc 0x00000004: e28f0000 add r0, pc, #0 ; 0x0 0x00000008: e59f0000 ldr r0, ; 0x1
[单片机]
极点跟随的LDO稳压器频率补偿方法的研究
   1 引 言   便携电子设备无论是由蓄电池组,还是交流市电经过整流后(或交流适配器)供电,工作过程中,电源电压都存在变化。例如单体锂离子电池充足电时的电压为4.2 V,放电后的电压为2.3 V,变化范围很大。而各种整流器的输出电压不仅受市电电压变化的影响,还受负载变化的影响。因而近年来,低压差线性稳压器(LowDropout Linear Regulator)以其低成本,高电池利用率,洁净的输出电压等特点,被广泛应用于移动电话、掌上电脑等消费类电子产品,以及便携式医疗设备和测试仪器中。   LDO稳压器的频率补偿设计,不仅直接决定了频率稳定性,而且对LD0稳压器的性能参数,尤其是瞬态响应速度,有很大的影响。此外,随
[电源管理]
cortex-a8 uboot系列:第十七章 uboot移植-网卡DM9000移植
一、网卡基础知识 1.网卡芯片与开发板的连接方式 总线式连接方式,使用SROM总线接口。 开发板核心板,使用SROM控制器的bank1。因此有效地址是0x8800_0000 – 0xffff_ffff。 开发板上DM9000的连接。使用16-bit数据连接方式 网卡芯片有CS引脚,(CS就是chip_select,选线信号,主机向CS发送有效信号则从机芯片工作,主机向CS发送无效信号则从机芯片不工作)。这个引脚要接soc的srom控制器的片选引脚。 主机s5pv210的srom控制器每一个bank都有一个片选信号CSn(n=0-5),这里接CSn1,说明DM9000接的是srom的bank1。 所以,可以
[单片机]
cortex-a8 <font color='red'>uboot</font>系列:第十七章 <font color='red'>uboot</font>移植-网卡DM9000移植
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved