嵌入式学习笔记3—代码搬移

本文基于国嵌的视频教程和TQ2440开发板,总结一下ARM如何实现代码的搬移。

一般来说,我们的uboot程序都是下载至NAND FLASH中。系统一上电,就会自动将NAND FLASH中的代码搬移至内存中,首先会搬移4KB的程序至我们的垫脚石SRAM区域内。但就我们自己设计编写的Gboot程序,我们代码量的size不需要4KB的大小。因此,本实验中主要是将垫脚石的代码搬移至链接器脚本定义的链接地址处。这样一来,我们搬移的起点就是内存的起始地址:0x00000000,终点就是链接器脚本定义的0x30008000.采用一个循环结构实现代码的搬移,具体代码如下:

copy_to_ram:
	ldr r0,=0x00000000   @start address
	ldr r1,=0x30008000   @final address
	add r3,r0,#1024*4    @set the copy code size

copy_loop:                   @copy loop
	ldr r2,[r0],#4
	str r1,[r2],#4
	cmp r0,r3
	bne copy_loop

	mov pc,lr

至于为什么PC指针一上电不是指着我们定义的起始地址:0x30008000呢?这主要是因为在指针一上电指向的必然是0x00000000地址,但由于我们运行程序采用的相对寻址方式,并不会直接改变PC的值,因此其地址变化方式为当前PC值+差值。所以PC指针不会指向0x30008000地址处。

具体可参考ARM相关技术手册以及国嵌培训视频。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值