关于2410在nor flash中的启动(请高手指点)

[复制链接]
3544|9
 楼主| mushuilin 发表于 2008-9-8 14:03 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;小弟想在S3C2410开发板上做个小实验:把烧在nor&nbsp;flash中的全部代码(包括RO段和RW段)拷贝到SDRAM中运行,nor&nbsp;flash地址为0x00000000,SDRAM地址为0x30000000(32MB),在程序中我把nor&nbsp;flash的全部代码拷贝至0x30000000开始的地址(也就是SDRAM的起始地址),然后跳转到SDRAM的main程序,main程序是点亮1个LED灯。在工程中我把RO段设置为0x30000000,RW段设置为0x31000000。<br />&nbsp;&nbsp;&nbsp;&nbsp;实验结果是灯没点亮,是不是不能把RO段拷贝至SDRAM?或者是哪个地方我设置错误了?<br />&nbsp;&nbsp;&nbsp;&nbsp;PS:我之前也做过1个小实验,程序没有拷贝至SDRAM,直接在nor&nbsp;flash中运行(RO段设置为0x00000000,RW段设置为0x30000000),程序运行正常。
阿南 发表于 2008-9-8 23:57 | 显示全部楼层

还真没试过在NOR Flash运行程序,又将自己复制到SDRAM中运行的

请问有朋友这样用过吗?<br />
twentyone 发表于 2008-9-9 11:41 | 显示全部楼层

BOOTLOADER都这样做的

LZ的情况是很常用的,毕竟在FLASH里面运行会比在SDRAM里面运行慢很多。<br /><br />注意几个问题:<br />1&nbsp;-&nbsp;运行地址设置问题,因为你的程序实现了自拷贝。这就是说你的程序(至少部分)既能在FLASH里运行,也能在SDRAM里面运行。<br />2&nbsp;-&nbsp;你也可以把程序分成2部分来实现,一部分的运行地址在FLASH,用来实现程序拷贝。拷贝完成后,这部分的程序任务完成。另外一部分是你真正在SDRAM运行的程序。<br />3&nbsp;-&nbsp;拷贝的时候要注意程序是完整拷贝了的;<br />4&nbsp;-&nbsp;用仿真来查找问题。确定拷贝和跳转有没有问题,另外跳转后,程序是否按照期望运行的。<br /><br /><br /><br />
l0p0c 发表于 2008-9-9 12:54 | 显示全部楼层

非常感谢twintyone的帮助!

  
walnutcy 发表于 2008-9-11 00:29 | 显示全部楼层

twentyone解释的很好,偶的软件就是这么干得

  
armecos 发表于 2008-9-11 00:50 | 显示全部楼层

VxWorks里有这样操作的源码,看看BSP源码吧,好多种形式呢,

