日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

uC/OS-II嵌入式操作系統(tǒng)移植 - uC/OS移植 | 嵌入式在線部落

 Delores 2008-01-17
2007-9-2 13:28:33   
uC/OS-II嵌入式操作系統(tǒng)移植
操作系統(tǒng)的移植指的是使實時系統(tǒng)的內(nèi)核能在微處理器上運行。uC/OS-II應(yīng)移植到所使用的CPU上,然后才能得到應(yīng)用。在uC/OS-II的移植中,處理器必須滿足一下一些要求:
l         處理器的C編譯器能產(chǎn)生可重入型代碼
l         處理器支持中斷,并且能產(chǎn)生定時中斷
l         用C語言就可以開/關(guān)中斷
l         處理器能支持一定數(shù)量的數(shù)據(jù)存儲硬件堆棧
l         處理器有將堆棧指針以及其他CPU寄存器的內(nèi)容讀出,并存儲到堆?;騼?nèi)存中去的指令
實際上,uC/OS-II可以簡單地看作是一個多任務(wù)調(diào)度器,在這個任務(wù)調(diào)度器上添加了與多任務(wù)操作系統(tǒng)相關(guān)的一些系統(tǒng)服務(wù),如信號量、郵箱等。其90%的代碼是用C語言寫的,可以直接移植到有C語言編譯器的處理器上。移植主要都集中在多任務(wù)切換的實現(xiàn)上,因為這部分代碼用來保存和恢復(fù)CPU現(xiàn)場(即寫/讀相關(guān)寄存器),不能用C語言,只能使用匯編語言完成,即編寫OS_CPU_A.S文件。另外還需要修改與ARM體系結(jié)構(gòu)相關(guān)的OS_CPU.H文件和用戶規(guī)定任務(wù)棧初始化結(jié)構(gòu)的OS_CPU_C.C文件。uC/OS-II的移植工作相對來說還是很容易的,具體的移植過程如下:
INCLUDES.H是一個主頭文件,本身與移植過程無關(guān),不過因為每一個uC/OS-II的C文件都要用到它,故在此簡介一下。INCLUDES.H包含程序中主要的三個頭文件,分別是:OS_CPU.H,OS_CFG.H,UCOS_II.H。它使得工程項目中的每個C文件無需考慮它實際上需要哪些頭文件,增強了可讀性。另外也可以重新編輯此文件添加用戶自己定義的頭文件。
這個頭文件包括了用#define語句定義的與處理器相關(guān)的常數(shù)/宏以及類型等,其中包括臨界段代碼宏定義:OS_ENTER_CRITICAL( )和OS_EXIT_CRITICAL( ),并可以提供三種辦法開關(guān)中斷。具體代碼如下:
 
#include "arm.h"
 
#ifdef OS_CPU_GLOBALS
#define OS_CPU_EXT
#else
#define OS_CPU_EXT extern
#endif
 
typedef unsigned char BOOLEAN;    /**/
typedef unsigned char INT8U;
typedef signed char   INT8S;
typedef unsigned short  INT16U;
typedef signed     short INT16S;
typedef unsigned long  INT32U;
typedef signed long    INT32S;
typedef float          FP32;
typedef double        FP64;
typedef unsigned int   OS_STK;
typedef unsigned int   OS_CPU_SR;
 
#define BYTE           INT8S
#define UBYTE          INT8U
#define WORD          INT16S
#define UWORD         INT16U
#define LONG          INT32S
#define ULONG         INT32U
 
#define OS_CRITICAL_METHOD    1 /**/
#if      OS_CRITICAL_METHOD == 1
#define  OS_ENTER_CRITICAL() ARMDisableInt1()   /* Disable interrupts*/                       
#define  OS_EXIT_CRITICAL()   ARMEnableInt1()    /* Enable interrupts*/
#endif
#if      OS_CRITICAL_METHOD == 2
#define  OS_ENTER_CRITICAL() ARMDisableInt2()   /* Disable interrupts*/                       
#define  OS_EXIT_CRITICAL()   ARMEnableInt2()    /* Enable interrupts*/
#endif
#if      OS_CRITICAL_METHOD == 3
#define  OS_ENTER_CRITICAL() ARMDisableInt3()   /* Disable interrupts*/                       
#define  OS_EXIT_CRITICAL()   ARMEnableInt3()    /* Enable interrupts*/
#endif
/* , */
#define OS_STK_GROWTH    1
#define OS_TASK_SW()        OSTaskSw()
#ifdef SEMIHOSTED
#define OS_IDLE_STK_SIZE        (64+SEMIHOSTED_STACK_NEEDS)
#else
#define OS_IDLE_STK_SIZE        64
#endif
/* */
extern void OSTaskSw(void);
extern void OSIntCtxSw(void);
extern void ARMDisableInt1(void);
extern void ARMEnableInt1(void);
extern void ARMDisableInt2(void);
extern void ARMEnableInt2(void);
extern void ARMDisableInt3(void);
extern void ARMEnableInt3(void);
extern void OSTickISR(void);
extern void SP_Compensate(void);
 
