欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
uC/OS-II嵌入式操作系統移植 - uC/OS移植 | 嵌入式在線(xiàn)部落
2007-9-2 13:28:33   
uC/OS-II嵌入式操作系統移植
操作系統的移植指的是使實(shí)時(shí)系統的內核能在微處理器上運行。uC/OS-II應移植到所使用的CPU上,然后才能得到應用。在uC/OS-II的移植中,處理器必須滿(mǎn)足一下一些要求:
l         處理器的C編譯器能產(chǎn)生可重入型代碼
l         處理器支持中斷,并且能產(chǎn)生定時(shí)中斷
l         用C語(yǔ)言就可以開(kāi)/關(guān)中斷
l         處理器能支持一定數量的數據存儲硬件堆棧
l         處理器有將堆棧指針以及其他CPU寄存器的內容讀出,并存儲到堆?;騼却嬷腥サ闹噶?/font>
實(shí)際上,uC/OS-II可以簡(jiǎn)單地看作是一個(gè)多任務(wù)調度器,在這個(gè)任務(wù)調度器上添加了與多任務(wù)操作系統相關(guān)的一些系統服務(wù),如信號量、郵箱等。其90%的代碼是用C語(yǔ)言寫(xiě)的,可以直接移植到有C語(yǔ)言編譯器的處理器上。移植主要都集中在多任務(wù)切換的實(shí)現上,因為這部分代碼用來(lái)保存和恢復CPU現場(chǎng)(即寫(xiě)/讀相關(guān)寄存器),不能用C語(yǔ)言,只能使用匯編語(yǔ)言完成,即編寫(xiě)OS_CPU_A.S文件。另外還需要修改與ARM體系結構相關(guān)的OS_CPU.H文件和用戶(hù)規定任務(wù)棧初始化結構的OS_CPU_C.C文件。uC/OS-II的移植工作相對來(lái)說(shuō)還是很容易的,具體的移植過(guò)程如下:
INCLUDES.H是一個(gè)主頭文件,本身與移植過(guò)程無(wú)關(guān),不過(guò)因為每一個(gè)uC/OS-II的C文件都要用到它,故在此簡(jiǎn)介一下。INCLUDES.H包含程序中主要的三個(gè)頭文件,分別是:OS_CPU.H,OS_CFG.H,UCOS_II.H。它使得工程項目中的每個(gè)C文件無(wú)需考慮它實(shí)際上需要哪些頭文件,增強了可讀性。另外也可以重新編輯此文件添加用戶(hù)自己定義的頭文件。
這個(gè)頭文件包括了用#define語(yǔ)句定義的與處理器相關(guān)的常數/宏以及類(lèi)型等,其中包括臨界段代碼宏定義:OS_ENTER_CRITICAL( )和OS_EXIT_CRITICAL( ),并可以提供三種辦法開(kāi)關(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);
 
移植首先包括一系列數據類(lèi)型的定義,以適應不同微處理器的字長(cháng)。uC/OS-II的代碼中不使用C語(yǔ)言的short,int等數據類(lèi)型,因為這些數據類(lèi)型是與處理器相關(guān),不可移植的。程序代碼中定義的數據類(lèi)型字長(cháng)應根據處理器C編譯器規定的數據類(lèi)型字長(cháng)而定。上面的數據類(lèi)型移植是根據ADS編譯器對C語(yǔ)言各類(lèi)型的字長(cháng)要求定義的。其中,OS_STK是任務(wù)堆棧數據類(lèi)型,在A(yíng)RM中它是32位的,OS_CPU_SR是CPU狀態(tài)寄存器寬度,它也是32位的。
OS_ENTER_CRITICAL( )和OS_EXIT_CRITICAL( )是用來(lái)設置臨界段代碼的函數。OS_ENTER_CRITICAL( )使系統進(jìn)入臨界段,這時(shí)要求系統內核先關(guān)閉中斷,再處置臨界段代碼,保護臨界段代碼不受多任務(wù)或中斷服務(wù)子程序破壞。推出臨界段時(shí)調用OS_EXIT_CRITICAL( ),系統重新開(kāi)中斷,進(jìn)行正常任務(wù)調度。通常以上兩個(gè)函數可以用3種方法實(shí)現,OS_CPU_H中定義了一個(gè)OS_CRITICAL_METHOD常數,用來(lái)選擇函數實(shí)現的方法。常數值為1時(shí),采用最簡(jiǎn)單的方法,OS_ENTER_CRITICAL( )中直接調用處理器指令關(guān)閉中斷,OS_EXIT_CRITICAL( )調用相應處理器指令開(kāi)中斷(詳細的代碼在os_cpu_a.s文件中定義)。這樣做存在一個(gè)問(wèn)題:如果調用函數時(shí)系統禁止中斷,那當臨界段代碼執行完畢后系統中斷會(huì )變成允許了。常數值為2時(shí),執行OS_ENTER_CRITICAL( )時(shí)會(huì )先將中斷狀態(tài)保存到堆棧中,然后關(guān)中斷,執行OS_ENTER_CRITICAL( )時(shí)從堆棧中恢復原來(lái)的中斷狀態(tài)。這樣做解決了方法1中存在的問(wèn)題。常數值為3時(shí)需要多定義一個(gè)cpu_sr的局部變量,用于某些能直接得到當前處理器狀態(tài)字的編譯器中,保存狀態(tài)字,用來(lái)恢復PSW。由于應用簡(jiǎn)單,方法1,2已經(jīng)足夠,所以本文中沒(méi)有實(shí)現方法3的具體代碼,而使方法3和方法2實(shí)現的代碼一致。這里可以以后再擴充。
OS_STK_GROWTH常數定義了堆棧的方向,值為0時(shí)表示堆棧從下往上遞增,為1時(shí)表示堆棧從上往下遞減。本次移植中的堆棧結構使用從上往下遞減方式,故此宏的值定義為1。OS_TASK_SW( )是一個(gè)宏,是在uC/OS-II從低優(yōu)先級切換到高優(yōu)先級任務(wù)時(shí)用到的,此處定義成任務(wù)調度函數OSTaskSw( ),實(shí)現從低優(yōu)先級任務(wù)切換到高優(yōu)先級任務(wù)的工作。
本文件要求用戶(hù)編寫(xiě)10個(gè)簡(jiǎn)單函數,其中必要的函數是OSTaskStkInit( ),其它函數只要聲明即可。代碼如下:
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ù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久