1. 程式人生 > >UCOSii(一)——系統初始化

UCOSii(一)——系統初始化

一、閒扯

之前看完了sdcc man和datasheet之後,用sdcc寫了幾個小程式。大部分時間都在幹一些調式程式碼的事,就趁這段時間把UCOS複習一下吧。由於這是UCOS的第一篇,就來扯點閒話吧。

對於UCOSii,我其實沒有在實際的專案中用到過。只是記得在以前看過一本UCOS作者自己寫的書,書名已經忘記了。這種語言或者系統架構的設計者寫的書往往看起來很有意思,因為作者不僅會給你解釋程式碼,還會告訴你他為什麼要這麼做。這比生硬得給出流程圖和註釋的參考類書要更有趣味,不得不說國內的一些書看起來就像是使用說明,在網路日益發達的今天這些書的作用越來越小。比如我想知道一個基類的具體功能,搜尋要比翻書快上許多。

UCOS的本名是μ/cOS,用希臘字母μ表示它的輕量級。其實它並不是一個免費的RTOS,只有當被用作教育用途時(往往被用來供大家學習作業系統),才可以有免費的授權。但是在目前的環境下,大家用μ/cOS來進行開發應該還是不要緊的。據我所知,我還沒有聽說過有使用未授權μ/cOS被起訴的。又由於μ/cOS的相關文件以及結構性程式碼庫還算比較完善,因此也算是個在嵌入式裝置上較為流行的作業系統。

二、如何取得UCOS

UCOS的官網上有很多移植好的工程,還有一些相應的APP和Drive,這可以給大家節省不少時間。

UCOS下載中心:

三、系統初始化

3.1 UCOS的任務

作為一個可移植的嵌入式實時作業系統,μ/cOS的任務應該僅僅被限定為使用者程序管理。它應該將硬體層儘量抽象掉,所以在main入口以前的晶片初始化(初始化系統時鐘、初始化Flash讀取,初始化晶片工作模式等等)、板卡初始化以及C環境的初始化都交於使用者自己來進行。這個部分,通俗的做法是載入晶片廠商提供一些已經標準化的庫函式,許多編譯器也會在編譯工程時自動連結一些startup_函式以引導C環境的執行。

3.3 時鐘節拍

要進行任務排程,核心的優先順序必然要在各使用者程序之上。它定期的打斷各個任務執行,使自己突然佔用CPU,並進行各種針對程序的操作。

這很自然讓我們聯想到中斷,的確在Ucos中,常常用時鐘中斷來完成程序的管理工作。如果你不想在時鐘中斷裡做太多的事,那麼可以在中斷產生時啟動一個被註冊為最高優先順序的程序,由該程序來做排程工作。

3.4 UCOS的初始化流程

對UCOS核心來說,所有的程序都是一個物件,所以要有描述程序屬性的資料結構,以供核心控制程序。核心還要建立另外一些資料結構來作為標記各種自身需要記錄和呼叫的屬性,還有一些資料結構被建立用以演算法輔助。

UCOS執行的第一步,就是初始化這些資料結構。

給這些資料結構分配空間以及設初值之後,使用者可以註冊幾個最開始的使用者程序。緊接著核心對剛註冊的這幾個程序進行初始化,系統就進入了一個多工執行的常態。

UCOSii初始化的虛擬碼:

int  main (void)
{
    /* 關閉系統中斷,防止在初始化時去跑中斷服務程式而造成難以預料的問題。OS_ENTER_CRITICAL()巨集*/

    /* 初始化核心的資料結構 OSInit()函式 */

    /* 註冊使用者程序 OSTaskCreate()函式*/

    /* 系統啟動 OSStart()函式 */
}

3.3 OSInit初始化的資料結構

OSInit會初始化核心用到的資料結構,瞭解這些資料結構對理解UCOS是必須的,這些資料結構這裡只做個簡要的描述,在之後的文章裡再詳細解釋。

普通全域性變數

用於描述一些核心的屬性。一些計數器(比如計算一共進行了幾次中斷),狀態器(比如是否已經進入多工環境)。

OSPrioCur
OSPrioHighRdy
OSTCBCur
OSTCBHighRdy
OSTime
OSIntNesting
OSLockNesting
OSCtxSwCtr
OSTaskCtr
OSRunning
OSCPUUsage
OSIdleCtrMax
OSIdleCtrRun
OSIdleCtr
OSStatRdy
OSIntExitY

陣列

就緒佇列,用於排程演算法。

這裡寫圖片描述

連結串列

這個描述程序屬性的資料結構一般叫做PCB(Process control block),UCOS裡叫作TCB(Task control block)。所有的作業系統都會定義這樣一個數據結構。