• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 關 閉

    新聞中心

    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中


    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 大邑县| 三门县| 固阳县| 高尔夫| 额尔古纳市| 泰州市| 哈尔滨市| 日土县| 轮台县| 万全县| 武清区| 行唐县| 乌审旗| 来凤县| 东乡族自治县| 西贡区| 潢川县| 五台县| 湖南省| 山东| 临清市| 晋城| 镇江市| 开远市| 巴塘县| 新和县| 屏东县| 霍州市| 安宁市| 扬中市| 贺兰县| 宁远县| 绍兴县| 徐汇区| 凤台县| 托克逊县| 依安县| 普安县| 曲靖市| 西乌珠穆沁旗| 开阳县|