μC/OS-II基本原理簡介
μC/OS-II,意為“微控制器作業系統版本”。其不僅提供了一個完整的嵌入式實時 核心的原始碼,而且對這些程式碼的細節進行了詳盡的解釋。他不僅告訴讀者該實時核心是怎麼寫的,還解釋了為什么這麼寫,而且該實時核心可以被方便的移植到幾 乎所有的嵌入式應用類CPU上。對於商業應用中哪些昂貴的實時作業系統軟體,μC/OS-II是一個很好的學習平臺。
說到μC/OS-II,這裡先介紹一下嵌入式應用程式的開發模式。基於 微控制器的嵌入式系統在軟體設計時沒有作業系統,而是將應用程式設計成一個死迴圈程式,系統輪流處理事件,對於事件響應比較高的事件,則使用中斷來處理。這 種方法的好處是程式碼簡單、程式碼量小、事件處理單一,但是在事件響應上得不到保障。建立在作業系統之上的軟體設計方法有別於微控制器的這種迴圈系統。 μC/OS-II 是以任務為最小程式單元的,它在核心環境下被分割為獨立的且可並行執行的基本邏輯單位的程式(這是其最大的特點),任何任務不用關心資源的具體管理方法, 而是交給作業系統,有作業系統來決定,這使得程式碼的層次很清晰,可以提高程式的執行效率。下面是μC/OS-II 軟體設計的基本程式碼結構:
void Task_one(void *pdata) //任務1的程式碼
{
}
void Task_two(void *pdata) //任務2的程式碼
{
}
void Task_three(void *pdata) //任務3的程式碼
{
}
void main(void)
{
OSInit(); //初始化
OsTaskCreate(task_one...); //建立任務1
OsTaskCreate(task_two...); //建立任務2
OsTaskCreate(task_three...); //建立任務3
......
OSStart(); //啟動系統
}
由程式碼結構可以看出,其層次結構很清晰。
μC/OS-II 微小核心提供了大約14個使用者介面函式,如下:
void OSInit(void); //初始化μC/OS-II
void OSStart(void); //啟動μC/OS-II 的多工環境
INT8U OSTaskCreate(void(*task)(void *pd),void *pdata,OS_STK *ptos,INT8U prio); //建立一個新任務
void OSTimeDly(INT16U ticks); //將一個任務延時若干個時鐘節拍
void OSTimeTick(void); //在每次時鐘節拍中斷服務程式被呼叫
INT8U OSTaskDel(INT8U prio); //刪除一個指定優先順序的任務
void OSIntEnter(void); //通知μC/OS-II 一箇中斷服務已開始執行
void OSIntExit(void); //通知μC/OS-II 一箇中斷服務已執行完畢
OS_ENTER_CRITICAL和OS_EXIT_CRITICAL() //函式原型由移植程式碼決定,是描述進入臨界狀態所完成的操作和退出臨界狀態的方法
OS_EVENT *OSSemCreate(INT16U cnt); //建立並初始化一個訊號量
void OSSemPend(OS_EVENT *pevent,INT16U timeout,INT8U *err); //等待訊號量
INT8U OSSemPost(OS_EVENT *PEVENT); //傳送訊號量
OS_EVENT *OSSemDel(OS_EVENT *pevent,INT8U opt,INT8U *err); //刪除訊號量
具體的介面函式的實現可以參看μC/OS-II 的原始碼,上面有非常詳細的說明。
在μC/OS-II 中,任務有5種狀態,分別為睡眠狀態、就緒狀態、執行狀態、等待狀態和被中斷狀態
睡眠狀態:任務駐留在程式空間之中,還沒有交給μC/OS-II 管理的狀態,而將任務交給μC/OS-II 管理是通過呼叫函式OSTaskCreate()實現的。
就緒狀態:任務已經準備好,可以運行了,但由於該任務的優先順序比正在執行的任務的優先順序低,還暫時不能執行的狀態。在μC/OS-II 中,當任務一旦建立,這個任務緊進入了就緒態準備執行。
執行狀態:任務掌握了CPU的控制權,正在執行中的狀態。
等待狀態:任務在等待某一事件的發生還不能執行的狀態。
被中斷狀態:因為中斷服務程式正在執行而得不到CPU控制權的狀態。
在任意給定時刻,任務的狀態一定是這五種狀態之一。
以上就是μC/OS-II 系統的一些基本概念和相應的一些機制。