打印

最近学习S3C2440遇到的一些问题,求解答!

[复制链接]
2053|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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
问题问的有些凌乱,因为比较难表达,可以先回答一部分,我会追问的,这样比较清晰。
求高手帮助啊,谢谢了!

相关帖子

沙发
阿南| | 2013-4-4 19:37 | 只看该作者
一。0x30000000是物理地址,硬件是接到这个起始地址的
二。是的
三。刚开始是在内部SRAM,0x0开始的地址。

使用特权

评论回复
板凳
anhelus|  楼主 | 2013-4-5 15:27 | 只看该作者
阿南 发表于 2013-4-4 19:37
一。0x30000000是物理地址,硬件是接到这个起始地址的
二。是的
三。刚开始是在内部SRAM,0x0开始的地址。

南大~
不好意思图没有显示出来
关于第一个:如果0x30000000是物理地址,那从NOR FLASH启动和从NAND FLASH启动 0 地址为什么可以不一样,难道这时候MMU已经启用了吗? 我感觉地址映射有好多层面上讲的地址映射,所以我很混乱。
第二个:昨天我试了一下,一个不到4K的程序,链接脚本里程序段放到0x30000000,bin下载到nand flash里,上电后,依然是可以正常运行的,程序运行在 0地址内部ram里,没有复制到30000000的。那是为何?
第三个:你看第一句 反汇编不是 BL 3000001c 吗,可是其实这时候0x3000001c里还什么都没有啊。难道除非用LDR, BL 都是相对地址吗?

使用特权

评论回复
地板
阿南| | 2013-4-5 22:36 | 只看该作者
NOR可以直接运行程序,NAND不行。
内部SRAM在0x0地址,只要小于4K的代码都可以在这里运行。
什么还没有肯定是不行的

使用特权

评论回复
5
MCU2me| | 2013-4-6 15:46 | 只看该作者
重映射0地址到30000000了吧

使用特权

评论回复
6
anhelus|  楼主 | 2013-4-7 14:26 | 只看该作者
阿南 发表于 2013-4-5 22:36
NOR可以直接运行程序,NAND不行。
内部SRAM在0x0地址,只要小于4K的代码都可以在这里运行。
什么还没有肯定 ...

嗯。这些我知道。
关于第三个问题好像有些懂了。
前几条是bl 3000001c这样的指令,虽说反汇编是写着 3000001c,可是在内存里 BL 都只是相对的短距离的跳转而已,只有LDR做绝对的长跳转,我试了一下把第一句就改成LDR的,程序就没法跑了。
根据这个我回答第二个问题,链接脚本里指定的运行时地址0x30000000,我觉得这个0x30000000也并没有强制的约束,它影响的可能只是 ldr, =label 这样的位置相关的伪指令,如果你的程序全部都是相对地址跳转,不在30000000运行也可以。

不知道我的理解对不对。

使用特权

评论回复
7
anhelus|  楼主 | 2013-4-7 14:27 | 只看该作者
MCU2me 发表于 2013-4-6 15:46
重映射0地址到30000000了吧

啊。 刚开始没有重映射吧、

使用特权

评论回复
8
MCU2me| | 2013-4-7 22:24 | 只看该作者
anhelus 发表于 2013-4-7 14:27
啊。 刚开始没有重映射吧、

那为什么你的起始地址跑到30000000了呢?你说的问题我也研究了一下,LZ解决了的话就说一下吧~

使用特权

评论回复
9
阿南| | 2013-4-8 08:29 | 只看该作者
2440没有硬件重映射功能

使用特权

评论回复
10
anhelus|  楼主 | 2013-4-9 11:14 | 只看该作者
阿南 发表于 2013-4-8 08:29
2440没有硬件重映射功能

那从nand启动和nor启动 0地址不同是为什么呢,不是硬件映射吗

使用特权

评论回复
11
阿南| | 2013-4-9 14:17 | 只看该作者
在NOR启动时,PC直接在NOR上的0x0地址开始执行。在NAND启动,NAND控制器将第0块的前4K内容装载到内部SRAM,内部SRAM位于0x0地址,PC从SRAM的0x0地址开始执行。

使用特权

评论回复
12
anhelus|  楼主 | 2013-4-10 00:17 | 只看该作者
阿南 发表于 2013-4-9 14:17
在NOR启动时,PC直接在NOR上的0x0地址开始执行。在NAND启动,NAND控制器将第0块的前4K内容装载到内部SRAM, ...

嗯,是这样,这我明白。
可是NOR 的0x0和sram 的0x0不都是物理地址0x0么,这个不需要用到硬件映射么。还是说这是芯片内部的那啥啥啥我不用管了。

使用特权

评论回复
13
阿南| | 2013-4-11 09:24 | 只看该作者
都是0地址了,还映射个嘛:lol

使用特权

评论回复
14
阿南| | 2013-4-11 09:24 | 只看该作者
他们是通过OM选择从NAND还是NOR启动的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

1

粉丝