主题 : 2440test中的bug? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 19844
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
综合积分: 8 分
注册时间: 2010-04-23
最后登录: 2017-09-13
楼主  发表于: 2010-06-18 20:32

 2440test中的bug?

copy_proc_beg
417 adr r0, ResetEntry                                 ;装载地址,ResetEntry值->r0
418 ldr r2, BaseOfROM                               ;BaseOfROM值(后面有定义)->r2
419 cmp r0, r2                                              ;比较RO,R2
420 ldreq r0, TopOfROM                            ;如果相等的话(说明在内存中运行),TopOfROM->r0
421 beq InitRam                                          ;同时跳到InitRam
432 ldr r3, TopOfROM
433 0                                                              ;ldm批量数据加载指令,ldm后的ia表示每次传送后地址+1
434 ldmia r0!, {r4-r7}                                   ;运行一次后R0=(R4到R7寄存器个数)*4
435 stmia r2!, {r4-r7}                                   ;stm批量数据存储指令,!的作用,当数据传输完毕,将最后的地址写入R2
436 cmp r2, r3
437 bcc %B0                                                ;C标志置位/大于或小于时向后跳转到0标号处
438                                                                ;最终实现拷贝数据到ram
439 sub r2, r2, r3                                        ;r2=BaseOfROM-TopOfROM=(-)代码长度
440 sub r0, r0, r2                                        ;r0=ResetEntry-(-)代码长度=ResetEntry+代码长度


借general2537的2440init.s注释一用。我认为上面的红色代码存在bug。分析如下:

436 cmp r2, r3比较r2, r3的大小,r2<r3时,执行437 bcc %B0跳转。

当433~437的循环执行完后,也就是从norflash复制RO段到内存中后。r2等于r3。

所以,在执行439 sub r2, r2, r3和440 sub r0, r0, r2后,r0等于ResetEntry,而不是“ResetEntry+代码长度”

是不是438行掉了一句:ldr r2, BaseOfROM?看过2440test的源代码,确实没有这句话。

本人初学,请版大和各位高手赐教!谢谢!
[ 此帖被luxinkai在2010-06-21 15:06重新编辑 ]
级别: 侠客
UID: 4843
精华: 0
发帖: 102
金钱: 810 两
威望: 554 点
综合积分: 204 分
注册时间: 2009-03-31
最后登录: 2012-11-14
1楼  发表于: 2010-06-18 21:42
r3 == TopOfROM(运行域)
r0 == TopOfROM(加载域)+N      (N>=0)
r2 == r3+N


sub r2,r2,r3 ----> r2 == N
sub r0,r0,r2 ----> r0 ==TopOfROM(加载域),也即Entry+代码长度
级别: 新手上路
UID: 19844
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
综合积分: 8 分
注册时间: 2010-04-23
最后登录: 2017-09-13
2楼  发表于: 2010-06-21 15:40
非常感谢ofourme 的留言!经过重新仔细分析代码,发现了理解的失误。ofourme 的意思我基本明白了,但是我觉得可能表述的不是很正确。这里重新分析r0,r2,r3变量的变化,也和大家一起进步。

copy_proc_beg
417 adr r0, ResetEntry                                 ;装载地址,ResetEntry值->r0
418 ldr r2, BaseOfROM                               ;BaseOfROM值(后面有定义)->r2
419 cmp r0, r2                                              ;比较RO,R2
420 ldreq r0, TopOfROM                            ;如果相等的话(说明在内存中运行),TopOfROM->r0
421 beq InitRam                                          ;同时跳到InitRam
;/////////////////////////////////////////////////////////////////////////////////////////
;//上面的代码分析ResetEntry==BaseOfROM是否成立,以确定代码是否在内存中运行。
;//ResetEntry==BaseOfROM,则跳转到InitRam(该流程不做详细分析)
;//ResetEntry!=BaseOfROM,则执行下面的从norflash拷贝程序,
;//此时r0==ResetEntry、r2==BaseOfROM
;/////////////////////////////////////////////////////////////////////////////////////////

432 ldr r3, TopOfROM
;//此时,r3==TopOfROM
433 0                                                              ;ldm批量数据加载指令,ldm后的ia表示每次传送后地址+1
434 ldmia r0!, {r4-r7}                                   ;运行一次后R0=(R4到R7寄存器个数)*4
435 stmia r2!, {r4-r7}                                   ;stm批量数据存储指令,!的作用,当数据传输完毕,将最后的地址写入R2
436 cmp r2, r3
437 bcc %B0                                                ;C标志置位/大于或小于时向后跳转到0标号处
438                                                                ;最终实现拷贝数据到ram
/////////////////////////////////////////////////////////////////////////////////////////
;//从norflash拷贝程序到ram后,此时,r0==ResetEntry+(TopOfROM -BaseOfROM)
;//而r2==r3==TopOfROM
/////////////////////////////////////////////////////////////////////////////////////////

439 sub r2, r2, r3                                        
440 sub r0, r0, r2                                        
/////////////////////////////////////////////////////////////////////////////////////////
;//sub r2, r2, r3 执行完后                  r2==r2-r3==0
;//sub r0, r0, r2 执行完后                 r0==r0+r2==r0+0==ResetEntry+(TopOfROM -BaseOfROM)
;//即r0==ResetEntry+代码长度
/////////////////////////////////////////////////////////////////////////////////////////

结果是对了,但sub r2, r2, r3和sub r0, r0, r2好像没什么用处。
本人才疏学浅,以上分析如有错误,还请大家指正。谢谢!
[ 此帖被luxinkai在2010-06-21 15:49重新编辑 ]
级别: 侠客
UID: 4843
精华: 0
发帖: 102
金钱: 810 两
威望: 554 点
综合积分: 204 分
注册时间: 2009-03-31
最后登录: 2012-11-14
3楼  发表于: 2010-06-21 23:55
我可认为我的表述没问题。
435 stmia r2!, {r4-r7} 的操作一般不会刚好对齐镜像文件的大小,所以我用+N来描述。