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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM處理器的SWI異常中斷響應(yīng)過程

          ARM處理器的SWI異常中斷響應(yīng)過程

          作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          通過SWI異常中斷指令,在用戶模式下應(yīng)用程序可以調(diào)用系統(tǒng)模式下的代碼,在操作系統(tǒng)中表現(xiàn)為系統(tǒng)調(diào)用,
          那這個(gè)過程又是如何實(shí)現(xiàn)的呢?帶著疑問讓我們來學(xué)習(xí)吧!

          在SWI指令中包括一個(gè)24位的立即數(shù)(中斷調(diào)用號(hào)),該立即數(shù)指示了用戶要請求的特定的調(diào)用功能,所以在SWI的異常中斷中要讀取這個(gè)中斷調(diào)用號(hào),然后根據(jù)中斷號(hào),來調(diào)用相應(yīng)的處理程序。這個(gè)過程可以分兩個(gè)步驟:

          1.SWI異常中斷處理程序
          由于是在底層操作所以這個(gè)異常中斷處理程序得用匯編語言編寫,描述如下:

          area top_swi code readonly
          export swi_headler
          swi_headler
          stmfd sp!, {r0-r12, lr} ; 保存r0至r12,lr的寄存器值
          ldr r0, [lr, #-4]; 從存儲(chǔ)器中取得SWI指令的所在地址
          bic r0, r0, #FF000000; 讀取24位中斷調(diào)用號(hào)
          mov r1, sp
          ;================================================
          bl swi_service_func; 調(diào)用功能服務(wù)函數(shù),見下面
          ; 中斷調(diào)用號(hào)通過r0寄存器傳入
          ; 參數(shù)通過r1寄存器傳入
          ;================================================
          ldmfd sp!, {r0-r12, pc}^ ;恢復(fù)調(diào)用前的r0至r12,離開中斷處理程序
          end

          2.功能服務(wù)程序
          編寫利用從中斷處理函數(shù)獲得的中斷調(diào)用號(hào)我們可以寫出如下服務(wù)函數(shù)(為了簡單我們用C語言)
          void swi_service_func(unsigned int number, unsigned int *reg)
          {
          unsigned int reg1, reg2, reg3, reg4;
          //獲取SWI前傳入的參數(shù)
          reg1 = reg[0];
          reg2 = reg[1];
          reg3 = reg[2];
          reg4 = reg[3];
          switch (number) {
          case 0:
          // do something
          break;

          case 1:
          // do something
          break;
          .
          .
          .
          case n:
          // do something
          break;

          default:
          // do something
          }
          }
          // 更新結(jié)果存入r0-r3
          reg[0] = updata_reg1;
          reg[1] = updata_reg2;
          reg[2] = updata_reg3;
          reg[3] = updata_reg4;
          }

          這樣一來只要中調(diào)用斷號(hào)不同就可以實(shí)現(xiàn)不同的功能調(diào)用了,是不是很簡單?


          評(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); })();