2011-03-01 23:25:22
目地:更清晰的了解bootloader的结构及功能。为移植U-boot打基础。
以前只知道大概,今天利用IAR调试工具,看着汇编代码,看着寄存器,看着内存。来单步调试bootloader。把之前不明白的地方都搞明白。
今天单步走到了初始化堆栈。主要研究了设置memory寄存器及初始化堆栈。不过还有一个问题,为什么要用DCD分配内存空间。不能用为WATCHDOG寄存器赋值的方法来给BWSCON来赋值?貌似和内存映像相关。明天要搞明白。
一:设置memory寄存器 (见上图)
二:初始化堆栈
InitStacks
;Don't use DRAM,such as stmfd,ldmfd......
;SVCstack is initialized before
;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr
cpsr_cxsf,r1'
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ;UndefMode
ldr sp,=UndefStack ; UndefStack=0x33FF_5C00
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1 ;AbortMode
ldr sp,=AbortStack ; AbortStack=0x33FF_6000
。。。。。
bic r0,r0,#MODEMASK|NOINT
orr r1,r0,#SVCMODE
msr cpsr_cxsf,r1 ;SVCMode
ldr sp,=SVCStack ; SVCStack=0x33FF_5800
这段代码我当初的理解是为修改cpsr的值,然后把各种模式的堆栈值存入sp。运行到最后那么就只为SVCStack赋值了。现在看来这真是天大的笑话。根据下图可知:不同模式有自己单独的sp(即R13寄存器)常作为栈指针。上面代码就是先设置模式,然后再在此模式下,初始化R13寄存器。
每一种异常模式都有自己担任R12,应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中,当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出,这样就使异常处理程序不会破坏被其中断程序的运行现场。