打印

请问下nor flash启动代码是做什么用的?

[复制链接]
3036|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaowu5016|  楼主 | 2009-5-9 15:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问下nor flash启动代码是做什么用的?
程序不是可以在nor flash 里面直接运行吗?那这样的话,不是可以直接编写程序直接烧到nor flash里面运行?

相关帖子

沙发
阿南| | 2009-5-9 19:54 | 只看该作者

建议楼主先分析一下该启动代码,然后再思考它都做了些什

使用特权

评论回复
板凳
luhuaren| | 2009-5-9 23:41 | 只看该作者

re

启动代码没几个人真正读懂的

使用特权

评论回复
地板
xiaowu5016|  楼主 | 2009-5-10 09:34 | 只看该作者

那后一个问题呢?

程序不是可以在nor flash 里面直接运行吗?那这样的话,不是可以直接编写程序直接烧到nor flash里面运行?

使用特权

评论回复
5
luhuaren| | 2009-5-10 19:33 | 只看该作者

re

可以,把RO设置为0就可以了

使用特权

评论回复
6
kingshen| | 2009-5-10 19:38 | 只看该作者

NOR FLASH贵,空间小,一般大的应用程序读 放NAND flash里

NOR FLASH贵,空间小,一般大的应用程序读 放NAND flash里

使用特权

评论回复
7
wangkj| | 2009-5-10 20:14 | 只看该作者

lz说的技术叫做xip,google一下。

lz的想法从理论上讲,是完全没有问题的。

使用特权

评论回复
8
luhuaren| | 2009-5-10 20:29 | 只看该作者

re

什么叫理论上可以,实际上就是可以的,真是高手。。。。

使用特权

评论回复
9
xiaowu5016|  楼主 | 2009-5-10 20:57 | 只看该作者

那怎么做?

如果想直接把程序下载到nor flash里面运行的话,编程时是不是设置RO base为0x0?

使用特权

评论回复
10
yxwsz| | 2009-5-11 01:41 | 只看该作者

答案

程序是可以放在NOR FLASH直接运行的(把只读段, .text, .cinit放在NOR FLASH即可,因为NOR FLASH是线性寻址的),但是NOR FLASH速度很慢(与SRAM, SDR SDRAM ,DDR SDRAM相比),所以一般用法是把程序放在NOR/NAND FLASH里面,处理器上电后,由BOOTLOADER把应用程序加载到SRAM/SDRAM里面去运行,这样运行速度比直接在FLASH里面运行可以提高很多。 

BOOTLOADER一般是放在NOR FLASH里面(注意是一般情况)。

如果程序从NOR FLASH直接运行,需要把只读段(.text, .cinit)放在NOR FLASH所在的地址区域,可写段(.data, .bss)放在SDRAM/SRAM所在的地址区域。需要有初始化内容的可写段需要boot程序来初始化。

使用特权

评论回复
11
armecos| | 2009-5-11 18:29 | 只看该作者

有很多工作形态,

1、利用bootloader加载到RAM运行
2、直接在flash里运行
3、利用bootloader从flash里加载到RAM运行
4、利用bootloader从flash里解压缩程序并加载到RAM运行
.....

这个在《增值包》里有清楚地说明,包括了ROM型、RAM型、ROMRAM型、ROM_COMPRESS型等等,一网打尽所有运行模式。

比如:ecos提供了多种库类型对用不同的运行方式:ROM型、RAM型、ROMRAM型

又比如VxWorks:

    ------------------------
    | 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”文件。

使用特权

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

本版积分规则

18

主题

67

帖子

0

粉丝