网上任何一篇介绍 arm bootloader 的**都会提及对rw段的使用说明,而普遍较流行的一种说法如下: (完全copy http://zhanglicn.blog.sohu.com/72551452.html)
因为RO段是只读的,在运行的时候不可以改变,所以,在运行的时候,RO段可以驻留在Flash里(当然也可以在SDRAM或者 SRAM里了)。而RW段是可以读写的,所以,在运行的时候必须被装载到SDRAM或者SRAM里。 在用ADS编译的时候,是需要设置RO BASE 和RW BASE的,用过ADS的应该都清楚这点。通过RO BASE 和RW BASE的设置, 告诉链接器(linker)该程序的起始运行地址(RO BASE)和 RW段的地址 (RW BASE)。如果一个程序只有RO段,没有RW段, 那么这个程序可以完全在Flash里运行,不需要用到SDRAM 或者 SRAM。如果包括RW段和RO段,那么该程序的RW段必须在被访 问以前被拷贝到SDRAM 或者SRAM里去,以保证程序可以正确运行。下面这个图说明了一个程序执行前(load view)和执行时 (execute view)的状态。从图中可以看到,整个程序在执行前始放在ROM里的,在执行的时候,RW段被拷贝到了RAM里的合 适位置去。
针对此类对rw的讲法,我今天做了一个试验,将2410 bootloader的那段copy rw / 初始化 zi 的代码全部屏蔽掉,然后编译链 接下载到nor flash , 由nor启动, 程序居然正常运行 . 我的程序比较简单,但应该是包含了rw输入段的 .
这次实验是否能否认网上流行的这个所谓必须将rw段copy到sdram/sram中去运行的说法呢 , 个人认为只要是将程序下载到0 地址开始的类似nor/eeprom等线性的存储器上,程序就可以运行,而那个copy动作应该不是必须的.
渴望各位DX拍砖...
|