本帖最后由 anhelus 于 2013-4-5 16:37 编辑
刚学2440,一上手就一大堆问题。
问题一:
为什么这些地址是这些值呢?为什么SDRAM一定是从0x30000000开始的?这些地址是物理地址不?
曾经上微机原理的时候问过老师,外设的物理地址是由什么决定的,他说是由外设的连接关系决定的,我觉得挺对,因为如果把片外RAM的连接方式变一下(比如加一些138什么的),同一地址选中的芯片就不同了,所以我一直觉得物理地址是与连接有关的,是不固定的。所以S3C2440手册里固定的地址让我很奇怪,难道它把连接方式也定死了吗?
-------------------------------------------------------
问题二:
关于链接脚本。
链接脚本上指定了代码段和数据段的地址。这个地址是什么?
比如说我有一个程序指定代码段地址为0x30000000,将它烧写到NANDFLASH中,如果我想要开机执行这个程序,是不是必须要有一个初始化程序将NANDFLASH里该程序的所有内容拷贝到0x30000000这个地址才可以正常运行?
-------------------------------------------------------
问题三:
还是关于拷贝程序到指定地址的问题。
下面这段程序,按注释上说是运行到 ldr pc, =on_sdram(就是3000000c那一句)这条语句时会跳到SDRAM继续执行。我的疑问是,既然链接脚本里写的程序段是0x30000000,那为什么第一个跳转指令 bl disable_watch_dog 没有跳到SDRAM,看它的反汇编不是bl 3000001c 吗?(教程上说这个nandflash里的程序在开机后被复制到了s3c2440的内部ram,地址是0,所以其实_start此时运行在内部ram里),难道只是因为LDR是个能长跳转的伪指令吗?
Disassembly of section .text:
30000000 <_start>:
30000000:eb000005 bl3000001c <disable_watch_dog>
30000004:eb000010 bl3000004c <memsetup>
30000008:eb000007 bl3000002c <copy_steppingstone_to_sdram>
3000000c:e59ff090 ldrpc, [pc, #144]; 300000a4 <mem_cfg_val+0x34>
30000010 <on_sdram>:
30000010:e3a0d30d movsp, #872415232; 0x34000000
30000014:eb000032 bl300000e4 <main>
30000018 <halt_loop>:
30000018:eafffffe b30000018 <halt_loop>
3000001c <disable_watch_dog>:
3000001c:e3a01453 movr1, #1392508928; 0x53000000
30000020:e3a02000 movr2, #0; 0x0
30000024:e5812000 strr2, [r1]
30000028:e1a0f00e movpc, lr
3000002c <copy_steppingstone_to_sdram>:
3000002c:e3a01000 movr1, #0; 0x0
30000030:e3a02203 movr2, #805306368; 0x30000000
30000034:e3a03a01 movr3, #4096; 0x1000
30000038:e4914004 ldrr4, [r1], #4
3000003c:e4824004 strr4, [r2], #4
30000040:e1510003 cmpr1, r3
30000044:1afffffb bne30000038 <copy_steppingstone_to_sdram+0xc>
30000048:e1a0f00e movpc, lr
…………
300000a4:30000010 andccr0, r0, r0, lsl r0
问题问的有些凌乱,因为比较难表达,可以先回答一部分,我会追问的,这样比较清晰。
求高手帮助啊,谢谢了!
|