找回密码
 注册
搜索
查看: 1441|回复: 2

s3c2440的SDRAM 疑问

[复制链接]
发表于 2011-6-18 17:55:35 | 显示全部楼层 |阅读模式
问题:
注:所指芯片为s3c2440,烧写工具是SECURE CRT和DNW,重点是绿色部分的问题
RO base指指令的加载地址和运行地址(书上看的),加载地址是指映像文件烧写到flash上的的状态,也就是存放在flash上的位置,而运行域是指程序执行时的地址。
如果RO base设置成0x30000000,镜像文件烧写到NAND FLASH,问:
1、        镜像文件被烧录到NAND中,起始地址是什么,是0吗?根据加载域的定义(映像文件烧写到flash上的的状态)以及书上的解释(RO base 0x30000000就是加载地址和执行地址),既然映像文件时烧写到NAND中的,它的加载地址就应该是0啊,那岂不是矛盾了呢?
2、        在ADS环境中编译,如果镜像文件烧写到NAND中(用SECURE CRT和DNW烧写),那么烧写到NAND中的镜像文件的起始地址默认是什么,是0吗?可以指定吗?还有DNW种的地址指什么地址,为什么资料上指定为0x3000000?可以是其他地址吗?比如是0。
是不是不管连接地址(即RO base)设置成什么,复位后程序总是从地址0开始运行的呢?那么RO base设置的地址如果为0x3000000的话,那不是指代码从0x30000000开始执行吗?怎么又矛盾了?
3、        我在网上搜了一下,看到这样一段话:如果RO的值和你程序烧录起始地址的值不同,(如:你设置的RO=0x3000000,注意而你烧录的代码是在0地址处(问:这里的0地址是指烧写到NAND中的地址码)),这样就需要你烧录在0地址开始处的一小部分启动代码把程序从烧录地址搬运到RO设置的地址中去,但要注意,连接器为你连接的地址是以RO为基准的,这样你可能会有个疑问,为什么程序的运行域是以RO(0x30000000)为基准,但处于FLASH(0地址开始)里的一小部分启动代码还能运行呢,这就是因为程序中用了与地址无关的指令,使得一上电,能够顺利的执行0地址处的启动代码。
问:是不是只要RO base地址不是0,而镜像文件烧写到NAND中,都要在一开始有一小部分启动代码把程序从烧录地址搬运到RO设置的地址中去呢?否则就无法运行了呢?
4、        对于“为什么程序的运行域是以RO(0x30000000)为基准,但处于FLASH(0地址开始)里的一小部分启动代码还能运行呢,这就是因为程序中用了与地址无关的指令,使得一上电,能够顺利的执行0地址处的启动代码。”这段话,想问的是复位后是从0开始执行还是从0x3000000开始?
    为设么一定要是相对地址指令才能顺利执行0地址处的启动代码啊。
我的理解是这样的:复位后从0地址开始(nand中的代码会自动复制到偏上RAM,且地址为0),执行一些初始化,如存储控制器,中断,堆栈等(由于还没到复制NAND的代码到RO base指定的地址,所以这部分代码是在RAM中运行的,可是和相对地址没关系啊,即使不是也会执行啊),然后代码复制,跳到RO base指定的地址处执行。
对于相对地址指令总是似懂非懂。希望贵人能指教啊!!!!!
还有我看到网上说PC一上电的值是|Image$$RO$$Base|,也
就是RO base处的地址值,但是如果我的地址值是0X30000000,
那一上电PC就指向0X30000000,可是一开始这里没有指令可以执行啊,如果有,那又是什么时候复制过去的啊,不是烧写到NANDA中的吗?况且这是第一条指令啊。我知道是相对地址指令的缘故,可是我解释不同啊!!!!!而且对于以下指令网上说:不是跳转到RO处,而是跳到flash,我糊涂了,上电PC指向0X30000000,可是这里没有指令啊,何来跳转啊????
ENTRY
ResetEntry
    b ResetHandler           

5、        对于韦东山的《嵌入式linux应用开发》有这样一个例程:

IMPORT main
   AREA HEAD, CODE, READONLY
   ENTRY
   
    bl  disable_watch_dog               (1)
bl  memsetup                      (2)
bl  copy_steppingstone_to_sdram      (3)   
ld pc, =on_sdram
on_sdram:            
ldr sp, =0x34000000           
    bl  main
halt_loop
    b   halt_loop

disable_watch_dog
  
    mov r1,     #0x53000000
    mov r2,     #0x0
    str r2,     [r1]
    mov pc,     lr      
END
程序很简单,其中把main函数和disable_watch_dog   函数体给略去了,大家都知道怎么写
书上说:代码1、2、3指令的连接地址虽然都在0x30000000(sdram),但是由于他们都是位置无关的相对跳转指令,所以可以在Steppingstone中执行,我想问的是:这几条指令当然是在0开始出执行的么,如果不是相对跳转指令就不能执行了么?为什么?为什么我看反汇编第一条指令的地址是0x30000000?不是还没复制到sdram中吗?不是要到复制指令后才开始跳到sdram中么!到底是什么意思啊?
总结:是不是镜像文件烧写到NAND中时,即使地址是0x3000000,那么如果程序中没有复制的代码(把程序从烧录地址搬运到RO设置的地址中去),就还是从0开始执行呢,即在RAM中,只要不超出4kb。但是如果有复制的代码段,那又要重复红色字体部分问题了!!
这个问题已经困扰我好久,我也查了好多资料,就是绕不出来,只要这个问题通了,好多问题都能解决想通,请各位走过的路过的不要错过,都来说几句,谢谢了
发表于 2011-6-20 12:21:00 | 显示全部楼层
楼主提了这么多问题,我没看懂楼主到底问什么?
不过要说清楚一个概念,scat中的地址不论是加载域还是执行域都是总线地址,而NAND不占用系统总线,所以scat中的地址不是对NAND来说的。
也就是说scat中的加载域地址是 系统运行时候从NAND第一次copy到RAM中的地址。
系统启动流程一般为:ARM复位后,先执行芯片系统ROM(芯片内部集成)中的代码,这部分代码是芯片出厂的时候,厂家就固化好了。这部分代码会自动从NAND先copy一部分代码比如bootloder到芯片内部集成的RAM中。bootloader设置一些最主要的系统运行所需要的环境。其中一条是设定外部ram的时序,然后从nand 搬运其余部分到外部RAM等等。
点评回复

使用道具 举报

发表于 2011-7-20 12:47:15 | 显示全部楼层
我也没有弄懂楼主是什么意思,感觉楼主对某些概念有理解不到位之处,正与一楼所说。
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-5-12 10:04 , Processed in 0.045412 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表