移植u-boot-2010.09到S3C2440(二)——ARM汇编中的LDR及ADR的区别

最新更新时间:2022-04-25来源: eefocus关键字:移植  u-boot  S3C2440  LDR  ADR 手机看文章 扫描二维码
随时随地手机看文章

我在看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(boardsamsungmini2440config.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


关键字:移植  u-boot  S3C2440  LDR  ADR 编辑:什么鱼 引用地址:移植u-boot-2010.09到S3C2440(二)——ARM汇编中的LDR及ADR的区别

上一篇:uboot-2011.12移植到S3C2440(二)——点亮LED灯,the very beginning。
下一篇:移植u-boot-2010.09到S3C2440(三)——判断NAND还是NOR启动的汇编代码

推荐阅读

GuiLite移植到STM32F4开发板上
大家好,最近在做Github找到一个有趣的开源Gui框架:GuiLite,按照说明移植了GuiLite到STM32F4OLED屏幕上,分析一下自己的移植经验。01GuiLite介绍GuiLite是一个开源的Gui框架,只依赖于一个单一的头文件库(GuiLite.h),不需要很复杂的文件管理,代码量平易近人。GuiLite由4千行C++代码编写,单片机上也能流畅运行,其最低的硬件运行要求如下:CPU主频ROM大小RAM大小24 MHZ29KB9KB同时GuiLite具有很强的跨平台特性:支持的操作系统:iOS/macOS/WatchOS,Android,Linux(ARM/x86-64),Windows(包含VR),RTOS… 甚至无
发表于 2023-03-28
GuiLite<font color='red'>移植</font>到STM32F4开发板上
光控音效发生器电路分享
这种独特的电路允许您创建许多不同的音效输出,只需将手移到几个光相关电阻上,通过改变LDR上的入射光强度。发生器具有两个不同的单元LDR,用于控制声音 - 突发振荡器电路。一个 LDR控制音调,另一个控制突发持续时间。您所要做的就是将手扫过LDR以产生各种声音。基本工作原理为了产生异常噪声,音爆振荡器电路采用具有正反馈的556定时器IC。556 器件由几个完全独立的 555 IC 组成,一个 IC 555的输出控制另一个 IC 在我们的操作中的振荡周期或突发持续时间。放电延迟是 C 上的电压从 2/3 Vcc 降低到 1/3 Vcc (tD) 所需的时间。当 555 的触发器达到 1/3 Vcc 时,它会重置并允许C 在 RA 和 R
发表于 2023-03-21
光控音效发生器电路分享
LPC213X通过μC/OS-II的多种移植方案
μC/OS-II是可移植、适用于对安全性要求苛刻的剥夺型实时多任务嵌入式系统,简单易学,在工程应用和嵌入式系统教学中很受欢迎。LPC213X是Philips公司推出的基于ARM7TDMI-S核的32位RISC微处理器,也适合于ARM学习开发平台和工程应用。1 与μC/OS-II移植工作相关的主要特性ARM体系结构分为7种运行模式,ARM和Thumb两种工作状态。LPC213X的编程模型就是标准的ARM7体系结构;同时LPC213X也具备ARM的标准异常模式IRQ和FIQ。稍具特色的是其VIC向量中断控制器。分别对IRQ、FIQ、非向量中断和软件中断进行了分类,具有对32个中断输入的可编程分配机制。这对于μC/OS-II的移植至关重要
发表于 2023-03-14
LPC213X通过μC/OS-II的多种<font color='red'>移植</font>方案
LPC2119简介 μC/OS-II在LPC2119上的移植
本文在分析实时嵌入式系统mC/OS-II和LPC2119芯片的基础上,对mC/OS-II向处理器上移植前需要了解的知识和需要做的前期准备工作进行了分析和讨论,最后给出了移植的具体工作。论文着重分析了mC/OS-II的移植。μC/OS-II是一个完整的,可移植、可固化、可裁减的占先式实时多任务内核,它功能强大,支持56个用户任务,支持信号量、邮箱、消息队列等多种常用的进程间通信机制。公开源代码,程序可读性强、移植性好,同时可免费获得。LPC2119是由PHILIPS生产的一款32位ARM7TDMI-S微处理器,其核心为高性能的32位RISC体系结构,并具有高密度的16位指令集和极低的功耗。具有零等待128K字节的片内FLASH,16K
发表于 2023-03-06
LPC2119简介 μC/OS-II在LPC2119上的<font color='red'>移植</font>
深度解读S3C2410A的嵌入式系统的U-Boot移植
0 引 言ARM嵌入式处理器已被广泛应用于消费电子产品、无线通信、网络通信和工业控制等领域。其中,ARM9的芯片更是以其低价格、低功耗、高性能在手持设备中占据着重要市场。在嵌入式操作系统中,Linux,Vxworks,WinCE三足鼎立,其中Linux由于其开源性、稳定性、安全性、可裁减性更是一支独放。在嵌入式系统中,如何实现在ARM9平台下Linux操作系统的引导工作是嵌入式技术开发的重要环节。1 嵌入式系统的软件组成1.1 系统的软件组成嵌入式的软件系统主要由Bootloader、操作系统、文件系统、应用程序等组成。其中,Bootloader是介于硬件和操作系统之间的一层,其作用就好像PC机中的BIOS。系统加电运行后,由系统自
发表于 2023-02-27
深度解读S3C2410A的嵌入式系统的<font color='red'>U-Boot</font><font color='red'>移植</font>
初识STM32 标准库
CMSIS 标准及库层次关系因为基于Cortex 系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的Cortex 微控制器软件 的兼容性问题,ARM 与芯片厂商建立了CMSIS 标准(CortexMicroController Software Interface Standard)。所谓CMSIS 标准,实际是新建了一个软件抽象层。CMSIS 标准中最主要的为CMSIS 核心层,它包括了:内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由ARM 公司提供。设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提
发表于 2023-02-27
初识STM32 标准库

推荐帖子

IV转换放大电路
图中APD-130TC7-7F是光敏二极管,理论上来说光敏二极管经过光照应该是产生电流信号,按照运放的理论知识来看,图中V2和V1的电压应该是相等吧,可实际上这两点的电压并不相等,这是为什么。 IV转换放大电路
zhangjun7758520 模拟电子
国赛题目出来了,参赛的小伙伴们选择好你的题目了吗?
国赛题目出来了,参赛的小伙伴们选择好你的题目了吗?TI杯2019年全国大学生电子设计竞赛参考选题来投个票吧! 国赛题目出来了,参赛的小伙伴们选择好你的题目了吗?
okhxyyo 电子竞赛
F2812求助
小弟在做毕业设计,急需一些利用F2812进行伺服控制方面的资料,有这方面资料的老师请给小弟发一下哈,谢谢!我的邮箱是mikelxz@163.com 这方面的资料一般在哪些网站能找到啊? F2812求助
wwp 微控制器 MCU
wince5.0 eboot下载内核问题
因为板商提供的bootloader没有源码,所以想自己改一个,修改的基本差不多了, 但是在下载内核的时候,每次下载到52%的时候就会停下来,然后下载进度窗口就消失了。 这时候超级终端好像死机了一样,再重启开发板也没有信息输出。需要重启超级终端,断开重链也不行。 有时会出现一下提示: ERROR:Checksumfailure(expected=0x169980computed=0x1770E8) *******Checksumfailureonrecord108,
chenjianyong WindowsCE
菜鸟上路的第二个作品,三路PWM
--三个通道的PWM,d1,d2,d3分别显示出不同的亮度 libraryieee; USEieee.std_logic_1164.ALL; USEieee.std_logic_arith.ALL; USEieee.std_logic_unsigned.ALL; ENTITYMyPWMIS GENERIC(n:integer:=256); PORT ( clk:INstd_logic;--系统时钟
吴下阿蒙 FPGA/CPLD
移植uClibc库
现在2.4.27的内核和RAMDISK可以正常运行在AT91RM9200中,我交叉编译了一个简单测试程序 放到RAMDISK中,但是执行时却提示:NotFound! eg:ash>./bin/Test ash>./bin/Test:NotFound 路径是没问题的,属性也具有可执行.原因可能是我动态交叉编译造成的. 所以现在我想移植glibc到ARM平台中.但是不太清楚具体怎么操作. --->是不是下载glibc源代码后,根据其下的IN
kendy630314511 嵌入式系统
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

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