打印

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

[复制链接]
2684|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mushuilin|  楼主 | 2008-9-8 14:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   小弟想在S3C2410开发板上做个小实验:把烧在nor flash中的全部代码(包括RO段和RW段)拷贝到SDRAM中运行,nor flash地址为0x00000000,SDRAM地址为0x30000000(32MB),在程序中我把nor flash的全部代码拷贝至0x30000000开始的地址(也就是SDRAM的起始地址),然后跳转到SDRAM的main程序,main程序是点亮1个LED灯。在工程中我把RO段设置为0x30000000,RW段设置为0x31000000。
    实验结果是灯没点亮,是不是不能把RO段拷贝至SDRAM?或者是哪个地方我设置错误了?
    PS:我之前也做过1个小实验,程序没有拷贝至SDRAM,直接在nor flash中运行(RO段设置为0x00000000,RW段设置为0x30000000),程序运行正常。

相关帖子

沙发
阿南| | 2008-9-8 23:57 | 只看该作者

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

请问有朋友这样用过吗?

使用特权

评论回复
板凳
twentyone| | 2008-9-9 11:41 | 只看该作者

BOOTLOADER都这样做的

LZ的情况是很常用的,毕竟在FLASH里面运行会比在SDRAM里面运行慢很多。

注意几个问题:
1 - 运行地址设置问题,因为你的程序实现了自拷贝。这就是说你的程序(至少部分)既能在FLASH里运行,也能在SDRAM里面运行。
2 - 你也可以把程序分成2部分来实现,一部分的运行地址在FLASH,用来实现程序拷贝。拷贝完成后,这部分的程序任务完成。另外一部分是你真正在SDRAM运行的程序。
3 - 拷贝的时候要注意程序是完整拷贝了的;
4 - 用仿真来查找问题。确定拷贝和跳转有没有问题,另外跳转后,程序是否按照期望运行的。



使用特权

评论回复
地板
l0p0c| | 2008-9-9 12:54 | 只看该作者

非常感谢twintyone的帮助!

使用特权

评论回复
5
walnutcy| | 2008-9-11 00:29 | 只看该作者

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

使用特权

评论回复
6
armecos| | 2008-9-11 00:50 | 只看该作者

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

摘自《VxWorks在EasyARM2200和SmartARM2200上的移植》。

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

更多内容,详见:
《培训系列“丛书”》
www.armecos.com
-----------------------------------
More details, see:
《"Series Books" of Training》
www.armecos.com

使用特权

评论回复
7
Etual| | 2008-9-11 08:57 | 只看该作者

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

其实你要做的跟vivi的启动代码 (head.S)文件里面的步骤一模一样

1,RO 和 entry point设置为 0x30000000 ,RW可以不设置,让他跟在 RO后面
就OK了,反正你有搬程序的过程
2,copy程序部分,vivi是访问 nand flash,那个复杂点,你要修改成访问
nor flash读取数据,其实这个很简单,因为可以直接访问,换个C的表达
就是  *dest++ = *res++ ;
3, 都搞定后就用vivi的那个无缝跳转的办法,跳到 SDRAM里面继续执行C部分
程序,你的闪灯就在 C 的main函数里面写就OK了。

    ldr    r1, =on_the_ram      @ 
    add    pc, r1, #0           @ 跳转到 on_the_ram 这个标号上面
    nop                      @ nop
    nop
1:    b    1b        @ infinite loop 死循环,但是不会执行到这里的。

on_the_ram: 

使用特权

评论回复
8
mushuilin|  楼主 | 2008-9-11 10:43 | 只看该作者

谢谢各位指点

使用特权

评论回复
9
mushuilin|  楼主 | 2008-9-11 15:23 | 只看该作者

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

    因为nor flash位于0地址,系统上电后会从flsha中读取指令。但是由于我设置的RO段地址是0x30000000,是不是RO地址的设置导致CPU没跑起来?

使用特权

评论回复
10
农民讲习所| | 2008-9-11 15:32 | 只看该作者

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

使用特权

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

本版积分规则

14

主题

35

帖子

0

粉丝