摘自《VxWorks在EasyARM2200和SmartARM2200上的移植》。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;VxWorks的ROM映像类型&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;VxWorks有三种ROM映像类型:<br />&nbsp;&nbsp;&nbsp;&nbsp;1、ROM_RESIDENT-----驻留ROM型。在ROM中运行,只有数据段放在RAM里。<br />&nbsp;&nbsp;&nbsp;&nbsp;2、ROM_COPY---------复制ROM型。把主要映像从ROM中拷贝到RAM里并跳到其RAM入口点执行。<br />&nbsp;&nbsp;&nbsp;&nbsp;3、ROM_COMPRESS-----解压ROM型。把主要映像从ROM中解压到RAM里并跳到其RAM入口点执行。<br />&nbsp;&nbsp;&nbsp;&nbsp;各种ROM映像类型的内存布局图如下:<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ROM<br />&nbsp;&nbsp;&nbsp;&nbsp;--------------<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|&nbsp;&nbsp;0xff8xxxxx&nbsp;&nbsp;=&nbsp;ROM_DATA_ADRS<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;0xff800008&nbsp;&nbsp;=&nbsp;ROM_TEXT_ADRS<br />&nbsp;&nbsp;&nbsp;&nbsp;--------------&nbsp;&nbsp;0xff800000&nbsp;&nbsp;=&nbsp;ROM_BASE_ADRS<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RAM<br />&nbsp;&nbsp;&nbsp;&nbsp;--------------&nbsp;&nbsp;0x00100000&nbsp;=&nbsp;LOCAL_MEM_LOCAL_ADRS&nbsp;+&nbsp;LOCAL_MEM_SIZE<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;RAM_DATA_ADRS&nbsp;+&nbsp;data&nbsp;segment&nbsp;size<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|data&nbsp;segment|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|&nbsp;&nbsp;0x00001000&nbsp;&nbsp;=&nbsp;RAM_DATA_ADRS<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;initial&nbsp;sp&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;RAM_DATA_ADRS&nbsp;-&nbsp;STACK_SAVE<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;--------------&nbsp;&nbsp;0x00000000&nbsp;&nbsp;=&nbsp;LOCAL_MEM_LOCAL_ADRS<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;上图是驻留ROM型映像的内存分布,可见,只有数据段拷贝到了RAM内存里,当然堆栈也在RAM内存中。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ROM<br />&nbsp;&nbsp;&nbsp;&nbsp;--------------<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|&nbsp;&nbsp;0xff8xxxxx&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;binArrayEnd<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;subImage&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|&nbsp;&nbsp;0xff8xxxxx&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;binArrayStart<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|&nbsp;&nbsp;0xff8xxxxx&nbsp;&nbsp;=&nbsp;ROM_DATA_ADRS<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;0xff800008&nbsp;&nbsp;=&nbsp;ROM_TEXT_ADRS<br />&nbsp;&nbsp;&nbsp;&nbsp;--------------&nbsp;&nbsp;0xff800000&nbsp;&nbsp;=&nbsp;ROM_BASE_ADRS<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RAM<br />&nbsp;&nbsp;&nbsp;&nbsp;--------------&nbsp;&nbsp;0x00100000&nbsp;=&nbsp;LOCAL_MEM_LOCAL_ADRS&nbsp;+&nbsp;LOCAL_MEM_SIZE<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;temp&nbsp;data&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|&nbsp;&nbsp;0x00090000&nbsp;&nbsp;=&nbsp;RAM_DATA_ADRS<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;initial&nbsp;sp&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;RAM_DATA_ADRS&nbsp;-&nbsp;STACK_SAVE<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;subimage&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|------------|&nbsp;&nbsp;0x00001000&nbsp;&nbsp;=&nbsp;RAM_DST_ADRS&nbsp;(for&nbsp;non-resident&nbsp;images)<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;--------------&nbsp;&nbsp;0x00000000&nbsp;&nbsp;=&nbsp;LOCAL_MEM_LOCAL_ADRS<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;上图是复制ROM型和解压ROM型映像的内存分布,他们比驻留ROM型稍微有点复杂。复制ROM型和解压ROM型映像的主要差别的是subimage是否压缩,一般压缩率能超过55%,允许在ROM中烧写更大的系统,唯一的代价是增加了几秒钟的启动延迟,而复制ROM型映像没有解压过程,所以启动速度更快。subimage是由make产生的中间映像,并被make插在ROM映像文件中。代码段、初始化数据段、subimage在ROM中的排列顺序就如上图所示。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;复制ROM型映像直接把binArrayStart处的subimage拷贝到RAM_DST_ADRS,没有上面的temp&nbsp;data部分。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;对于解压ROM型映像,首先拷贝压缩的代码数据段到RAM_DATA_ADRS位置(即temp&nbsp;data部分),然后运行解压缩例程把解压后的subimage放置在RAM_DST_ADRS。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;RAM_DST_ADRS和RAM_DATA_ADRS宏均来自定义于make的链接地址,缺省值分别为Makefile文件中的RAM_LOW_ADRS和RAM_HIGH_ADRS。关于如何改变链接地址的信息,参见“target/h/make/rules.bsp”文件。<br /><br /><b>更多内容,详见:</b><br /><b>《培训系列“丛书”》</b><br /><b>www.armecos.com</b><br />-----------------------------------<br /><b>More&nbsp;details,&nbsp;see:</b><br /><b>《&quot;Series&nbsp;Books&quot;&nbsp;of&nbsp;Training》</b><br /><b>www.armecos.com</b>
Etual 发表于 2008-9-11 08:57 | 显示全部楼层

可以参考vivi的启动代码哦~~

其实你要做的跟vivi的启动代码&nbsp;(head.S)文件里面的步骤一模一样<br /><br />1,RO&nbsp;和&nbsp;entry&nbsp;point设置为&nbsp;0x30000000&nbsp;,RW可以不设置,让他跟在&nbsp;RO后面<br />就OK了,反正你有搬程序的过程<br />2,copy程序部分,vivi是访问&nbsp;nand&nbsp;flash,那个复杂点,你要修改成访问<br />nor&nbsp;flash读取数据,其实这个很简单,因为可以直接访问,换个C的表达<br />就是&nbsp;&nbsp;*dest++&nbsp;=&nbsp;*res++&nbsp;;<br />3,&nbsp;都搞定后就用vivi的那个无缝跳转的办法,跳到&nbsp;SDRAM里面继续执行C部分<br />程序,你的闪灯就在&nbsp;C&nbsp;的main函数里面写就OK了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;=on_the_ram&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;r1,&nbsp;#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;跳转到&nbsp;on_the_ram&nbsp;这个标号上面<br />&nbsp;&nbsp;&nbsp;&nbsp;nop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />1:&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;1b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@&nbsp;infinite&nbsp;loop&nbsp;死循环,但是不会执行到这里的。<br /><br />on_the_ram:&nbsp;
 楼主| mushuilin 发表于 2008-9-11 10:43 | 显示全部楼层

谢谢各位指点

  
 楼主| mushuilin 发表于 2008-9-11 15:23 | 显示全部楼层

和RO段的设置地址有关系吗

&nbsp;&nbsp;&nbsp;&nbsp;因为nor&nbsp;flash位于0地址,系统上电后会从flsha中读取指令。但是由于我设置的RO段地址是0x30000000,是不是RO地址的设置导致CPU没跑起来?
农民讲习所 发表于 2008-9-11 15:32 | 显示全部楼层

一句话:程序必须在RO开始运行。

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

35

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部