新闻中心

EEPW首页>嵌入式系统>设计应用> ARM编程:ARM初始化,堆栈地址是怎样计算的

ARM编程:ARM初始化,堆栈地址是怎样计算的

作者: 时间:2016-11-28 来源:网络 收藏

USR_STACK_LEGTHEQU64
SVC_STACK_LEGTHEQU0
FIQ_STACK_LEGTHEQU16
IRQ_STACK_LEGTHEQU64
ABT_STACK_LEGTHEQU0
UND_STACK_LEGTHEQU0
;名称:InitStack
;功能:堆栈初始化,即初始化各模式下的堆栈指针
;入口参数:无
;出口参数:无
;说明:在特权模式下调用此子程序,比如复位后的管理模式
InitStack
MOVR0,LR;R0<=LR,因为各种模式下R0是相同


;设置管理模式堆栈
MSRCPSR_c,#0xd3
LDRSP,StackSvc
;设置中断模式堆栈
MSRCPSR_c,#0xd2
LDRSP,StackIrq
;设置快速中断模式堆栈
MSRCPSR_c,#0xd1
LDRSP,StackFiq
;设置中止模式堆栈
MSRCPSR_c,#0xd7
LDRSP,StackAbt
;设置未定义模式堆栈
MSRCPSR_c,#0xdb
LDRSP,StackUnd
;设置系统模式堆栈
MSRCPSR_c,#0xdf
LDRSP,StackUsr

MOVPC,R0

StackUsrDCDUsrStackSpace+(USR_STACK_LEGTH-1)*4
StackSvcDCDSvcStackSpace+(SVC_STACK_LEGTH-1)*4
StackIrqDCDIrqStackSpace+(IRQ_STACK_LEGTH-1)*4
StackFiqDCDFiqStackSpace+(FIQ_STACK_LEGTH-1)*4
StackAbtDCDAbtStackSpace+(ABT_STACK_LEGTH-1)*4
StackUndDCDUndtStackSpace+(UND_STACK_LEGTH-1)*4


;分配堆栈空间
AREAMyStacks,DATA,NOINIT,ALIGN=2
UsrStackSpaceSPACEUSR_STACK_LEGTH*4;用户(系统)模式堆栈空间
SvcStackSpaceSPACESVC_STACK_LEGTH*4;管理模式堆栈空间
IrqStackSpaceSPACEIRQ_STACK_LEGTH*4;中断模式堆栈空间
FiqStackSpaceSPACEFIQ_STACK_LEGTH*4;快速中断模式堆栈空间
AbtStackSpaceSPACEABT_STACK_LEGTH*4;中止义模式堆栈空间
UndtStackSpaceSPACEUND_STACK_LEGTH*4;未定义模式堆栈



经过ADS1.2仿真;发现地址变化如下
svc0x400030fc
irq0x400031fc
fiq0x4000323c
abort0x4000323c
undef0x4000323c
sys0x400030fc

svcfirirqabortundefsys的地址是怎样计算出来的?

本文引用地址://m.amcfsurvey.com/article/201611/322956.htm
  • 关键是MyStacks的起始地址.看看ADS的配置里linker选项里的配置. [xiaogang]2007-4-1611:57:05

    如果没有配置.则看AREAMyStacks,DATA,NOINIT,ALIGN=2后面是否有个
    ^XXXXX..来定义MyStacks的起始地址
    得到起始地址后,再由SPACE按顺序分配内存空间

  • 对,RWBase设置的是0x40003000 [jinjing999666]2007-4-1620:40:08

    我又把RWBase设置的是0x40005000
    观察都变成了
    svc0x400050fc
    irq0x400051fc
    fiq0x4000523c
    undef0x4000523c
    sys0x400050fc



评论


技术专区

关闭