打印

NOR Flash代码拷贝问题

[复制链接]
2980|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ADaiPlay|  楼主 | 2010-8-9 22:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
NORRoCopy   ;copy_proc_beg  by pht
bl ClearSdram
adr r0, ResetEntry  ;判断是否在ROM中运行,ROM即RO指定的地址 从NOR启动时ResetEntry为0
ldr r2, BaseOfROM  ;如果是则跳转到RwCopy 否则的话,将程序拷贝到ROM地址
cmp r0, r2
beq NORRwCopy   
ldr r3, TopOfROM  ;
0      
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0

  
NORRwCopy
ldr r0, TopOfROM
ldr r1, BaseOfROM
sub r0, r0, r1   ;TopOfROM-BaseOfROM得到从0开始RW的偏移地址
ldr r2, BaseOfBSS  ;将RW部分的数据从ROM拷贝到RAM
ldr r3, BaseOfZero
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0

InitRamZero
mov r0, #0
ldr r2, BaseOfZero
ldr r3, EndOfBSS
1
cmp r2, r3    ;初始化Zero部分 不管从哪里启动,这部分都需要执行
strcc r0, [r2], #4
bcc %B1

ldr pc, =CEntry  ;goto compiler address

BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|

曾听说代码拷贝过程中不能将Nor正在运行的代码拷贝到RAM中,存在程序运行与读写数据冲突问题,上面这段代码怎么感觉是这么做的呢?而且可以运行的啊。

相关帖子

沙发
ADaiPlay|  楼主 | 2010-8-10 08:53 | 只看该作者
2440的启动代码

GOD!!!
这个问题又是很阿呆吗?

使用特权

评论回复
板凳
ADaiPlay|  楼主 | 2010-8-10 22:13 | 只看该作者
这是某哥们发的,是44B0上的,说的比较让人迷糊:
;========================================================
;========================================================
;注:以下这一小段代码还是在ROM中执行的,但这一小段代码却完成了非常重要的功能,完成的功能如下
;1:判断加载域和运行域是否相同,如果不同,那么要把"拷贝程序模板"事先复制到运行域中去,然后跳转到运行域,
;再把ROM中的代码拷贝到
;RAM中去,为什么要这样,因为ARM的程序在ROM中执行的时候,不能再读取ROM中的数据,然后写入到RAM中去,只能把完成拷贝功能
;的那一小部分代码先拷贝到RAM中去,然后跳转到RAM中,执行从ROM中读取数据,然后将读到的数据拷贝到RAM中去这样的操作。

;====================================================
  ;拷贝并粘贴 RW data/zero initialized data               
;====================================================
    adr        r0, ResetEntry        ;R0中装入ResetEntry,注意,adr这条指令是个伪指令,也即加载域首地址,理解这条指令很关键,弄不好要看汇编后的代码,。,,
    ldr        r1,    BaseOfROM            ;R1中装入BaseOfROM,BaseOfROM为运行域首地址
    cmp        r0,    r1                        ;比较R0和R1是否相等,也就是比较加载域地址和运行域地址是否相同
    ldreq    r0, TopOfROM
    beq        InitRamData                ;如果相等,则跳转到InitRamData
   
    ;====================================================
    ;计算拷贝程序在flash中的实际位置                        
    ;====================================================
    ldr        r2,    =CopyProcBeg    ;将CopyProcBeg装入到R2,CopyProcBeg为代码拷贝的首地址
    sub        r1, r2, r1                ;    r1 = r2 - r1,这里因为CopyProcBeg标号和BaseOfROM标号有个偏差,而我们要把
                                                    ;烧录到ROM中CopyProcBeg处的一段代码拷贝到BaseOfROM为起始地址处,但CopyProcBeg
    add        r0, r0, r1                ;r0 = r0 + r1,这句话实际上是得出加载域中CopyProcBeg的地址
    ldr        r3,    =CopyProcEnd    ;r3 = CopyProcEnd
   
