分类:
2009-04-15 16:42:43
真实很激动,经过了好久的调试程序终于可以从flash启动那个然后拷贝到sdram里面执行了。在这个过程中说实话真实花费了很多时间,最开始时看到88上trulyboy写的一些总结,就是用scf文件的方式,我也看了一下arm体系结构与编程(个人感觉跟ads的pdf文档差不多)里面关于这部分的讲解,还是没有理解太深,所以,研究了一周多时间也没搞明白,后来就放下了。等到最近又有了这方面的需求,就是液晶屏幕在仿真的时候ok的,但是烧到flash里面总会出现各种问题,比如水纹现象很严重。于是又找了些资料看了一下,看了支持ropi的apcs的东西,于是开始从这方面入手,可是调了两天也没成功,最后突然想到是否可以用下面的方法呢:
首先编写一个只有启动代码的工程,这个启动代码实现传统启动代码的功能之外,还实现把flash里面的程序拷贝到sdram里面,在原来启动代bl main的位置改为ldr pc,=0xc008000,这样就从flash启动后跳转到了sdram里面,在这个位置执行的只是bl main,然后跳转到main函数开始执行了。这些实际的应用程序是哪里来的呢?我们可以建立一个工程,里面是我们需要执行的程序,但是这个程序的ro base设置的就是0xc008000,rw base就是0xc
;********************************************************
;* Copy and paste RW data/zero initialized data *
;********************************************************
LDR r0, =0x5200; bin文件中的RW Base Get pointer to ROM data
LDR r1, =0xc
LDR r3, =0xc
;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, =0xc
MOV r2, #0
2
CMP r3, r1 ; Zero init
STRCC r2, [r3], #4
BCC %B2
LDR r0, =0x0828;RO在flash中的首地址,不足828的话用0补齐
LDR r1, =0x5200;RO在flash中的尾地址
LDR r3, =0xc008000;RO在sdram运行时候的首地址
0 CMP r0, r1
LDRCC r2, [r0], #4
STRCC r2, [r3], #4
BCC %B0
;--------Now we enter the C code
[ :LNOT:THUMBCODE ;if(!thumbcode) arm state;
;BL Main ;Don't' use main() because ......
ldr pc, =0xc008000; ;跳转到sdram中程序执行的首地址开始在sdram运行
B .
];
[ THUMBCODE ;for start-up code for Thumb mode;
orr lr,pc,#1
bx lr
CODE16
;BL Main ;Don't 'use main() because ......
ldr pc, =0xc008000;
b .
CODE32
]