共2条
1/1 1 跳转至页
44b0,RO,RW,ZI 关于44b0的RO,RW,ZI
问
程序固化在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: 关于RO、RW、ZI的说明本人的正在写的总结中的一段,希望对你有帮助
汇编:
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
如果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: 关于RO、RW、ZI的说明本人的正在写的总结中的一段,希望对你有帮助
汇编:
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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |