新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM處理器的SWI異常中斷響應過程

        ARM處理器的SWI異常中斷響應過程

        作者: 時間:2016-11-09 來源:網絡 收藏
        通過SWI異常中斷指令,在用戶模式下應用程序可以調用系統模式下的代碼,在操作系統中表現為系統調用,
        那這個過程又是如何實現的呢?帶著疑問讓我們來學習吧!

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

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

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

        2.功能服務程序
        編寫利用從中斷處理函數獲得的中斷調用號我們可以寫出如下服務函數(為了簡單我們用C語言)
        void swi_service_func(unsigned int number, unsigned int *reg)
        {
        unsigned int reg1, reg2, reg3, reg4;
        //獲取SWI前傳入的參數
        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
        }
        }
        // 更新結果存入r0-r3
        reg[0] = updata_reg1;
        reg[1] = updata_reg2;
        reg[2] = updata_reg3;
        reg[3] = updata_reg4;
        }

        這樣一來只要中調用斷號不同就可以實現不同的功能調用了,是不是很簡單?


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 乾安县| 鄂尔多斯市| 凤山市| 横峰县| 五莲县| 太原市| 交口县| 彰化市| 望奎县| 渝中区| 大埔区| 衢州市| 会昌县| 武陟县| 兖州市| 九龙坡区| 岳普湖县| 琼中| 石泉县| 历史| 威宁| 祁连县| 嘉禾县| 东安县| 出国| 广水市| 泗阳县| 正宁县| 贵溪市| 安新县| 甘谷县| 常熟市| 西吉县| 沅江市| 天峻县| 吉林市| 汝城县| 尉犁县| 林西县| 大田县| 洪雅县|