1. <code id="ya7qu"><span id="ya7qu"><label id="ya7qu"></label></span></code>

    <b id="ya7qu"><bdo id="ya7qu"></bdo></b>
    <wbr id="ya7qu"><optgroup id="ya7qu"><strike id="ya7qu"></strike></optgroup></wbr>
  2. <u id="ya7qu"><bdo id="ya7qu"></bdo></u>
    現在位置:范文先生網>理工論文>計算機信息技術>MicroC/OS-II在80C196上的移植實現

    MicroC/OS-II在80C196上的移植實現

    時間:2022-08-19 05:08:57 計算機信息技術 我要投稿
    • 相關推薦

    MicroC/OS-II在80C196上的移植實現

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

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

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

    1. MicroC/OS-II簡介

    MicroC/OS-II的系統結構見圖1。

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

    MicroC/OS-II是為嵌入式應用專門設計的,完全可與應用軟件融合在一起,進行編譯、連接,進而作為產品的一部分發布。

    MicroC/OS-II是完全可剝奪型的實時內核,總是運行就緒任務中最高優先級的任務,即準備就緒的高優先級任務可以剝奪正在運行的低優先級任務的CPU使用權。

    2. 移植的基本思路

    2.1 編譯器

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

    2.2 代碼移植

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

    1)    重新編輯INCLUDES.H文件,增加與應用相關的頭文件;改寫OS_CPU.H文件;

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

    3)    優化代碼效率。

    2.3 存儲資源

    由于80C196系統的物理資源十分有限,需要對系統內核進行充分的裁剪。

    片內可用內存為220個字節,在系統中外部擴展3584(3.5K)個字節。為了提高系統速度,操作系統盡量使用片內存儲區。系統應用中經常使用的變量,也需要分配在片內存儲區。

    為了節約存儲資源采取以下措施:

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

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

    3)    修改OS_InitTaskIdle內容,將OS_TaskIdle任務換為應用的最低優先級的任務。

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

    5)    裁剪中斷嵌套的相關內容。

    2.4 時間資源

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

    為了節約時間資源采取以下措施:

    1)    棄用OSTimeDly函數,直接操作任務定時器,調用OS_Sched函數。

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

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

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

    3. 移植實現

    3.1 任務分配

    一個任務,也稱為一個線程,是一個簡單的程序,該程序可以認為CPU完全屬于自己。每個任務有獨立的堆棧空間和優先級。

    根據每個任務的內容可以在相應位置,使任務就緒。而任務就緒和任務切換可以分開。例如,在接收中斷中,使可以CAN通信任務就緒,但可以不進行任務切換,而在系統時鐘函數中進行任務切換。系統總是讓處于就緒態的、優先級最高的任務先運行。

    3.2 時鐘節拍

    時鐘節拍是特定的周期性中斷,根據應用系統的需要,時鐘節拍的周期為250μs,采用軟件定時器實現。在該服務函數中實現任務切換,為了節省時間和存儲資源,不進行函數調用。

        軟件定時器中斷服務函數實現代碼如下:

    void OSTickISR(void)

    {

    … …// 重置軟件定時器

         OS250usCount++;    // 計數器加1

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

             … …

             OS1msCount++; // 1ms定時器

             OS50msDly++;  // 50ms定時器

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

    … …    }

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

         OSPrioHighRdy = OSUnMapTbl[OSRdyTbl]; // 取得最高優先級就緒任務的優先級

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

         {

             // OSIntCtxSw();

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

             OSTCBCur = OSTCBPrioTbl[OSPrioHighRdy];   // 取得最高優先級就緒任務的TCB

             OSPrioCur = OSPrioHighRdy;  // 設當前任務優先級為最高優先級就緒任務的優先級

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

             asm{     // 現場恢復

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

                  ret; // 切換到最高優先級就緒任務,必須要有的

             }

         }

    }

    3.3 中斷

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

    国产福利萌白酱精品tv一区_日韩亚洲中字无码一区二区三区_亚洲欧洲高清无码在线_全黄无码免费一级毛片
    1. <code id="ya7qu"><span id="ya7qu"><label id="ya7qu"></label></span></code>

      <b id="ya7qu"><bdo id="ya7qu"></bdo></b>
      <wbr id="ya7qu"><optgroup id="ya7qu"><strike id="ya7qu"></strike></optgroup></wbr>
    2. <u id="ya7qu"><bdo id="ya7qu"></bdo></u>
      香港国产一区二区 | 亚洲精品欧美在线综合国 | 日韩A级亚洲A级欧美A级 | 亚洲性人人天天夜夜添 | 亚洲成a人在线一区二区三区 | 五月天在线精品老司机 |