打印

00启动代码中,不理解的程序

[复制链接]
2004|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子尘埃|  楼主 | 2007-5-24 12:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    LDR R1,=0x001E0000   ;BIOS在FLASH中的地址
    LDR R2,=0x0C7C0000   ;BIOS在SDRAM中的地址
    LDR R7,=0x0C7D0000-4 ;BIOS总共64K
LOOP:
    LDMIA R1!,{R3-R6}     ;装入4个字到寄存器中
    STMIA R2!,{R3-R6}     ;将4个字保存到RAM中
    CMP R2,R7            ;比较拷贝是否完成
    BLS LOOP             ;循环
    
0x001E0000 0x0C7C0000 0x0C7D0000-4这三个数值是怎么算出来的呀,在ADS1.2中
    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
只要设置ARM Linker中的R0 Base RW Base的相应值就可以,
在KEIL中如何实现的呀??
望高手赐教,在线等呀,

相关帖子

沙发
computer00| | 2007-5-26 00:26 | 只看该作者

这些地址是我自己定义的,

这是我自己定义的。由于要对FLASH操作,所以要将代码复制到RAM中去运行。
所以我将BIOS分成了两部分,一部分为装载部分,地址位于0x1d0000,
这部分代码是与地址无关的,放在哪里都可以执行。

另一部分为主程序部分,位于0x1e0000(具体请看memory map那张图),
在地址0放一条跳转到0x1d0000的指令,复位后从0x1d0000开始执行。
由装载部分将位于0x1e0000到0x1effff之间的64K代码复制到RAM的
0xc7c0000处,然后再到RAM中去执行。

烧写FLASH时有点罗嗦,就是先将ROM地址设置为0xc000000,然后产生
一个HEX文件。然后再打开这个HEX文件,将其前半段和后半段分离
出来,并将后半段的段地址设置为0。再将这两个HEX文件使用HEX
转bin文件工具转换为两个二进制文件load.bin和main.bin。然后
再将ROM地址改为0,在keil中使用ulink将代码下载到FLASH中,复位执行。
然后通过串口或者网口先将主程序(刚刚的main.bin)部分下载到RAM中,
并将其复制到0xc7c0000处,然后再将前半段的装载部分(刚刚的load.bin)
下载到RAM中,并运行之。这样原来的程序就由ROM运行到刚下载的RAM中的
主程序中去了。这时再将装载和主程序部分分别烧入FLASH的0x1d0000和
0x1e0000处,并将一份装载程序烧入到地址0(随便烧个什么程序到
地址0也行,程序会自动在地址0放一条跳转到0x1d0000的指令),
下次启动时就会从装载部分启动,然后将代码复制到RAM,跳到RAM
中去运行了。

为什么要搞这么麻烦请看:
https://bbs.21ic.com/club/bbs/list.asp?boardid=35&t=2496814&tp=


后来我又对代码做了一点改动,原来的代码没有判断加载程序是否处于RAM中,而是
直接复制.后来的代码加了一点判断,如果程序从RAM中运行,则不进行代码复制,
这就方便了程序的烧入,因为加载部分是地址无关的,所以可以直接将其下载到RAM中,
然后再运行之.


修改的代码:
;****************************************************************************
;将FLASH中的代码段(0x1E0000-0x1EFFFF)复制到RAM中(0xC7C0000-0xC7CFFFF)
;如果已经在RAM中运行,则不要复制
    MOV R1,PC
    LDR R2,=0x0C000000   ;SDRAM的起始地址
    CMP R2,R1
    BLS EndCopy
    LDR R1,=0x001E0000   ;BIOS在FLASH中的地址
    LDR R2,=0x0C7C0000   ;BIOS在SDRAM中的地址
    LDR R7,=0x0C7D0000-4 ;BIOS总共64K
LOOP:
    LDMIA R1!,{R3-R6}     ;装入4个字到寄存器中
    STMIA R2!,{R3-R6}     ;将4个字保存到RAM中
    CMP R2,R7            ;比较拷贝是否完成
    BLS LOOP             ;循环
EndCopy:
;****************************************************************************


另外还有中断和IO口等初始化部分也做了改动,否则uClinux启动后网卡不能用.
详细情况
https://bbs.21ic.com/club/bbs/list.asp?boardid=35&t=2525986&tp=

使用特权

评论回复
板凳
luhuaren| | 2007-5-26 12:19 | 只看该作者

RE

OO 绝对是热心人。。

使用特权

评论回复
地板
手足无措| | 2007-5-27 16:43 | 只看该作者

自己规划内存空间的时候定的把

使用特权

评论回复
5
xjg121| | 2007-6-3 19:46 | 只看该作者

向00学习,不过没有具体操作

使用特权

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

本版积分规则

51

主题

444

帖子

0

粉丝