打印

关于arm中对rw段说明的讨论

[复制链接]
1716|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
playlinus|  楼主 | 2008-11-12 16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
网上任何一篇介绍 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拍砖...

相关帖子

沙发
dld2| | 2008-11-12 17:03 | 只看该作者

瞎讲

一个变量不能被改写怎么玩?

要么用的全是寄存器变量。

使用特权

评论回复
板凳
biehoff| | 2008-11-12 19:02 | 只看该作者

RE

被拍砖了···LZ貌似不可能吧

使用特权

评论回复
地板
dld2| | 2008-11-12 19:34 | 只看该作者

这样的

int a = 7;//会放在RW段

void main(void)
{
if(a == 7)
{
...
}

}
这样的程序,不拷贝RW,是不行的。

ZI初始化为零不是必须的。

使用特权

评论回复
5
纯金属| | 2008-11-14 14:35 | 只看该作者

.

NOR FLASH 是可以运行程序的。

使用特权

评论回复
6
playlinus|  楼主 | 2008-11-14 17:12 | 只看该作者

2楼. 变量放在NOR为什么就不能被改写啦 ?

使用特权

评论回复
7
gdpbeyond| | 2008-11-14 23:16 | 只看该作者

如果

如果bootloader 里有调用__main ,c运行时库会把RW 帮你拷到RW BASE位置的

使用特权

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

本版积分规则

102

主题

518

帖子

2

粉丝