这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 44b0,RO,RW,ZI 关于44b0的RO,RW,ZI

共2条 1/1 1 跳转至

44b0,RO,RW,ZI 关于44b0的RO,RW,ZI

院士
2006-09-17 18:14:16     打赏
44b0,RO,RW,ZI 关于44b0的RO,RW,ZI



关键词: 关于    

院士
2006-12-22 22:43:00     打赏
2楼
问 程序固化在flash中,有程序和字符串什么的东西,把程序部分当作ro,字串什么的是zw,而RO,ZW,ZI是编译器知道的东西,如果RO定位于flash地址空间的话,那么程序只能在flash空间运行。初始化程序只需把rw(ROLimit为起始地址)拷贝到SDRAM中指定的RW处,然后把ZI区域初始化为0;
如果RO定位于SDRAM空间的话,说明连接器生成代码位置无关,或者有些代码必须运行在SDRAM空间。这样的话久需要初始化的时候把Flash里面的程序拷贝到SDRAM的RO区域,拷贝完成的时候指向ROM的指针就应该到了zwbase了。
不知道这样理解对吗?有没有哪位大哥有详细的资料介绍一下,最好有图示或则视频演示,
下面是我的程序,研究了一下好像不支持code从flash拷贝到sdram,
    LDR        r0, =|Image$$RO$$Limit|    ; Get pointer to ROM data
    LDR        r1, =|Image$$RW$$Base|    ; and RAM copy
    LDR        r3, =|Image$$ZI$$Base|    
    ;Zero init base => top of initialised data
            
    CMP        r0, r1        ; Check that they are different
    BEQ        %F1
0        
    CMP        r1, r3        ; Copy init data
    LDRCC   r2, [r0], #4    ;--> LDRCC r2, [r0] + ADD r0, r0, #4         
    STRCC   r2, [r1], #4    ;--> STRCC r2, [r1] + ADD r1, r1, #4
    BCC        %B0
1        
    LDR        r1, =|Image$$ZI$$Limit| ; Top of zero init segment
    MOV        r2, #0
2        
    CMP        r3, r1        ; Zero init
    STRCC   r2, [r3], #4
    BCC        %B2

有没有哪位大哥有可以拷贝的也一起传一个来吧。
   1: 关于RORWZI的说明本人的正在写的总结中的一段,希望对你有帮助

汇编:
AREA sectionname,CODE,READONLY                    Code
AREA sectionname,DATA,READWRITE                    RW 数据区
AREA sectionname,DATA,READONLY                    RO 数据区
C:
const常量带初值                                    RO 数据区
全局变量带初值                                    ZW 数据区
局部变量带初值                                    RO 数据区
仅定义全局变量                                    ZI 数据区
    
Release版本中,S3C44B0X一般RO区从0x0000 0000开始,RW区从0x0c00 0000开始,ZI区紧跟在RW区后。有时没有RW区,ZI区就从0x0c00 0000开始。这是简单的linktype。

2.    |Image$$??$$????|符号的作用
S3C44B0X启动文件中有如下一段导入了这几个由 ARM连接器产生的奇怪符号:
IMPORT    |Image$$RO$$Limit|                    RO 代码区末
IMPORT    |Image$$RW$$Base|                    RW 数据区头
IMPORT    |Image$$ZI$$Base|                    ZI 数据区头
IMPORT    |Image$$ZI$$Limit|                    ZI 数据区末

举例,某程序编译后Code区占2724(0x0aa4)字节,RW区40(0x28)字节,RO区9608字节,下面是将启动代码载入到FLASH中的结果(经处理后):

LDR     r0, =|Image$$RO$$Limit|                r0=#0x00000aa4
        LDR        r1, =|Image$$RW$$Base|                r1=#0x0c000000
        LDR        r3, =|Image$$ZI$$Base|                r3=#0x0c000028
CMP     r0, r1
BEQ        0x44c
0x43c:    CMP        r1, r3                                搬FLASH中RW数据到RAM中
LDRCC   r2, [r0], #4
STRCC   r2, [r1], #4
BCC        0x43c
0x44c:    LDR        r1, =|Image$$ZI$$Limit|                r1=#0x0c0025b0
MOV        r2, #0
0x454:    CMP        r3, r1                                ZI 数据区清零
STRCC   r2, [r3], #4
BCC        0x454
2: 有所启发经过一段时间的思考,已经初步了解了bootloader的机制:
RO如果是在SDRAM的话,(最好在RAMSTART那里方便计算)。
这样的话,所有的程序就最好在SDRAM空间运行了
因为所有的标号绝对定位的话,就在0x0c000000之后了。

下面说一下思路:

b  ResetHandler ;  因为是相对地址,所以也能跳到Flash中的那个标号。

ResetHandler  

防止有对PC绝对的赋值,最好一开始就开始拷贝  
拷贝完毕之后,flash ,和SDRAM里面的程序都有程序了,也不用再在flash里面混了,进行对pc绝对赋值:


copyend
   ldr pc,=entersdram;(entersdram是绝对地址,这样赋值之后PC就指向
                       SDRAM  空间了。上下衔接是比较连贯的。移花接木,呵呵。
                       PC变了,但是对于CPU来说任务还是连贯的)
entersdram

然后进行其它的初始化、bl main 什么的可以继续了。

3: ding

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]