4730|14

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

数据段从FLASH往SDRAM里拷贝 [复制链接]

44binit.s 中的 数据段从FLASH往SDRAM里拷贝的 那段 我怎么也没懂   

我对那段程序的分析结果是这样的: 如果代码段和数据段的存放空间是连在一起的 ,那么要做的工作只是把ZI段清0.否则, 把 夹在 代码段和数据段之间的 那部分代码 往数据段 拷贝 .拷贝完后把ZI段清0  .

疑问是:为什么要这样做 ?

程序:
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 ; 如果相等,后面的工作就是把ZI段清0
BEQ %F1   ;临近的标号地址跳转  F是向后寻找,B是向前  
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   ;把ZI段全部清零
STRCC r2, [r3], #4
BCC %B2

最新回复

还不错,分析的,和2440init.s很像  详情 回复 发表于 2008-9-17 11:34
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
Read Write 段 和 Zero Initialize 段必须进行初始化的,Read Write段的初始化
值要从ROM里面读,而Zero Initialize段要全填0
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
当你定义一些全部变量,如果不进行初始化,则会放到ZI那里,如果给了初值,就到RW那里
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
当你定义一些全局变量,如果不进行初始化,则会放到ZI那里,如果给了初值,就到RW那里
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 
我的问题的关键是: 程序中将代码段的末地址和数据段的首地址进行比较后(CMP r0, r1 ; ),再做下面的工作. 为什么要做这个比较? 什么意思?

还有,标号0 和1 之间的那段程序的意思是: 夹在 代码段和数据段之间的 那部分代码 往数据段 拷贝 .这我就更加不懂了.
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

6
 

    LDR r0, =|Image$$RO$$Limit| ;在ROM里面 RW的初始化值从这里开始存放
    LDR r1, =|Image$$RW$$Base|  ;在RAM里面 RW从这里开始存放
    LDR r3, =|Image$$ZI$$Base|  ;在RAM里面 ZI从这里开始存放
    CMP r0, r1
    BEQ %F1
0
    CMP r1, r3 ; Copy init data RW后面紧接着的就是ZI
    LDRCC r2, [r0], #4
    STRCC r2, [r1], #4
    BCC %B0
1
    LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment
    MOV r2, #0
2
    CMP r3, r1 ; Zero init   ;把ZI段全部清零
    STRCC r2, [r3], #4
    BCC %B2
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

7
 
我的问题的关键是: 程序中将代码段的末地址和数据段的首地址进行比较后(CMP r0, r1 ; ),再做下面的工作. 为什么要做这个比较? 什么意思?
------------------------
那就是不需要进行复制。 一般来说,嵌入产品总是从ROM开始运行,然后所有的代码可能
被copy到RAM, 而copy之后,正好不再需要复制RW部分(适当设置Linker即可)。
另外的情况是代码一开始就在RAM(从JTAG加载程序进行Debug),这时RW可能也不要copy


还有,标号0 和1 之间的那段程序的意思是: 夹在 代码段和数据段之间的 那部分代码 往数据段 拷贝 .这我就更加不懂了.
------------------------------
这部分代码就是复制RW的初始化值,这些初始化值在ROM里面,必须复制到RAM里面
因为可读写的变量总是在RAM里面定义的

 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
大侠的意思,我基本上懂了。能加我QQ吗? 小弟我真的需要象您这样的高人指点一下才有学习的勇气和动力 。QQ: 172541024
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

9
 
LDR r0, =|Image$$RO$$Limit| ;在ROM里面 RW的初始化值从这里开始存放
LDR r1, =|Image$$RW$$Base|  ;在RAM里面 RW从这里开始存放
LDR r3, =|Image$$ZI$$Base|  ;在RAM里面 ZI从这里开始存放
  CMP r0, r1   


|Image$$RO$$Limit| 是在ROM里  ,|Image$$RW$$Base| 是在RAM 里 。 那r0 和r1 那肯定不相等啊。那就没必要进行比较了。

