ModeMask EQU 0x1F SVC32Mode EQU 0x13 IRQ32Mode EQU 0x12 FIQ32Mode EQU 0x11 User32Mode EQU 0x10 Abort32Mode EQU 0x17 Undef32Mode EQU 0x1B IRQ_BIT EQU 0x80 FIQ_BIT EQU 0x40
GBLS MainEntry MainEntry SETS "main" IMPORT $MainEntry ;****************************************************** AREA SelfBoot, CODE, READONLY IMPORT UDF_INS_VECTOR IMPORT SWI_SVC_VECTOR IMPORT INS_ABT_VECTOR IMPORT DAT_ABT_VECTOR IMPORT IRQ_SVC_VECTOR IMPORT FIQ_SVC_VECTOR ENTRY IF :DEF: |ads$version| ELSE EXPORT __main __main ENDIF ResetEntry b SYS_RST_HANDLER b UDF_INS_HANDLER b SWI_SVC_HANDLER b INS_ABT_HANDLER b DAT_ABT_HANDLER b . b IRQ_SVC_HANDLER b FIQ_SVC_HANDLER
;****************************************************** MACRO $Label HANDLER $Vector $Label sub lr, lr, #4 stmfd sp!, {r0-r3, lr} ldr r0, =$Vector ldr pc, [r0] ldmfd sp!, {r0-r3, pc}^ MEND UDF_INS_HANDLER stmfd sp!, {r0-r3, lr} ldr r0, =UDF_INS_VECTOR mov lr, pc ldr pc, [r0] ldmfd sp!, {r0-r3, pc}^ SWI_SVC_HANDLER stmfd sp!, {r0-r3, lr} ldr r0, =SWI_SVC_VECTOR mov lr, pc ldr pc, [r0] ldmfd sp!, {r0-r3, pc}^ INS_ABT_HANDLER sub lr, lr, #4 stmfd sp!, {r0-r3, lr} ldr r0, =INS_ABT_VECTOR mov lr, pc ldr pc, [r0] ldmfd sp!, {r0-r3, pc}^ DAT_ABT_HANDLER sub lr, lr, #4 stmfd sp!, {r0-r3, lr} ldr r0, =DAT_ABT_VECTOR mov lr, pc ldr pc, [r0] ldmfd sp!, {r0-r3, pc}^ IRQ_SVC_HANDLER sub lr, lr, #4 stmfd sp!, {r0-r12, lr} mrs r0, spsr stmfd sp!, {r0} ldr r0, =IRQ_SVC_VECTOR ldr pc, [r0] FIQ_SVC_HANDLER sub lr, lr, #4 stmfd sp!, {r0-r12, lr} mrs r0, spsr stmfd sp!, {r0} ldr r0, =IRQ_SVC_VECTOR ldr pc, [r0] ;******************************************************* SYS_RST_HANDLER mrs r0, cpsr ;enter svc mode and disable irq,fiq bic r0, r0, #ModeMask orr r0, r0, #(SVC32Mode :OR: IRQ_BIT :OR: FIQ_BIT) msr cpsr_c, r0 IMPORT InitSystem bl InitSystem adr r0, ResetEntry ldr r1, BaseOfROM cmp r0, r1 ldreq r0, TopOfROM beq InitRamData ldr r2, =CopyProcBeg sub r1, r2, r1 add r0, r0, r1 ldr r3, =CopyProcEnd 0 ldmia r0!, {r4-r7} stmia r2!, {r4-r7} cmp r2, r3 bcc %B0 ldr r3, TopOfROM ldr pc, =CopyProcBeg ;*********************************************** 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 ldr pc, GotoMain
GotoMain DCD $MainEntry
;*********************************************** IMPORT |Image$$RO$$Base| ; ROM code start IMPORT |Image$$RO$$Limit| ; RAM data starts after ROM program IMPORT |Image$$RW$$Base| ; Pre-initialised variables IMPORT |Image$$ZI$$Base| ; uninitialised variables IMPORT |Image$$ZI$$Limit| ; End of variable RAM space
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|
EXPORT GetBaseOfROM EXPORT GetEndOfROM EXPORT GetBaseOfBSS EXPORT GetBaseOfZero EXPORT GetEndOfBSS GetBaseOfROM ldr r0, BaseOfROM mov pc, lr GetEndOfROM ldr r0, TopOfROM mov pc, lr GetBaseOfBSS ldr r0, BaseOfBSS mov pc, lr GetBaseOfZero ldr r0, BaseOfZero mov pc, lr GetEndOfBSS ldr r0, EndOfBSS mov pc, lr ;*********************************************** END
直接把工程所有的空间都设置到RAM区,生成的BIN文件烧FLASH就可以。 CopyProcBeg 0 ldmia r0!, {r4-r11} stmia r2!, {r4-r11} cmp r2, r3 bcc %B0 CopyProcEnd
上面这段负责从FLASH搬移代码
adr r0, ResetEntry ldr r1, BaseOfROM cmp r0, r1 ldreq r0, TopOfROM beq InitRamData 上面这段,简单的说,就是判断代码从FLASH执行还是从RAM执行。
Image$$RO$$Base 这些是ADS连接器预定意的,KEIL也有吧, 有了这段启动代码,存储器空间怎么设置都为所谓。
|