<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

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


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



          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();