關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > CortexM3內核的μC/OSII安全性與穩定性的研究

        CortexM3內核的μC/OSII安全性與穩定性的研究

        作者: 時間:2010-12-21 來源:網絡 收藏


        4.1 系統寄存器的設置

        用戶應用程序運行在用戶級,使用PSP堆棧指針;操作系統函數運行在特權級,使用的也是PSP堆棧指針;而中斷服務例程運行在處理模式的特權方式下,使用MSP堆棧指針。

        特權與用戶級分區
        特權與用戶級分區
        圖2 特權與用戶級分區

        首先利用MPU把內存分為特權級訪問和用戶級訪問兩個區,如圖2所示。在系統初始化時,設置MPU相關寄存器,為系統分配任務堆棧與主堆棧:任務堆棧分配在用戶區,系統變量與主堆棧分配在特權區,只可特權級下訪問。

        4.2 系統函數的修改

        用戶任務工作在用戶級下,操作系統函數工作在特權級下,任務可能會在執行系統函數時執行上下文切換,因此系統要記錄任務切換時是處在特權級還是用戶級下,以便任務再次獲得處理器控制權時,切換到原先的訪問等級下。在任務創建時,加入訪問權限參數mode。

        權限的值定義為:

        #define OS_Mode_USER 1u //用戶級

        #define OS_Mode_PRIVILEGE 0u //特權級

        在創建任務函數與堆棧初始函數的參數中加入訪問權限參數,形式如下:

        INT8U OSTaskCreateExt (……,INT8U mode );

        OS_STK *OSTaskStkInit (……,INT8U mode);

        在堆棧初始化時,把mode最后存到堆棧當中,以便任務第一次運行時進入相應的工作模式(特權級或用戶級)。統計任務和空閑任務的mode是OS_Mode_PRIVILEGE,而用戶任務為OS_Mode_USER。

        4.3 OS_CPU_A.ASM文件中函數的修改

        在OS_CPU_A.ASM文件中,只需修改函數PendSV_Handler(PendSV服務例程),任務切換是由它來完成的。同時,設置PendSV的優先級為最低,以便快速響應中斷,提高系統的實時性。PendSV服務例程的流程如圖3所示。

        PendSV服務例程流程
        PendSV服務例程流程
        圖3 PendSV服務例程流程

        任務切換上文的程序:

        SUBS R0,R0,#0x24;調整PSP指針,mode、R4~R11共36字節

        MRS R1,CONTROL;獲取當前任務的訪問等級mode

        STM R0,{R1,R4R11};壓棧mode,R4~R11

        LDR R1,=OSTCBCur;獲取OSTCBCur博OSTCBStkPtr

        LDR R1,[R1]

        STR R0,[R1];存儲PSP值到任務控制塊切換下文的程序:

        ……;OSPrioCur=OSPrioHighRdy;

        ……;OSTCBCur=OSTCBHighRdy;

        ……;得到新任務的PSP值,存儲到R0中

        LDM R0,{R1,R4R11};R1(mode),R4~R11出棧

        MSR CONTROL,R1;修改CONTROL[0]

        ORR LR,LR,#0x04;選擇返回時使用的堆棧

        ADDS R0,R0,#0x24;調整PSP值

        MSR PSP,R0;R0存入PSP中


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 瑞丽市| 永德县| 七台河市| 通州区| 稻城县| 梧州市| 德惠市| 桦川县| 延寿县| 深圳市| 双江| 深泽县| 密云县| 彭阳县| 阿克陶县| 公主岭市| 新兴县| 利川市| 定远县| 肇东市| 会宁县| 吴旗县| 邵东县| 方正县| 高尔夫| 乌鲁木齐县| 咸丰县| 旬阳县| 商河县| 天峨县| 秀山| 鞍山市| 南丰县| 稷山县| 垦利县| 桑植县| 荣昌县| 綦江县| 桐梓县| 双桥区| 焉耆|