第八章 在51微控制器上移植μC/OS-Ⅱ

8.1 μC/OS-Ⅱ移植的一般性問題

8.1.1 可重入函式

能允許同時被多個任務所呼叫,而不會通過函式中變數的耦合引起任務之間的相互干擾的函式叫做可重入函式。

一個可重入函式只使用區域性變數,因為函式的區域性變數儲存在任務的堆疊中,所以可保證不同的任務在呼叫同一個函式時不會發生衝突。如果函式一定要使用全域性變數,則需要對使用的全域性變數做必要的保護。

8.1.2 時鐘節拍的產生

一般情況下應該使用硬體定時器來作為時鐘中斷源,這個定時器可以是微處理器整合在一個晶片上的,也可以是分立的,定時中斷的頻率以10~100Hz為宜。

8.1.3 任務堆疊的設計

系統堆疊與任務堆疊的關係:

各個任務用來儲存各自任務堆疊內容的片外RAM空間叫做任務堆疊;

    定義在片內RAM的,各個任務在執行時使用的堆疊叫做系統堆疊。

8.2 在51系列微控制器上已知μC/OS-Ⅱ

8.2.1 改寫檔案OS_CPU.H

1. 堆疊的增長方向

#defineOS_STK_GROWTH 1

堆疊從低地址向高地址增長(從下往上增長)

2. 定義臨界段的巨集

#defineOS_ENTER_CRITICAL() EA = 0

#defineOS_EXIT_CRITICAL() EA = 1

3. 定義任務切換巨集

#defineOS_TASK_SW() OSCtxSw()

4. 定義資料型別


8.2.2 任務堆疊的設計


8.2.3 檔案OS_CPU_C.C的改寫

在檔案OS_CPU_C.C中主要改寫任務堆疊的初始化函式OSTaskStkInit(),由於要使用微控制器上的定時器為系統設定時鐘中斷,所以還要新增對51微控制器定時器的初始化程式。

如果對51微控制器的T0定時器作為系統時鐘的中斷源,初始化如下:

void InitTimero(void)  reentrant

{

    TMOD = TMOD & 0x0F0;

    TMOD = TMOD | 0x001;

    TH0 = 0x70;

    TL0 = 0x00;

    TH0 = 1;

}

8.2.4 幾點必須注意的事項

μC/OS-Ⅱ使用的pdata、data等引數都與KEIL的關鍵字相同,所以還要把μC/OS-Ⅱ的這些資料改成ppdata、ddata等。

為了使用Ri而不用對它們進行訪問,要使用KEIL擴充套件關鍵字IDATA,將它們定義在內部RAM中。

8.3 應用舉例

.