av午夜福利在线观看_国产精品一区二区白浆_8乄8X国产精品一区二区_国产精品国产AV大片

現(xiàn)在位置:范文先生網(wǎng)>理工論文>計算機信息技術(shù)>MicroC/OS-II在80C196上的移植實現(xiàn)

MicroC/OS-II在80C196上的移植實現(xiàn)

時間:2022-08-19 05:08:57 計算機信息技術(shù) 我要投稿
  • 相關(guān)推薦

MicroC/OS-II在80C196上的移植實現(xiàn)

摘  要:在嵌入式系統(tǒng)中使用實時操作系統(tǒng),可以提高系統(tǒng)的穩(wěn)定性、可靠性和實時性。MicroC/OS-II是一個完整的,可移植、可固化、可剪裁的搶占式多任務(wù)實時內(nèi)核,并且開放源代碼,得到了廣泛應(yīng)用。本文結(jié)合具體應(yīng)用,介紹了MicroC/OS-II在80C196上移植實現(xiàn)過程和注意事項。 
關(guān)鍵詞:實時操作系統(tǒng)  MicroC/OS-II  80C196  移植
    在嵌入式系統(tǒng)開發(fā)中,很長時間以來,一直采用傳統(tǒng)的嵌入式系統(tǒng)軟件設(shè)計模式:無限循環(huán)+中斷服務(wù)。該模式下,主程序為一個無限循環(huán),單任務(wù)順序執(zhí)行各個處理任務(wù)。在循環(huán)之外,設(shè)計一個或多個中斷服務(wù)函數(shù),用于處理異步事件。在相對簡單的應(yīng)用中,這種模式,完全可以勝任。而對于實時性要求較高、處理任務(wù)較多的應(yīng)用,就會暴露出實時性差的缺點,甚至不能夠達到應(yīng)用的要求,系統(tǒng)可靠性低,穩(wěn)定性差。引入實時操作系統(tǒng),可以較好解決這個問題。

MicroC/OS-II是一個完整的,可移植、可固化、可剪裁的搶占式多任務(wù)實時內(nèi)核,并且開放源代碼,在嵌入式系統(tǒng)中得到了廣泛應(yīng)用。為了實現(xiàn)老系統(tǒng)功能升級,達到了不改變硬件設(shè)計,增加系統(tǒng)功能、提高系統(tǒng)性能的目的,從而采用該實時操作系統(tǒng)。本文介紹了將其移植應(yīng)用于80C196的具體實現(xiàn)和注意事項。

所謂移植,就是使一個實時內(nèi)核能夠在其他微處理器或微控制器上運行。移植要做的是,修改或編寫與處理器硬件相關(guān)的代碼。由于80C196系統(tǒng)的資源有限,除了代碼移植,還要根據(jù)具體應(yīng)用,對MicroC/OS-II進行裁剪,以達到系統(tǒng)的設(shè)計要求。

1. MicroC/OS-II簡介

MicroC/OS-II的系統(tǒng)結(jié)構(gòu)見圖1。

MicroC/OS-II最主要的特點之一是源代碼開放,有利于用戶根據(jù)具體應(yīng)用對操作系統(tǒng)進行充分的裁減。這也使得其可移植性非常的強。

MicroC/OS-II是為嵌入式應(yīng)用專門設(shè)計的,完全可與應(yīng)用軟件融合在一起,進行編譯、連接,進而作為產(chǎn)品的一部分發(fā)布。

MicroC/OS-II是完全可剝奪型的實時內(nèi)核,總是運行就緒任務(wù)中最高優(yōu)先級的任務(wù),即準備就緒的高優(yōu)先級任務(wù)可以剝奪正在運行的低優(yōu)先級任務(wù)的CPU使用權(quán)。

2. 移植的基本思路

2.1 編譯器

采用TASKING公司的C196編譯器,可以方便的嵌入?yún)R編語言,因此該移植所有的函數(shù)都在OS_CPU_C.C中實現(xiàn),沒有OS_CPU_A.ASM文件。能夠采用C語言編碼的,盡量采用C語言編碼;不能采用C代碼的,采用嵌入?yún)R編的方式。以此降低代碼的分散度,提高代碼的可讀性。

2.2 代碼移植

代碼移植,需要修改或編寫與處理器硬件相關(guān)的代碼。包括與處理器相關(guān)的數(shù)據(jù)類型定義,函數(shù)定義,存儲器操作等。其中的主要任務(wù)有:

1)    重新編輯INCLUDES.H文件,增加與應(yīng)用相關(guān)的頭文件;改寫OS_CPU.H文件;

2)    改寫OS_CFG.H文件;編寫OS_CPU_C.C;

3)    優(yōu)化代碼效率。

2.3 存儲資源

由于80C196系統(tǒng)的物理資源十分有限,需要對系統(tǒng)內(nèi)核進行充分的裁剪。

片內(nèi)可用內(nèi)存為220個字節(jié),在系統(tǒng)中外部擴展3584(3.5K)個字節(jié)。為了提高系統(tǒng)速度,操作系統(tǒng)盡量使用片內(nèi)存儲區(qū)。系統(tǒng)應(yīng)用中經(jīng)常使用的變量,也需要分配在片內(nèi)存儲區(qū)。

