新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 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
;功能:堆棧初始化,即初始化各模式下的堆棧指針。
;入口參數(shù):無
;出口參數(shù):無
;說明:在特權模式下調用此子程序,比如復位后的管理模式
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
;設置系統(tǒng)模式堆棧
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


;分配堆??臻g
AREAMyStacks,DATA,NOINIT,ALIGN=2
UsrStackSpaceSPACEUSR_STACK_LEGTH*4;用戶(系統(tǒng))模式堆棧空間
SvcStackSpaceSPACESVC_STACK_LEGTH*4;管理模式堆??臻g
IrqStackSpaceSPACEIRQ_STACK_LEGTH*4;中斷模式堆??臻g
FiqStackSpaceSPACEFIQ_STACK_LEGTH*4;快速中斷模式堆??臻g
AbtStackSpaceSPACEABT_STACK_LEGTH*4;中止義模式堆??臻g
UndtStackSpaceSPACEUND_STACK_LEGTH*4;未定義模式堆棧



經過ADS1.2仿真;發(fā)現(xiàn)地址變化如下
svc0x400030fc
irq0x400031fc
fiq0x4000323c
abort0x4000323c
undef0x4000323c
sys0x400030fc

svcfirirqabortundefsys的地址是怎樣計算出來的?

本文引用地址:http://m.butianyuan.cn/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



評論


技術專區(qū)

關閉