|
楼主 |
发表于 2008-8-20 14:54:22
|
显示全部楼层
下面是基于ARM7的uC/OS-II启动代码中的一部分:
//定义RAM-ROM的起始及映射地址
IF EF: FLASH ; if we startup from flash
START_RAM_BASE EQU (0x00300000)
START_FLASH_BASE EQU (0x00000000)
REMAP_FLASH_BASE EQU (0x01000000)
ELSE ; if we startup from ram by ICE
START_RAM_BASE EQU (0x00000000)
ENDIF
REMAP_RAM_BASE EQU (0x00000000)
RAM_SIZE EQU (0x00040000) ; Unit: bytes, 256K
FLASH_SIZE EQU (0x00200000) ; Unit: bytes, 2M
VectorTable
LDR PC, [PC, #&18] ; SoftReset
LDR PC, [PC, #&18] ; UndefHandler
LDR PC, [PC, #&18] ; SWIHandler
LDR PC, [PC, #&18] ; PrefetchAbortHandler
LDR PC, [PC, #&18] ; DataAbortHandler
nop ; Reserved
LDR PC, [PC,#-0xF20] ; IRQ : read the AIC
LDR PC, [PC,#-0xF20] ; FIQ : read the AIC
;- There are only 5 offsets as the vectoring is used.
DCD SoftReset
DCD UndefHandler
DCD SWIHandler
DCD PrefetchAbortHandler
DCD DataAbortHandler
向量拷贝:
LDR R1, =START_RAM_BASE ; parameter 2 for the function- START_RAM_BASE (0x00000000)
ADD R0, PC, #-(8+.-VectorTable) ; @ where to read values (relative,why???)
BL AT91F_CopyVector2Ram
在向量拷贝前,有一段代码是将位于ROM中0X00000000处开始的代码拷贝到RAM中地址为0X00300000处,
在烧写程序到ROM中时是写到映射后的地址0X01000000,那么程序运行时,怎样将程序从此处调到RAM里去老运行呢?
前面相量表中的相对地址又是怎样确定的?
ADD R0, PC, #-(8+.-VectorTable) 里PC, #-(8+.-VectorTable) 又怎样理解?
|
|