為了節(jié)約存儲資源采取以下措施:

1)    裁剪不使用的功能模塊和其使用相應(yīng)變量。

2)    根據(jù)應(yīng)用的需要裁剪所需資源的規(guī)模。例如,在應(yīng)用中實際使用任務(wù)為6個,所以將OSRdyTbl由一個數(shù)組,更改為一個8位變量,并去掉OSRdyGrp,因為其永遠是0。

3)    修改OS_InitTaskIdle內(nèi)容,將OS_TaskIdle任務(wù)換為應(yīng)用的最低優(yōu)先級的任務(wù)。

4)    裁剪OS_TCB的內(nèi)容。例如,永遠不會使用的變量OSTCBY和OSTCBBitY。

5)    裁剪中斷嵌套的相關(guān)內(nèi)容。

2.4 時間資源

MicroC/OS-II推薦的時鐘節(jié)拍為10~200ms,而本系統(tǒng)的實際時鐘節(jié)拍為250μs,這樣系統(tǒng)額外開銷必然大幅度增加,系統(tǒng)時間資源十分緊張。

為了節(jié)約時間資源采取以下措施:

1)    棄用OSTimeDly函數(shù),直接操作任務(wù)定時器,調(diào)用OS_Sched函數(shù)。

2)    棄用OSIntExit和OSIntCtxSw函數(shù),將其源代碼直接加入軟件定時器中斷服務(wù)函數(shù)。

3)    降低其他中斷服務(wù)函數(shù)的代碼長度,且不進行任務(wù)切換,降低系統(tǒng)時鐘的誤差。

4)    根據(jù)編譯得到的匯編代碼,對部分C語言代碼進行優(yōu)化。

3. 移植實現(xiàn)

3.1 任務(wù)分配

一個任務(wù),也稱為一個線程,是一個簡單的程序,該程序可以認為CPU完全屬于自己。每個任務(wù)有獨立的堆?臻g和優(yōu)先級。

根據(jù)每個任務(wù)的內(nèi)容可以在相應(yīng)位置,使任務(wù)就緒。而任務(wù)就緒和任務(wù)切換可以分開。例如,在接收中斷中,使可以CAN通信任務(wù)就緒,但可以不進行任務(wù)切換,而在系統(tǒng)時鐘函數(shù)中進行任務(wù)切換。系統(tǒng)總是讓處于就緒態(tài)的、優(yōu)先級最高的任務(wù)先運行。

3.2 時鐘節(jié)拍

時鐘節(jié)拍是特定的周期性中斷,根據(jù)應(yīng)用系統(tǒng)的需要,時鐘節(jié)拍的周期為250μs,采用軟件定時器實現(xiàn)。在該服務(wù)函數(shù)中實現(xiàn)任務(wù)切換,為了節(jié)省時間和存儲資源,不進行函數(shù)調(diào)用。

    軟件定時器中斷服務(wù)函數(shù)實現(xiàn)代碼如下:

void OSTickISR(void)

{

… …// 重置軟件定時器

     OS250usCount++;    // 計數(shù)器加1

     if((OS250usCount&0x03)==0)  {

         … …

         OS1msCount++; // 1ms定時器

         OS50msDly++;  // 50ms定時器

         OSRdyTbl |= 0x20;  // 1ms定時到,就緒TaskChk任務(wù)

… …    }

     // OSIntExit() 中斷退出任務(wù)切換

     OSPrioHighRdy = OSUnMapTbl[OSRdyTbl]; // 取得最高優(yōu)先級就緒任務(wù)的優(yōu)先級

     if (OSPrioHighRdy != OSPrioCur)// 判斷當前任務(wù)優(yōu)先級是否與最高優(yōu)先級就緒任務(wù)的優(yōu)先級相同

     {

         // OSIntCtxSw();

         OSTCBCur->OSTCBStkPtr = psp;         // 存儲被中斷任務(wù)的堆棧指針

         OSTCBCur = OSTCBPrioTbl[OSPrioHighRdy];   // 取得最高優(yōu)先級就緒任務(wù)的TCB

         OSPrioCur = OSPrioHighRdy;  // 設(shè)當前任務(wù)優(yōu)先級為最高優(yōu)先級就緒任務(wù)的優(yōu)先級

         psp = OSTCBCur->OSTCBStkPtr;     // 取得堆棧指針

         asm{     // 現(xiàn)場恢復(fù)

              pop  dx;  pop  cx;  pop  bx;  pop  ax;  popa;

              ret; // 切換到最高優(yōu)先級就緒任務(wù),必須要有的

         }

     }

}

3.3 中斷

由于中斷的存在,任何代碼在任何時候,都有可能被中斷。而有些代碼是不可分割的,如果被中斷將會產(chǎn)生不可預(yù)料的后果。因此定義臨界段,以處理不可分割的代碼。一旦該部分代碼開始執(zhí)行,不允許任何中斷插入。為了確保臨界段代碼的執(zhí)行不被中斷,在進入臨階段之前,必須關(guān)中斷,臨界段代碼執(zhí)行結(jié)束,開中斷。