新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM處理器模式切換(含MRS,MSR指令)

        ARM處理器模式切換(含MRS,MSR指令)

        作者: 時間:2016-11-20 來源:網絡 收藏

        1.1.1ARM處理器模式切換(含MRSMSR指令

        除了用戶模式和系統模式,其余模式下都有一個私有SPSR保存狀態寄存器,用來保存切換到該模式之前的執行狀態,之所以用戶模式和系統模式沒有SPSR是因為,通常CPU大部分時間執行在用戶模式下,當產生異?;蛳到y調用時會分別切換進入另外幾種模式,保存用戶模式下的狀態,當切換回原先模式時,直接回復SPSR的值到CPSR就可以了,因此,用戶模式和系統模式下不需要SPSR,其詳細操作查看下節異常處理。
        以上幾種模式通過CPSR里的M[4:0]位進行區分,如圖3-1所示:


        圖3-1 CPSR控制位
        通過向模式位M[4:0]里寫入相應的數據切換到不同的模式,在對CPSR,SPSR寄存器進行操作不能使用mov,ldr等通用指令,只能使用特權指令msr和mrs。
        在ARM處理器中,只有MRS(Move to Register from State register)指令可以對狀態寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以獲得當前處理器的工作狀態。讀SPSR寄存器可以獲得進入異常前的處理器狀態(因為只有異常模式下有SPSR寄存器)。
        例如:
        MRSR1,CPSR;將CPSR狀態寄存器讀取,保存到R1中
        MRSR2,SPSR;將SPSR狀態寄存器讀取,保存到R2中
        通過MRS指令可以取得狀態寄存器里的值,然后比較其模式位M[4:0]的值判斷當前所處模式,當然也可以比較其它相應位了解當前CPU的狀態。
        同樣,在ARM處理器中,只有MSR指令可以對狀態寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。
        由于xPSR寄存器代表了CPU的狀態,其每個位有特殊意義,在執行對xPSR狀態寄存器寫入時(讀取時不存在該用法),為了防止誤操作和方便記憶,將xPSR里32位分成四個區域,每個區域用小寫字母表示:
        c控制域屏蔽psr[7..0]
        x擴展域屏蔽psr[15..8]
        s狀態域屏蔽psr[23..16]
        f標志域屏蔽psr[31..24]
        注意:區域名必須為小寫字母
        向對應區域進行執行寫入時,使用xPSR_x可以指定寫入區域,而不影響狀態寄存器其它位,如:
        使能IRQ中斷:
        ENABLE_IRQ
        MRSR0,CPSR;將CPSR寄存器內容讀出到R0
        BICR0,R0,#0x80;清掉CPSR中的I控制位
        MSRCPSR_c,R0;將修改后的值寫回CPSR寄存器的對應控制域
        MOVPC,LR;返回上一層函數
        禁用IRQ中斷:
        DISABLE_IRQ
        MRSR0 CPSR;將CPSR寄存器內容讀出到R0
        ORRR0,R0,#0x80;設置CPSR中的I控制位
        MSRCPSR_c,R0;將修改后的值寫回CPSR寄存器的對應控制域
        MOVPC,LR;返回上一層函數
        下表列出了不同模式的二進制數表示:
        表3-3不同工作模式對應二進制
        模式名用戶快中斷中斷管理中止未定義系統
        M[4:0]10000100011001010011101111101111111
        在對開發板進行初始化時,用對不同模式指定其??臻g,下面例子對各模式的棧指針sp進行初始化:
        stack_init;棧指針初始化函數
        @ undefine_stack
        msr cpsr_c,#0xdb;切換到未定義異常
        ldrsp,=0x34000000;棧指針為內存最高地址,棧為倒生的棧
        ;??臻g的最后1M0x34000000~0x33f00000
        @ abort_stack
        msr cpsr_c,#0xd7;切換到終止異常模式
        ldrsp,=0x33f00000;??臻g為1M,0x33f00000~0x33e00000
        @ irq_stack
        msrcpsr_c,#0xd2;切換到中斷模式
        ldrsp,=0x33e00000;棧空間為1M,0x33e00000~0x33d00000
        @ sys_stack
        msrcpsr_c,#0xdf;切換到系統模式
        ldrsp,=0x33d00000;??臻g為1M,0x33d00000~0x33c00000
        msrcpsr_c,#0xd3;切換回管理模式
        mov pc,lr



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 喀喇沁旗| 孟州市| 扎鲁特旗| 岳西县| 巩义市| 沧源| 巴彦淖尔市| 搜索| 巴林右旗| 安乡县| 获嘉县| 合山市| 九龙县| 中西区| 彭水| 白河县| 惠水县| 海南省| 新邵县| 宣城市| 富阳市| 岫岩| 巴南区| 绍兴市| 喜德县| 奉新县| 吉木乃县| 广东省| 琼中| 浦江县| 周口市| 安多县| 依兰县| 师宗县| 定州市| 都昌县| 舞钢市| 崇仁县| 新安县| 金华市| 定南县|