移植首先包括一系列數(shù)據(jù)類型的定義,以適應(yīng)不同微處理器的字長。uC/OS-II的代碼中不使用C語言的short,int等數(shù)據(jù)類型,因為這些數(shù)據(jù)類型是與處理器相關(guān),不可移植的。程序代碼中定義的數(shù)據(jù)類型字長應(yīng)根據(jù)處理器C編譯器規(guī)定的數(shù)據(jù)類型字長而定。上面的數(shù)據(jù)類型移植是根據(jù)ADS編譯器對C語言各類型的字長要求定義的。其中,OS_STK是任務(wù)堆棧數(shù)據(jù)類型,在ARM中它是32位的,OS_CPU_SR是CPU狀態(tài)寄存器寬度,它也是32位的。
OS_ENTER_CRITICAL( )和OS_EXIT_CRITICAL( )是用來設(shè)置臨界段代碼的函數(shù)。OS_ENTER_CRITICAL( )使系統(tǒng)進(jìn)入臨界段,這時要求系統(tǒng)內(nèi)核先關(guān)閉中斷,再處置臨界段代碼,保護(hù)臨界段代碼不受多任務(wù)或中斷服務(wù)子程序破壞。推出臨界段時調(diào)用OS_EXIT_CRITICAL( ),系統(tǒng)重新開中斷,進(jìn)行正常任務(wù)調(diào)度。通常以上兩個函數(shù)可以用3種方法實現(xiàn),OS_CPU_H中定義了一個OS_CRITICAL_METHOD常數(shù),用來選擇函數(shù)實現(xiàn)的方法。常數(shù)值為1時,采用最簡單的方法,OS_ENTER_CRITICAL( )中直接調(diào)用處理器指令關(guān)閉中斷,OS_EXIT_CRITICAL( )調(diào)用相應(yīng)處理器指令開中斷(詳細(xì)的代碼在os_cpu_a.s文件中定義)。這樣做存在一個問題:如果調(diào)用函數(shù)時系統(tǒng)禁止中斷,那當(dāng)臨界段代碼執(zhí)行完畢后系統(tǒng)中斷會變成允許了。常數(shù)值為2時,執(zhí)行OS_ENTER_CRITICAL( )時會先將中斷狀態(tài)保存到堆棧中,然后關(guān)中斷,執(zhí)行OS_ENTER_CRITICAL( )時從堆棧中恢復(fù)原來的中斷狀態(tài)。這樣做解決了方法1中存在的問題。常數(shù)值為3時需要多定義一個cpu_sr的局部變量,用于某些能直接得到當(dāng)前處理器狀態(tài)字的編譯器中,保存狀態(tài)字,用來恢復(fù)PSW。由于應(yīng)用簡單,方法1,2已經(jīng)足夠,所以本文中沒有實現(xiàn)方法3的具體代碼,而使方法3和方法2實現(xiàn)的代碼一致。這里可以以后再擴(kuò)充。
OS_STK_GROWTH常數(shù)定義了堆棧的方向,值為0時表示堆棧從下往上遞增,為1時表示堆棧從上往下遞減。本次移植中的堆棧結(jié)構(gòu)使用從上往下遞減方式,故此宏的值定義為1。OS_TASK_SW( )是一個宏,是在uC/OS-II從低優(yōu)先級切換到高優(yōu)先級任務(wù)時用到的,此處定義成任務(wù)調(diào)度函數(shù)OSTaskSw( ),實現(xiàn)從低優(yōu)先級任務(wù)切換到高優(yōu)先級任務(wù)的工作。
本文件要求用戶編寫10個簡單函數(shù),其中必要的函數(shù)是OSTaskStkInit( ),其它函數(shù)只要聲明即可。代碼如下:
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
    unsigned int *stk ;
    opt = opt;       /* */
    stk = (unsigned int *)ptos;    /**/
    /* */
    *--stk = (unsigned int) task;             /* lr */
    *--stk = 0;                         /* r12 */
    *--stk = 0;                         /* r11 */
    *--stk = 0;                         /* r10 */
    *--stk = 0;                         /* r9 */
    *--stk = 0;                         /* r8 */
    *--stk = 0;                         /* r7 */
 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多