这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » s3c4510b启动代码的疑问,请大家指点一下

共2条 1/1 1 跳转至

s3c4510b启动代码的疑问,请大家指点一下

菜鸟
2005-06-08 18:21:27     打赏

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




关键词: s3c4510b     启动     代码     疑问     大家     指点         

菜鸟
2005-06-09 17:40:00     打赏
2楼

总算弄明白了,原来cstartup编译时可以直接放在16M地址处,而中断向量编译在0x0地址处,可以用scatter file实现,烧写到flash后,由于上电开始flash地址在,一开始先执行到remap,remap之前保存了remap之后程序的地址: LDR r13, PtInitRemap ; PC入栈,保存remap后PC地址,这个ptinitremap在编译时已经处于16M的地址空间了,所以remap完后,又跳转到16M地址处执行,这时flash地址已经remap到16M地址处了,所以正好可以执行,而中断向量编译时都放在了相应的地址处,所以重新建立中断时,中断向量的执行也在sdram中产生.昨天把代码反汇编了一下,总算明白了,写下来,希望也能对有此疑问的有所帮助.


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]