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

[复制链接]
4579|10
 楼主| xiaowu5016 发表于 2009-5-9 15:59 | 显示全部楼层 |阅读模式
请问下nor&nbsp;flash启动代码是做什么用的?<br />程序不是可以在nor&nbsp;flash&nbsp;里面直接运行吗?那这样的话,不是可以直接编写程序直接烧到nor&nbsp;flash里面运行?
阿南 发表于 2009-5-9 19:54 | 显示全部楼层

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

  
luhuaren 发表于 2009-5-9 23:41 | 显示全部楼层

re

启动代码没几个人真正读懂的
 楼主| xiaowu5016 发表于 2009-5-10 09:34 | 显示全部楼层

那后一个问题呢?

程序不是可以在nor&nbsp;flash&nbsp;里面直接运行吗?那这样的话,不是可以直接编写程序直接烧到nor&nbsp;flash里面运行?<br />
luhuaren 发表于 2009-5-10 19:33 | 显示全部楼层

re

可以,把RO设置为0就可以了
kingshen 发表于 2009-5-10 19:38 | 显示全部楼层

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

NOR&nbsp;FLASH贵,空间小,一般大的应用程序读&nbsp;放NAND&nbsp;flash里
wangkj 发表于 2009-5-10 20:14 | 显示全部楼层

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

lz的想法从理论上讲,是完全没有问题的。
luhuaren 发表于 2009-5-10 20:29 | 显示全部楼层

re

什么叫理论上可以,实际上就是可以的,真是高手。。。。
 楼主| xiaowu5016 发表于 2009-5-10 20:57 | 显示全部楼层

那怎么做?

如果想直接把程序下载到nor&nbsp;flash里面运行的话,编程时是不是设置RO&nbsp;base为0x0?
yxwsz 发表于 2009-5-11 01:41 | 显示全部楼层

答案

程序是可以放在NOR&nbsp;FLASH直接运行的(把只读段,&nbsp;.text,&nbsp;.cinit放在NOR&nbsp;FLASH即可,因为NOR&nbsp;FLASH是线性寻址的),但是NOR&nbsp;FLASH速度很慢(与SRAM,&nbsp;SDR&nbsp;SDRAM&nbsp;,DDR&nbsp;SDRAM相比),所以一般用法是把程序放在NOR/NAND&nbsp;FLASH里面,处理器上电后,由BOOTLOADER把应用程序加载到SRAM/SDRAM里面去运行,这样运行速度比直接在FLASH里面运行可以提高很多。&nbsp;<br /><br />BOOTLOADER一般是放在NOR&nbsp;FLASH里面(注意是一般情况)。<br /><br />如果程序从NOR&nbsp;FLASH直接运行,需要把只读段(.text,&nbsp;.cinit)放在NOR&nbsp;FLASH所在的地址区域,可写段(.data,&nbsp;.bss)放在SDRAM/SRAM所在的地址区域。需要有初始化内容的可写段需要boot程序来初始化。
armecos 发表于 2009-5-11 18:29 | 显示全部楼层

有很多工作形态,

1、利用bootloader加载到RAM运行<br />2、直接在flash里运行<br />3、利用bootloader从flash里加载到RAM运行<br />4、利用bootloader从flash里解压缩程序并加载到RAM运行<br />.....<br /><br />这个在《增值包》里有清楚地说明,包括了ROM型、RAM型、ROMRAM型、ROM_COMPRESS型等等,一网打尽所有运行模式。<br /><br />比如:ecos提供了多种库类型对用不同的运行方式:ROM型、RAM型、ROMRAM型<br /><br />又比如VxWorks:<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”文件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

67

帖子

0

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