;====================================================
;将拷贝程序复制到ram中                                
;====================================================
0   
    ldmia    r0!, {r4-r7}        ;将加载域中的值装入到R4-R7,并且加载域地址指针自增
    stmia    r2!, {r4-r7}        ;将R4-7中的值装入到R2所指的一段内存处,并且运行域地址指针自增。
    cmp        r2, r3                    ;判断是否拷贝结束
    bcc        %B0   
   
;====================================================
;开始用ram中的拷贝程序复本将所有剩下的代码复制到ram中   
;====================================================
    ldr        r3, TopOfROM            ;将RO段的数据长度装入到R3
    ldr        pc, =CopyProcBeg    ;将PC指针指向CopyProcBeg,注意这以后的程序就是在RAM中运行了
   
;=========================================================
;=========================================================


;=========================================================
;以下程序在RAM中执行了!
;=========================================================

;=========================================================
;本段将代码由实际烧入的地址拷贝到ro-base所指定的位置   
;只拷贝CopyProcEnd以后的代码                           
;这段代码是将RO段代码由加载域拷贝到运行域中去
;=========================================================
CopyProcBeg                        
0   
    ldmia    r0!, {r4-r11}        ;将加载域中的值装入到R4-R7,并且加载域地址指针自增
    stmia    r2!, {r4-r11}        ;将R4-7中的值装入到R2所指的一段内存处,并且运行域地址指针自增。
    cmp        r2, r3                    ;判断是否将RO段的代码完全从加载域拷贝到运行域,如果没拷贝完则继续拷贝
    bcc        %B0   
CopyProcEnd
                                                ;此处则说明RO段代码已经拷贝完成,那么接下来要将RW段的数据从加载域拷贝到运行域
    sub        r1, r2, r3            
    sub        r0, r0, r1            ;这里应该是进行字节对齐的处理。以免少拷贝几个字节的东西。
   
;=========================================================
;这段代码是将RW段代码由加载域拷贝到运行域中去
;=========================================================                                
InitRamData                        
    ldr        r2, BaseOfBSS        ;RW段首地址
    ldr        r3, BaseOfZero    ;RW段长度
0
    cmp        r2, r3                    ;判断是否将RW段的代码完全从加载域拷贝到运行域,如果没拷贝完则继续拷贝
    ldrcc    r1, [r0], #4        ;将R0所指单元的数据拷贝到R1中
    strcc    r1, [r2], #4        ;将R1中的数据复制到R2所指单元中去
    bcc        %B0               
   
;=========================================================
;这段代码是将ZI段数据清零
;=========================================================
    mov        r0,    #0               
    ldr        r3,    EndOfBSS        ;将ZI段数据结束地址装入R3,用以判断ZI段是否清零结束
1   
    cmp        r2,    r3                    ;判断ZI段是否结束,如果未结束,还要继续清零内存
    strcc    r0, [r2], #4        ;将R2所指单元的内容清零   
    bcc        %B1      

直接使用1楼的代码实际测试是可以运行的,难道2440和44B0的NOR代码搬运有区别?

使用特权

评论回复
地板
centimetre| | 2010-8-11 08:53 | 只看该作者
曾听说代码拷贝过程中不能将Nor正在运行的代码拷贝到RAM中,存在程序运行与读写数据冲突问题,

这个讲法没什么道理

使用特权

评论回复
5
ADaiPlay|  楼主 | 2010-8-13 19:45 | 只看该作者
嗨~~~~~~

使用特权

评论回复
6
ADaiPlay|  楼主 | 2010-8-13 19:45 | 只看该作者
没道理就不管他了

使用特权

评论回复
7
meyong08| | 2010-8-22 13:12 | 只看该作者
学习一下

使用特权

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

本版积分规则

个人签名:老实做人,塌心做事——为理想挥汗 网站:www.edreamtek.com 文章:http://blog.csdn.net/adaiplay

23

主题

626

帖子

6

粉丝