主题 : 关于初始化代码中栈部分的疑问 复制链接 | 浏览器收藏 | 打印
级别: 侠客
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重新编辑 ]
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2010-08-13 11:26
不错,谢谢分享
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 侠客
UID: 35785
精华: 0
发帖: 63
金钱: 325 两
威望: 65 点
贡献值: 0 点
综合积分: 126 分
注册时间: 2011-01-06
最后登录: 2014-07-22
3楼  发表于: 2011-02-27 13:30
那些堆栈空间  例如程序开始定义了一些 int char 或者结构体的一些变量   如果他是中断处理函数里的 那么这些变量就放在 IRQStack=0x33FF_7000 往下的空间
开发板交易群: 68936520  本群提供给大家一个开发板交易买卖的平台,请大家诚信交易 ..
级别: 新手上路
UID: 57133
精华: 0
发帖: 26
金钱: 140 两
威望: 28 点
贡献值: 0 点
综合积分: 52 分
注册时间: 2011-10-19
最后登录: 2013-04-13
4楼  发表于: 2011-10-20 20:42
这些堆栈在刚开始是不会用到的,只有你的系统发生异常了,进入异常模式后会保存一些数值在相应的堆栈。
二手旧开发板供求信息交易群: 68936520
级别: 新手上路
UID: 57962
精华: 0
发帖: 18
金钱: 90 两
威望: 18 点
贡献值: 0 点
综合积分: 36 分
注册时间: 2011-11-01
最后登录: 2012-02-16
5楼  发表于: 2011-11-01 14:08

 回 1楼(imjacob) 的帖子

YES!
级别: 新手上路
UID: 117894
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
贡献值: 0 点
综合积分: 10 分
注册时间: 2015-08-02
最后登录: 2015-08-22
6楼  发表于: 2015-08-02 20:55
默认情况下是MDK库函数实现的