学习嵌入式重定向时 对重定向不明白点解释透彻的文章引用

在学习嵌入式,编写裸板程序时,遇到在Makefile中需要定义text的地址,感到很疑惑(我比较菜,大婶出门右拐),因为之前都是在Linux系统上执行程序。


example:

.extern main

.text

.global _start

_start:

Reset:

ldr sp, =4096

bl disable_watch_dog

bl memesetup

bl copy_steppingstone_to_sdram

ldr pc, =on_sdram

on_sdram:

ldr sp, =0x34000000

ldr lr, =halt_loop

ldr pc, =main

halt_loop:

b halt_loop


Makefile:

gcc-xxxx-ld -Ttext0x30000000 -o godLike

.........................................


查阅资料并思考,过程如下:

1/裸板程序下载到nandflash的0地址处(这个地址是程序的加载地址)

2/小于4k的程序,需要把自己copy到sdram中。(因为cpu的内部ram只有4k大小)

3/程序跳转到sdram执行后,如何定位自己的地址呢?这就需要在ld时指定自己的text段地址


为什么裸板程序需要指定text地址,基于操作系统的就不需要呢?用脚趾头想也知道楼,linux系统有自己的运行环境,已经帮你都打理好裂。


makefile在ld时将text定义位30000000,在裸板程序中也是将自己从0 copy到0x3000000的,这个很重要,重要的事情说三便,说三遍,三遍。

程序是如何总0开始执行的呢?首先程序被烧录nandflash0x00处,开始执行,记住,程序并没有认为自己在0x00,程序认为自己在0x3000000处,因为编译时指定裂text的地址位0x3000000. 既然地址不对,你他吗不是在耍老子吗?

因为裸板没有操作系统的运行环境,只知道自己的当前的物理地址,存放在pc寄存器中,裸板关键的一步让自己的物理地址和text的地址对应上的是ldr pc, =on_sdram这条指令。

程序认为自己从0x3000000处开始的,这个地址叫做“运行地址”。所以他认为on_sdram这个标记的地址位0x300004,而在将自己copy到0x3000000后,自己也的确在这个地址。这样就可以一起愉快的外耍了。。。。。。。


 

 

 

 

自己 的一些理解,程序在编译的时候先设置 一些CPU的状态,比如说关看门狗,设置堆栈等 ,之后把主要的有效程序拷贝到目标地址()中去,默认的拷贝的地址是在NANDFLASH的开始地址0X00的地方开始,实际程序也是在这里开始执行,但是为什么执行地址是从03000000开始还没有想明白,难道 是nandflash 的0X00地址在CPU 中的映射是0X3000000???

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值