s3c4510b中首先利用程序1建立中断向量,我认为是在flash(地址在0-2M处)中实现的,然后在?cstartup中,实现remap操作,把sdram映射到0-16m处,而flash到16-18M的地方,然后在执行堆栈初始化和在sdram中建立中断向量表,我现在有几点不太明白
1:
?cstartup Undefined_Handler SWI_Handler Prefetch_Handler Abort_Handler 0 IRQ_Handler FIQ_Handler 这些标号应该都是在flash中把?那么remap之后在sdram中再重新建立中断向量的时候,,flash的地址已经发生了变化,
程序2中
Reset_Addr DCD ?cstartup Undefined_Addr DCD Undefined_Handler SWI_Addr DCD SWI_Handler Prefetch_Addr DCD Prefetch_Handler Abort_Addr DCD Abort_Handler DCD 0 IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler
这些地址到底时remap之前的还是之后的啊,要是之前的不是跟sdram的地址重复?要是之后的难道flash中的标号会随remap操作,地址也跟着变化么?
2:remap操作时,标号RemapJump:是在操作之前存到堆栈中,执行完remap后又赋值给pc完成跳转,那么这个地址到底是在flash原来的地址0-2M处?还是映射后的地址16-18M处呢?帖子优点长,希望各位又兴趣的同仁,和各位大侠能给于指教,我想要时搞明白了这一点,对于arm学习也能有所帮助,多谢各位
程序1:在flash中实现中断表的建立
reset ; 复位标号 B ?cstartup ; 上电/复位后,PC跳至?cstartup,即启动代码处 B Undefined_Handler ; PC跳至非法指令异常处理入口 B SWI_Handler ; PC跳至软件中断异常处理入口 B Prefetch_Handler ; PC跳至预取中止异常处理入口 B Abort_Handler ; PC跳至数据中止异常处理入口 NOP ; 保留备用 B IRQ_Handler ; PC跳至IRQ异常处理入口 B FIQ_Handler ; PC跳至FIQ异常处理入口
FIQ_Handler ; FIQ异常处理入口 SUB sp, sp, #4 ; 保存r0值到sp栈 STMFD sp!, {r0} LDR r0, =HandleFiq ; 把HandleFiq标号地址给r0 LDR r0, [r0] ; 把r0内容给r0 STR r0, [sp, #4] ; 把r0值放在sp+4处 LDMFD sp!, {r0, pc} ; 把sp出栈到r0与pc中 ; 此6行代码是使PC指向HandleFiq(即0x00006c)地址里放的代码 ; 下同
IRQ_Handler ; IRQ异常处理入口 SUB sp, sp, #4 STMFD sp!, {r0} LDR r0, =HandleIrq LDR r0, [r0] STR r0, [sp, #4] LDMFD sp!, {r0, pc}
Prefetch_Handler ; 预取中止异常处理入口 SUB sp, sp, #4 STMFD sp!, {r0} LDR r0, =HandlePrefetch LDR r0, [r0] STR r0, [sp, #4] LDMFD sp!, {r0, pc}
Abort_Handler ; 数据中止异常处理入口 SUB sp, sp, #4 STMFD sp!, {r0} LDR r0, =HandleAbort LDR r0, [r0] STR r0, [sp, #4] LDMFD sp!, {r0, pc}
Undefined_Handler ; 非法指令异常处理入口 SUB sp, sp, #4 STMFD sp!, {r0} LDR r0, =HandleUndef LDR r0, [r0] STR r0, [sp, #4] LDMFD sp!, {r0, pc}
SWI_Handler ; SWI异常处理入口 SUB sp, sp, #4 STMFD sp!, {r0} LDR r0, =HandleSwi LDR r0, [r0] STR r0, [sp, #4] LDMFD sp!, {r0, pc}
ENDMOD ; ?RESET程序模块结束
程序2,实现remap和在ram中重建向量表
?cstartup:
;*****************************************************************
系统寄存器相关设置
;**************************************************************************************
LDR r13, PtInitRemap ; PC入栈,保存remap后PC地址 ;*************************************************************************************
remap操作,把sdram映射到0-16M处,flash16-18M
;**************************************************************************************
MOV pc, r13 ; PC出栈,恢复正确PC地址
PtInitRemap DCD RemapJump
RemapJump: ********************************************************************************** 初始化堆栈指针
**********************************************************************************
在sdram中重新建立中断向量表
; 拷贝中断向量表到地址0x00000000 MOV R8, #0 ADR R9, Vector_Init_Block LDMIA R9!, {R0-R7} STMIA R8!, {R0-R7} LDMIA R9!, {R0-R7} STMIA R8!, {R0-R7} B EXCEPTION_VECTOR_TABLE_SETUP ; 跳转至设置异常向量表标号处
Vector_Init_Block ; 异常向量表 LDR PC, Reset_Addr LDR PC, Undefined_Addr LDR PC, SWI_Addr LDR PC, Prefetch_Addr LDR PC, Abort_Addr NOP LDR PC, IRQ_Addr LDR PC, FIQ_Addr
Reset_Addr DCD ?cstartup Undefined_Addr DCD Undefined_Handler SWI_Addr DCD SWI_Handler Prefetch_Addr DCD Prefetch_Handler Abort_Addr DCD Abort_Handler DCD 0 IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler