arm7下swi中斷類比程式步步學

來源:互聯網
上載者:User

介紹個中斷使用swi模式
特權模式superisor svc供OS使用的一個保護模式
其實也是一個中斷,對於硬體使用者不可幹擾確切的來說是使用者定義中斷模式
1.瞭解正常狀態USER狀態的可用寄存器
R0~R7通用 R8~R12獨立寄存器[有些模式寄存器組是獨立] R13-SP[各自獨立] R14-LR[獨立] PC[通用] CPSR[獨立]
r0~r7通用寄存器同PC下的通用寄存器一樣
R8~R12 作為備份寄存器 ,可以使用r0~r7均可使用他們
r13作為堆棧指標
r14作為串連寄存器存放當前子程式返回的地址
PC ARM是三級流水線所以PC總是為當前執行指令+8處 ARM下指令是字對齊所以低兩位為0
CPSR 就是目前狀態寄存器儲存當前執行的各種情況

2.瞭解一下特權模式在PC處理時發生的事情
正常執行指令PC+4(均指ARM狀態下)發生函數調用時STMFD SP!, {REGISTER, LR} STMFD SP!, { REGISTER, PC }
來進行寄存器入棧和LR串連寄存器函數返回地址入棧
完成後進行寄存器出棧和將LR的值即返回地址賦給PC返回
遇到中斷指SWI(FIQ, IRQ)有所不同時
(a)儲存CPU目前狀態 將CPSR->特權模式下的SPSR
(B)設定當前模式下CPRS的相應的位 比如進FIQ模式禁止FIQ中斷...
(c)特權模式下獨立串連寄存器 LR儲存中斷返回地址
(d)PC設定為當前中斷向量地址跳轉執行中斷代碼

3. 中斷返回時的工作
(a)恢複當前處理器狀態SPSR->正常模式的CPSR
(b)恢複PC,LR->當前PC

4.SWI中斷是本身執行指令產生 所以當產生中斷時PC值不會更新為當前指令+8地址處
所以PC-4為恢複中斷地址。這裡是要注意的

5._swi 修飾用於SWI中斷調用
  中斷不返回形式 void _swi(swi_num) swi_name(arguments);
  返回一個結果R0中 int _swi(swi_num) swi_name(arguments);
  可以用結構最多返回四個結果r0-r3
  struct type{ int a, b, c, d; };
  type(傳回型別) _value_in_regs(返回多個結果的修飾符) _swi(swi_num) swi_name(arguments);
 
然後開始EXAMPLE
建立swi.h檔案存放結構和swi函式宣告
__swi(0) int test1(int,int);  //兩個參數返回r0,地址位移為0
struct mystruct     //定義返回結構體
{
 int a;
 int b;
 int c;
 int d;
};

__swi(1) __value_in_regs struct mystruct
test2(int,int,int,int);   //聲明1自訂中斷

建立中斷一及處理檔案handle.s
 IMPORT c_handle_swi  //引入二及中斷 處理
 EXPORT SWI_Handle   //到出中斷處理函數
 AREA SWIHandle,CODE,READONLY
 
SWI_Handle 

  STMFD SP!, {r0-r3, r12, lr}
  ;儲存SPSR_svc
  mov r1, sp
  MRS r0, spsr //儲存spsr
  STMFD sp!, {r0} //入棧
  
  LDR r0, [lr, #-4] 
  BIC r0, r0, #0xFF000000//得到24立即數放到R0中
  
  BL c_handle_swi  //二及調用
  LDMFD   SP!, {r0}
  MSR spsr_cf, r0
  LDMFD SP!, {r0-r3, r12, pc}^
  
 
 END
建立lib.c檔案提供中斷函數處理代碼
void c_handle_swi( int swi_num, int *regs )
{
 switch(swi_num)
 {
  case 0:    //_swi(0)
   regs[0] = regs[0]*regs[1];
   break;
  case 1:    //_swi(1)
  {
   int x, y, z, p;
   x = regs[0];
   y = regs[1];
   z = regs[2];
   p = regs[3];
   
   
   regs[0] = x + y + z + p;
   regs[1] = x + y - z - p;
   regs[2] = x*y + z*p;
   regs[3] = (x + y)*(z + p);
        
  } 
  
  default:
  break;
 
 
 }
提供主處理函數

#include <stdio.h>
#include "swi.h"

unsigned *swi_vec = (unsigned*) 0x08;
extern void SWI_Handle(void);

unsigned Install_Handler( unsigned routine, unsigned *vector)
{
 unsigned vec, old_vec;
 vec = ( routine - (unsigned)vector - 8)>>2;
 if(vec&0xFF000000)
  printf("Handler greater than 32MByte from vector!");
 
 vec = 0xea000000 | vec;
 old_vec = *vector;
 *vector = vec;
 return old_vec;
 
}

int main()
{
 int result1;
    struct mytype res_3;

    Install_Handler( (unsigned) SWI_Handle, swi_vec ); //載入資訊
 result1 = test1( 2, 4 );  //中斷一
    res_3 = test2( 12, 4, 3, 1 );   //中斷二 通過watch觀察結果
 
    return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.