请指教





 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

10
 
|Image$$RO$$Limit| 是在ROM里  ,|Image$$RW$$Base| 是在RAM 里 。 那r0 和r1 那肯定不相等啊。那就没必要进行比较了。
------------------------------------
不一定的。程序可能整个的从ROM复制到RAM再运行,那所有东西都在RAM里,包括只读的
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
又糊涂了



现在做实验,现象是这样的: 如果设置 RO BASE 为 0X0C00 0000 的话,我把UC/OS2 的.HEX代码直接 烧到FLASH ,结果串口有正确输出。如果设置 RO BASE 为 0X0000 0000 的话 ,就没串口输出了。

问: ADS里设置的RO BASE  和 RW BASE 这2个地址到底干嘛用的?

而且,在程序里写 |Image$$RO$$Limit| 和 BaseOfROM  ,系统都能识别 。为什么?

附UC/OS2 的 那段拷贝程序:
  ;****************************************************
    ;拷贝并粘贴 RW data/zero initialized data                    *
    ;****************************************************
        adr                r0, ResetEntry         ; 为小范围的地址读取伪指令。ADR指令将基于PC相对偏移的地址值读取到寄存器                               
        ldr                r1,        BaseOfROM    ; 为大范围的地址读取伪指令。
        cmp                r0,        r1
        ldreq        r0, TopOfROM   
        beq                InitRamData
       
        ;****************************************************
        ;计算拷贝程序在flash中的实际位置                                            *
        ;****************************************************
        ldr                r2,        =CopyProcBeg      
        sub                r1, r2, r1
        add                r0, r0, r1       
        ldr                r3,        =CopyProcEnd
       
        ;****************************************************
        ;将拷贝程序复制到ram中                                                                *
        ;****************************************************
0       
        ldmia        r0!, {r4-r7}
        stmia        r2!, {r4-r7}
        cmp                r2, r3
        bcc                %B0       
       
        ;********************************************************
        ;开始用ram中的拷贝程序复本将所有剩下的代码复制到ram中        *
        ;********************************************************
        ldr                r3, TopOfROM               
        ldr                pc, =CopyProcBeg
       
        ;********************************************************
        ;本段将代码由实际烧入的地址拷贝到ro-base所指定的位置        *
        ;只拷贝CopyProcEnd以后的代码                                                        *
        ;********************************************************
CopyProcBeg       
0       
        ldmia        r0!, {r4-r11}
        stmia        r2!, {r4-r11}
        cmp                r2, r3
        bcc                %B0       
CopyProcEnd
       
        sub                r1, r2, r3
        sub                r0, r0, r1               
       
InitRamData       
        ldr                r2, BaseOfBSS
        ldr                r3, BaseOfZero       
0
        cmp                r2, r3
        ldrcc        r1, [r0], #4
        strcc        r1, [r2], #4
        bcc                %B0       

        mov                r0,        #0
        ldr                r3,        EndOfBSS
1       
        cmp                r2,        r3
        strcc        r0, [r2], #4
        bcc                %B1       


 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
Great_bug 大侠,你去哪了?  怎么不回答我的问题了?  

 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

13
 
ADS里设置的RO BASE  和 RW BASE 这2个地址到底干嘛用的?
------------------------------
通常你的系统有Flash Memory和RAM,RO BASE要设为Flash Memory的开始地址,
RW BASE要设为RAM的开始地址,不是随意的。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

14
 
44B0的地址0是Flash, 你用JTAG往里面写,一般是不会成功的,因为它是ROM.
在0xc000000上是SDRAM, 用JTAG可以成功写,但掉了电程序就没了。

解决的办法
1. 使用适当的工具,使JTAG在加载程序到Flash的时候,能正确的烧Flash;
2. 在你的程序里包含Flash烧写代码。程序先加载到SDRAM, 然后给出一个指令,
   程序就烧写到Flash.
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

15
 
还不错,分析的,和2440init.s很像
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表