主题 : 关于初始化代码中栈部分的疑问 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 21258
精华: 1
发帖: 120
金钱: 655 两
威望: 131 点
贡献值: 1 点
综合积分: 260 分
注册时间: 2010-05-13
最后登录: 2023-11-17
楼主  发表于: 2010-08-13 09:40

 关于初始化代码中栈部分的疑问

管理提醒: 本帖被 kasim 执行加亮操作(2010-08-13)
看到初始化的代码中会调用栈,代码如下
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

    orr    r1,r0,#IRQMODE|NOINT
    msr    cpsr_cxsf,r1        ;IRQMode
    ldr    sp,=IRQStack        ; IRQStack=0x33FF_7000

    orr    r1,r0,#FIQMODE|NOINT
    msr    cpsr_cxsf,r1        ;FIQMode
    ldr    sp,=FIQStack        ; FIQStack=0x33FF_8000

    bic    r0,r0,#MODEMASK|NOINT
    orr    r1,r0,#SVCMODE
    msr    cpsr_cxsf,r1        ;SVCMode
    ldr    sp,=SVCStack        ; SVCStack=0x33FF_5800


cpu切换到各种模式下,然后分别在当前模式下保留一段空间当做栈。
但我找了一下,之后代码里没看到去用他们啊。具体例子,SVCstack这些空间我去帮他留了,但系统怎么用的呢,何时用的呢?难道是自动的?
IRQ栈,也是,当我发生中断的时候,它就自动用了这些栈空间了吗?
级别: 侠客
UID: 21258
精华: 1
发帖: 120
金钱: 655 两
威望: 131 点
贡献值: 1 点
综合积分: 260 分
注册时间: 2010-05-13
最后登录: 2023-11-17
1楼  发表于: 2010-08-13 10:59
找到了,
复制代码
  1. MACRO
  2. $HandlerLabel HANDLER $HandleLabel
  3. $HandlerLabel
  4.     sub    sp,sp,#4    ;decrement sp(to store jump address)
  5.     stmfd    sp!,{r0}    ;PUSH the work register to stack(lr does't push because it return to original address)
  6.     ldr     r0,=$HandleLabel;load the address of HandleXXX to r0
  7.     ldr     r0,[r0]     ;load the contents(service routine start address) of HandleXXX
  8.     str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
  9.     ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
  10.     MEND


这个应该就是用到哪些栈的地方。
[ 此帖被kasim在2010-08-13 11:26重新编辑 ]