日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

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

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

          作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏

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

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


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



          評論


          技術(shù)專區(qū)

          關(guān)閉