• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > uCOS-II的移植步驟

    uCOS-II的移植步驟

    作者: 時間:2016-11-27 來源:網絡 收藏
    說明:將V2.92移植到STM32F107ZET6和STM32F107VCT6.

    關于uCOS的移植,其實要說難也難,要說簡單也簡單。簡單的是現在官方都已經移植好了,難的是自己寫那個匯編的移植代碼。廢話不多說,直接上移植步驟和注意事項。

    本文引用地址:http://www.czjhyjcfj.com/article/201611/322487.htm

    第一步:到官網下載最新版本的uCOS-II V2.92,在uCOS-II的文件夾下有三個這樣的文件主要有這兩個移植的文件,在DOC文件夾下主要是移植的說明和性能的測試結果,

    其中uCOS-II-RefMan和uCOS-II-CfgMan比較有參考價值,第一個文件對每個函數進行了說明,重要的是給出了大部分函數的應用實例。第二個就是我們移植好后的配置文件了。還有一個重要的文件就是很重要的文件就是AN-1018,這個是官方的移植說明(針對的Cortex-M3處理器)。

    第二步:Source文件夾下面都是源代碼,不用管他們,Ports文件夾下面就是我們移植的時候需要弄的文件了,有以下幾個文件,

    os_cpu.h,os_cpu_c.c,os_cpu_a.asm這三個文件在移植過程中最重要。

    os_cpu.h:定義數據類型,處理器相關代碼和聲明函數原型。

    #ifndef OS_CPU_H
    #define OS_CPU_H

    #ifdef OS_CPU_GLOBALS
    #define OS_CPU_EXT
    #else
    #define OS_CPU_EXT extern
    #endif

    #ifndef OS_CPU_EXCEPT_STK_SIZE
    #define OS_CPU_EXCEPT_STK_SIZE 128u//默認的異常堆棧大小
    #endif

    typedef unsigned char BOOLEAN;//數據類型的說明
    typedef unsigned char INT8U;

    typedef signed char INT8S;

    typedef unsigned short INT16U;

    typedef signed short INT16S;

    typedef unsigned int INT32U;

    typedef signed int INT32S;

    typedef float FP32;

    typedef double FP64;

    typedef unsigned int OS_STK;

    typedef unsigned int OS_CPU_SR;

    臨界代碼

    和其它內核一樣,μC/OS-Ⅱ為了處理臨界段代碼需要關中斷,處理完畢后再開中斷。這使得μC/OS-Ⅱ能夠避免同時有其它任務或中斷服務進入臨界段代碼。關中斷的時間是實時內核開發商應提供的最重要的指標之一,因為這個指標影響用戶系統對實時事件的響應性。μC/OS-Ⅱ努力使關中斷時間降至最短,但就使用μC/OS-Ⅱ而言,關中斷的時間很大程度上取決于微處理器的架構以及編譯器所生成的代碼質量。

    μC/OS-Ⅱ中的這兩個宏調用分別是:OS_ENTER_CRITICAL()和 OS_EXIT_CRI TICAL()。因為這兩個宏的定義取決于所用的微處理器,故在文件 OS_CPU.H 中可以找到相應宏定義。每種微處理器都有自己的os_cpu.h,

    #define OS_CRITICAL_METHOD 3u//臨界代碼的處理方法,有3種,一般都選三

    #if OS_CRITICAL_METHOD == 3u
    #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}//進入臨界代碼
    #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}//推出臨界代碼
    #endif

    開關中斷的具體實現,在os_cpu_a.asm文件中,下面會講到。

    #define OS_STK_GROWTH 1u//中斷的生長方向,從高地址到低地址

    #define OS_TASK_SW() OSCtxSw() //用戶級的任務切換。

    //申明外部函數定義的申一個額外的異常堆??臻g,

    OS_CPU_EXT OS_STK OS_CPU_ExceptStk[OS_CPU_EXCEPT_STK_SIZE];
    OS_CPU_EXT OS_STK *OS_CPU_ExceptStkBase;

    void OSCtxSw(void);//用戶任務的任務切換
    void OSIntCtxSw(void);//中斷任務的任務切換
    void OSStartHighRdy(void);//在操作系統第一次啟動的時候調用的任務切換

    void OS_CPU_PendSVHandler(void);//用戶任務和中斷任務的在可懸起系統調用中斷里面實現任務的切換。
    void OS_CPU_SysTickHandler(void);//這個函數是時鐘節拍中斷函數。
    void OS_CPU_SysTickInit(INT32U cnts);//這個是滴答定時器的初始化,

    第三步:OS_CPU_C.C

    這個文件里面有9個鉤子函數和一個堆棧初始化函數。

    鉤子函數:鉤子函數說白就是為了擴展函數的功能。別的沒什么,用得到就往里面加入自己設計的代碼,不需要就不用設置。

    堆棧的初始化函數需要根據不同的處理器進行設置。關于堆棧函數的處理首先要明白幾點,

    • xPSR, PC, LR, R12, R0-R3 這幾個寄存器在中斷的時候實現自動的保存
    • 剩下的幾個寄存器需要手動保存。
    • uCOS-II初始化的時,是如何在任務切換的時候,實現將變量存入到自己的任務堆棧里面
    • 關鍵就在每個任務初始化堆棧的時候,將堆棧指針R13指向相應的任務地址,這樣初始化以后進行任務切換的時候,就能將變量存入好自己的任務堆棧。

    *(stk) = (INT32U)0x01000000uL;
    *(--stk) = (INT32U)task;
    *(--stk) = (INT32U)OS_TaskReturn;
    *(--stk) = (INT32U)0x12121212uL;
    *(--stk) = (INT32U)0x03030303uL;
    *(--stk) = (INT32U)0x02020202uL;
    *(--stk) = (INT32U)0x01010101uL;
    *(--stk) = (INT32U)p_arg;

    *(--stk) = (INT32U)0x11111111uL;
    *(--stk) = (INT32U)0x10101010uL;
    *(--stk) = (INT32U)0x09090909uL;
    *(--stk) = (INT32U)0x08080808uL;
    *(--stk) = (INT32U)0x07070707uL;
    *(--stk) = (INT32U)0x06060606uL;
    *(--stk) = (INT32U)0x05050505uL;
    *(--stk) = (INT32U)0x04040404uL;

    return (stk); //返回任務的棧頂

    第四步:是移植中最重要的部分,也就是匯編底層函數的編寫。

    主要有一下這幾個函數

    (一)開中斷和關中斷函數的實現。

    OS_CPU_SR_Save ;用于實現關中斷的匯編指令
    MRS R0, PRIMASK ;讀取PRIMASK到R0,R0是返回值
    CPSID I ;PRIMASK=1,關中斷(NMI和硬fault可以響應)
    BX LR

    OS_CPU_SR_Restore ;用于實現開中斷的匯編指令
    MSR PRIMASK, R0 ;讀取R0到PRIMASK中,R0為參數
    BX LR


    上一頁 1 2 下一頁

    關鍵詞: uCOS-II移植步

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 屏南县| 乳源| 贺州市| 哈巴河县| 怀远县| 华宁县| 石台县| 金坛市| 达州市| 抚远县| 会东县| 台中县| 外汇| 城固县| 三河市| 同德县| 城口县| 洛阳市| 嘉荫县| 杂多县| 遂昌县| 万源市| 温州市| 阳朔县| 磴口县| 高邮市| 临湘市| 托克逊县| 长丰县| 枣阳市| 临沭县| 广州市| 平果县| 翼城县| 辽中县| 临夏市| 凤台县| 福贡县| 突泉县| 青浦区| 陆川县|