u-boot-2009.11在mini2440上的移植,关于SDRAM&NOR&NAND启动的几点疑惑

本文详细解读了U-Boot在SDRAM、NOR、NAND启动时的判断方法与代码搬移过程,包括启动方式判断、NOR/NAND启动代码搬移到SDRAM的具体实现,以及对关键指令adr、ldr的理解与疑惑解答。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考tekkaman的u-boot-2009.11的移植,有两点迷惑,经过查阅资料,仔细思考,解决了疑惑;记录如下:

1,判断是SDRAM&NOR&NAND的启动方式:链接:

http://www.360doc.com/content/10/1118/09/4672432_70333375.shtml

判断是否是SDRAM启动的方法是采用如下代码实现

/***************** CHECK_CODE_POSITION ******************************************/

adr r0, _start /* r0 <- current position of code相对寻址,范围小,是实际运行时该标号的地址,若是NOR启动或NAND启动,则_start为0地址,若通过仿真器或者已经拷贝到SDRAM运行,那么_start为连接器设置的期望运行地址,即_TEXT_BASE */

ldr r1, _TEXT_BASE /* test if we run from flash or RAM,此处加载的绝对地址,即连接器处理后的地址,也就是期望在SDRAM中运行的地址*/

cmp r0, r1 /* don't reloc during debug */

beq stack_setup

/***************** CHECK_CODE_POSITION ******************************************/

若实际运行的地址,是链接器期望运行的地址,那么现在代码正在SDRAM中运行,否则便是NOR或则NAND启动。

2,判断是NOR&NAND启动

/***************** CHECK_BOOT_FLASH ******************************************/

ldr r1, =( (4<<28)|(3<<4)|(3<<2) ) /* address of Internal SRAM 0x4000003C*/

mov r0, #0 /* r0 = 0 */

str r0, [r1]



mov r1, #0x3c /* address of men 0x0000003C*/

ldr r0, [r1]

cmp r0, #0

bne relocate /*norflash启动,则跳转到该标号*/


/* recovery */

ldr r0, =(0xdeadbeef) /*若是NAND启动,恢复0X4000003C处原来的值,接着执行NAND拷贝到SDRAM*/

ldr r1, =( (4<<28)|(3<<4)|(3<<2) )

str r0, [r1]

/***************** CHECK_BOOT_FLASH ******************************************/


/***************** NAND_BOOT *************************************************/

详细解释参考上面的链接

3,NOR启动代码搬移到SDRAM

/***************** NOR_BOOT *************************************************/

relocate: /* relocate U-Boot to RAM */

/*********** CHECK_FOR_MAGIC_NUMBER***************/

ldr r1, =(0xdeadbeef)

cmp r0, r1

bne loop3

/*********** CHECK_FOR_MAGIC_NUMBER***************/

adr r0, _start /* r0 <- current position of code */

ldr r1, _TEXT_BASE /* test if we run from flash or RAM */

ldr r2, _armboot_start /******疑虑出自这里*******/

ldr r3, _bss_star

sub r2, r3, r2 /* r2 <- size of armboot */

add r2, r0, r2 /* r2 <- source end address */


copy_loop:

ldmia r0!, {r3-r10} /* copy from source address [r0] */

stmia r1!, {r3-r10} /* copy to target address [r1] */

cmp r0, r2 /* until source end addreee [r2] */

ble copy_loop

/***************** NOR_BOOT *************************************************/

疑惑主要源自对ldr以及adr命令的迷惑,简单讲adr加载的是代码在运行时的地址,ldr加载的是链接器链接后的绝对地址;前面有述;

start.S开始处有

.globl _armboot_start

_armboot_start:

.word _start

刚开始我认为运行时,_armboot_start的值与_start的值相同;其实不是,_armboot_start中的值存的是链接后_start的值,即使期望在SDRAM中的地址;因此在NOR&NAND启动时,执行下来,r0与r2的值不同;__bss_start的位置,是bss的start开始位置,同时也是text+rodata+data的结束位置,即代码段,只读数据和已初始化的可写的数据的最末尾的位置。NOR启动时,执行到copy_loop之前,r0=0,r2为text+rodata+data的结束位置。然后执行拷贝

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值