新聞中心

        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的地址是怎樣計算出來的?

        本文引用地址:http://www.104case.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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 九江县| 保定市| 会东县| 闵行区| 湄潭县| 汨罗市| 柘城县| 建瓯市| 板桥市| 铜梁县| 金华市| 收藏| 牟定县| 连云港市| 新巴尔虎右旗| 定安县| 鲁甸县| 大名县| 原阳县| 泾源县| 长泰县| 兴安盟| 锡林浩特市| 柳州市| 乌兰浩特市| 双辽市| 文安县| 潮州市| 通州市| 斗六市| 莱阳市| 锦州市| 陇川县| 南陵县| 旬邑县| 侯马市| 南召县| 宜城市| 营山县| 军事| 广昌县|