共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 跳转至页
回复
| 有奖活动 | |
|---|---|
| 这个春节你犒赏自己什么了?分享你的故事,有奖征集 | |
| 2026年“我要开发板活动”第三季,开始了! | |
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
我要赚赏金打赏帖 |
|
|---|---|
| 【S32K3XX】Standby RAM的初始化流程被打赏¥18元 | |
| Gravity:中英文语音合成模块V2.0及其串口控制被打赏¥24元 | |
| 全彩色度变化图的绘制被打赏¥27元 | |
| 【FreeRtos】FreeRtos任务栈的生长方向管理方式被打赏¥20元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】LVGL添加输入设备:EC11旋转编码器被打赏¥39元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】RA8D1部署FreeRTOS+LVGL被打赏¥33元 | |
| 空气质量检测器设计与实现被打赏¥24元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】LWIP进行UDP、TCP、HTTP、MQTT功能联合测试被打赏¥41元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】RA8D1部署FreeRTOS+LWIP被打赏¥36元 | |
| RTOS怎么选?让我来给你答案!被打赏¥15元 | |
我要赚赏金
