UCOS

UCOS

uC/OS II(Micro Control Operation System Two)是一個可以基於ROM運行的、可裁減的、搶占式、實時多任務核心,具有高度可移植性,特別適合於微處理器和控制器,適合很多商業作業系統性能相當的實時作業系統(RTOS)。為了提供最好的移植性能,uC/OS II最大程度上使用ANSI C語言進行開發,並且已經移植到近40多種處理器體系上,涵蓋了從8位到64位各種CPU(包括DSP)。 uC/OS II可以簡單的視為一個多任務調度器,在這個任務調度器之上完善並添加了和多任務作業系統相關的系統服務,如信號量、信箱等。其主要特點有公開原始碼,代碼結構清晰、明了,注釋詳盡,組織有條理,可移植性好,可裁剪,可固化。核心屬於搶占式,最多可以管理60個任務。從1992年開始,由於高度可靠性、魯棒性和安全性,uC/OS II已經廣泛使用在從照相機到航空電子產品的各種套用中。μC/OS-II實時多任務作業系統核心。它被廣泛套用於微處理器、微控制器和數位訊號處理器。 μC/OS-II 的前身是μC/OS,最早出自於1992 年美國嵌入式系統專家Jean J.Labrosse 在《嵌入式系統編程》雜誌的5 月和6 月刊上刊登的文章連載,並把μC/OS 的源碼發布在該雜誌的B B S 上。

組成部分

μC/OS-II可以大致分成核心、任務處理、時間處理、任務同步與通信,CPU的移植等5個部分。

1) 核心部分(OSCore.c) 是作業系統的處理核心,包括作業系統初始化、作業系統運行、中斷進出的前導、時鐘節拍、任務調度、事件處理等多部分。能夠維持系統基本工作的部分都在這裡。

2) 任務處理部分(OSTask.c) 任務處理部分中的內容都是與任務的操作密切相關的。包括任務的建立、刪除、掛起、恢復等等。因為μC/OS-II是以任務為基本單位調度的,所以這部分內容也相當重要。

3) 時鐘部分(OSTime.c) μC/OS-II中的最小時鐘單位是timetick(時鐘節拍)。任務延時等操作是在這裡完成的。

4) 任務同步和通信部分 為事件處理部分,包括信號量、信箱、訊息佇列、事件標誌等部分;主要用於任務間的互相聯繫和對臨界資源的訪問。

5) 與CPU的接口部分 是指μC/OS-II針對所使用的CPU的移植部分。由於μC/OS-II是一個通用性的作業系統,所以對於關鍵問題上的實現,還是需要根據具體CPU的具體內容和要求作相應的移植。這部分內容由於牽涉到SP等系統指針,所以通常用彙編語言編寫。主要包括中斷級任務切換的底層實現、任務級任務切換的底層實現、時鐘節拍的產生和處理、中斷的相關處理部分等內容。

套用情況

1) 高優先權的任務因為需要某種臨界資源,主動請求掛起,讓出處理器,此時將調度就緒狀態的低優先權任務獲得執行,這種調度也稱為任務級的上下文切換。 2) 高優先權的任務因為時鐘節拍到來,在時鐘中斷的處理程式中,核心發現高優先權任務獲得了執行條件(如休眠的時鐘到時),則在中斷態直接切換到高優先權任務執行。這種調度也稱為中斷級的上下文切換。 這兩種調度方式在uC/OS-II的執行過程中非常普遍,一般來說前者發生在系統服務中,後者發生在時鐘中斷的服務程式中。 調度工作的內容可以分為兩部分:最高優先權任務的尋找和任務切換。其最高優先權任務的尋找是通過建立就緒任務表來實現的。u C / O S 中的每一個任務都有獨立的堆疊空間,並有一個稱為任務控制塊TCB(Task Control Block)的數據結構,其中第一個成員變數就是保存的任務堆疊指針。任務調度模組首先用變數OSTCBHighRdy 記錄當前最高級就緒任務的TCB 地址,然後調用OS_TASK_SW()函式來進行任務切換。

任務最佳化

摘要:μC/OS-II是一種適用於嵌入式系統的搶占式實時多任務作業系統,開放原始碼,便於學習和使用。介紹μC/OS-II在任務級和中斷級的任務切換原理,以及這一作業系統基於嵌入式系統的對於中斷的處理;相對於記憶體資源較少的單片機,著重討論一種最佳化的實用堆疊格式和切換形式,以提高資源的利用率;結合MSP430單片機,做具體的分析。 關鍵字:實時多任務作業系統 μC/OS MSP430 中斷 堆疊 引 言 在嵌入式作業系統領域,由Jean J. Labrosse開發的μC/OS,由於開放原始碼和強大而穩定的功能,曾經一度在嵌入式系統領域引起強烈反響。而其本人也早已成為了嵌入式系統會議(美國)的顧問委員會的成員。 不管是對於初學者,還是有經驗的工程師,μC/OS開放原始碼的方式使其不但知其然,還知其所以然。通過對於系統內部結構的深入了解,能更加方便地進行開發和調試;並且在這種條件下,完全可以按照設計要求進行合理的裁減、擴充、配置和移植。通常,購買RTOS往往需要一大筆資金,使得一般的學習者望而卻步;而μC/OS對於學校研究完全免費,只有在套用於盈利項目時才需要支付少量的著作權費,特別適合一般使用者的學習、研究和開發。自1992第1版問世以來,已有成千上萬的開發者把它成功地套用於各種系統,安全性和穩定性已經得到認證,現已經通過美國FAA認證。

任務管理

uC/OS-II 中最多可以支持64 個任務,分別對應優先權0~63,其中0 為最高優先權。63為最低級,系統保留了4個最高優先權的任務和4個最低優先權的任務,所有用戶可以使用的任務數有56個。 uC/OS-II提供了任務管理的各種函式調用,包括創建任務,刪除任務,改變任務的優先權,任務掛起和恢復等。 系統初始化時會自動產生兩個任務:一個是空閒任務,它的優先權最低,該任務僅給一個整型變數做累加運算;另一個是統計任務,它的優先權為次低,該任務負責統計當前cpu的利用率。

時間管理

uC/OS-II的時間管理是通過定時中斷來實現的,該定時中斷一般為10毫秒或100毫秒發生一次,時間頻率取決於用戶對硬體系統的定時器編程來實現。中斷髮生的時間間隔是固定不變的,該中斷也成為一個時鐘節拍。 uC/OS-II要求用戶在定時中斷的服務程式中,調用系統提供的與時鐘節拍相關的系統函式,例如中斷級的任務切換函式,系統時間函式。

記憶體管理

在ANSI C中是使用malloc和free兩個函式來動態分配和釋放記憶體。但在嵌入式實時系統中,多次這樣的操作會導致記憶體碎片,且由於記憶體管理算法的原因,malloc和free的執行時間也是不確定。 uC/OS-II中把連續的大塊記憶體按分區管理。每個分區中包含整數個大小相同的記憶體塊,但不同分區之間的記憶體塊大小可以不同。用戶需要動態分配記憶體時,系統選擇一個適當的分區,按塊來分配記憶體。釋放記憶體時將該塊放回它以前所屬的分區,這樣能有效解決碎片問題,同時執行時間也是固定的。

通信同步

對一個多任務的作業系統來說,任務間的通信和同步是必不可少的。uC/OS-II中提供了4種同步對象,分別是信號量,信箱,訊息佇列和事件。所有這些同步對象都有創建,等待,傳送,查詢的接口用於實現進程間的通信和同步。

可移植性

隨著信息化技術的發展和數位化產品的普及,以計算機技術、晶片技術和軟體技術為核心的嵌入式系統再度成為當前研究和套用的熱點。 對功能、可靠性、成本、體積和功耗嚴格要求的嵌入式系統一般由嵌入式微處理器、外圍硬體設備、嵌入式作業系統以及用戶的應用程式等四個部分組成,其中嵌入式微處理器和嵌入式作業系統分別是其硬體和軟體的核心。 ARM處理器由於其具有小體積、低功耗、低成本、高性能等特點,廣泛套用在16/32位嵌入式RISC解決方案中,幾乎占有嵌入式微處理器市場分額的75% ,本文選定三星公司生產的一款基於ARM920T核的高性能低功耗SOC晶片S3C2410作為移植方案的硬體平台。市場上主流的嵌入式實時作業系統有Vxworks、pSos、WinCE、Linux等,基於實時性、成本以及開發難度方面的考慮,我們選擇uC/OS II——開放原始碼的嵌入式實時作業系統。

uC/OSII的正常運行需要處理器平台滿足以下要求:

a)處理器的C編譯器能產生可重入代碼。

b)用C語言就可以打開和關閉中斷。

c)處理器支持中斷,並且能產生定時中斷(通常在10至100Hz之間)。

d)處理器支持能夠容納一定量數據(可能是幾千位元組)的硬體堆疊。

e)處理器有將堆疊指針和其它CPU暫存器讀出和存儲到堆疊或記憶體中的指令。

S3C2410處理器採用ARM920T核心,內部共有37個暫存器,其中R13通常用作堆疊指針,只要系統RAM空間允許,堆疊空間理論上沒有限制。ARM處理器提供ARM指令和Thumb指令兩種指令集,每種指令集都包含有豐富的指令對堆疊進行操作,可以隨意的對處理器中的暫存器進行堆疊操作。根據堆疊生長方向的不同,可以生成4種不同的堆疊,分別是滿遞增、空遞增、滿遞減(此移植中使用的是滿遞減方式)、空遞減。晶片內集成5個定時時鐘,任何一個都可以產生定時中斷,滿足第三條要求。ADS集成開發環境的內置編譯器可以產生可重入代碼,並且支持內嵌彙編,C環境中可任意的進行開關中斷操作。綜上所述uC/OS II完全可以移植到S3C2410上運行。

3 主體移植過程

3.1 設定與處理器及編譯器相關的代碼[OS_CPU.H]

不同的編譯器會使用不同的位元組長度來表示同一數據類型,所以要定義一系列數據類型以確保移植的正確性。下面是uC/OS II定義的一部分數據類型。

typedef unsigned char BOOLEAN;

typedef unsigned char INT8U;/*無符號8位*/

typedef signed char INT8S;/*帶符號8位*/

typedef unsigned int INT16U;/*無符號16位*/

typedef signed int INT16S;/*帶符號16位*/

typedef unsigned long INT32U;/*無符號32位數*/

typedef signed long INT32S;/*帶符號32位數*/

typedef float FP32;/*單精度浮點數*/

typedef double FP64;/*雙精度浮點數*/

typedef unsigned int OS_STK;/*堆疊入口寬度*/

typedef unsigned int OS_CPU_SR;/*暫存器寬度*/

uC/OS II需要先關中斷再訪問臨界區的代碼,並且在訪問完後重新允許中斷。uC/OS II定義了兩個宏來禁止和允許中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),本移植實現這兩個宏的彙編代碼。

#define OS_ENTER_CRITICAL()(cpu_sr=OSCPUSaveSR())/*Disable interrupts*/

#define OS_EXIT_CRITICAL()(OSCPURestoreSR(cpu_sr))/*Enable interrupts*/

EXPORT OSCPUSaveSR OSCPUSaveSR mrs r1,cpsr mov r0,r1 orr r1,r1,#0xc0 msr cpsr_cxsf,r1 mov pc,lr

EXPORT OSCPURestoreSR OSCPURestoreSR msr cpsr_cxsf,r0 mov pc,lr

3.2 用C語言實現與處理器任務相關的函式[OS_CPU_C.C]

OSTaskStkInit() OSTaskCreateHook() OSTaskDelHook() OSTaskSwHook() OSTaskStatHook() OSTimeTickHook() 實際需要修改的只有OSTaskStkInit()函式,其他五個函式需要聲明,但不一定有實際內容。這五個函式都是用戶定義的,所以OS_CPU_C.C中沒有給出代碼。如果需要使用這些函式,可以將檔案OS_CFG.H中的#define constant OS_CPU_HOOKS_EN設為1,設為0表示不使用這些函式。 OSTaskStkInit()函式由OSTaskCreate()或OSTaskCreateExt()調用,需要傳遞的參數是任務代碼的起始地址、參數指針(pdata)、任務堆疊頂端的地址和任務的優先權,用來初始化任務的堆疊,初始狀態的堆疊模擬發生一次中斷後的堆疊結構。堆疊初始化工作結束後,OSTaskStkInit()返回新的堆疊棧頂指針,OSTaskCreate()或OSTaskCreateExt()將指針保存在任務的OS_TCB中。調用OSTaskStkInit()給任務做一個初始的任務上下文堆疊,形狀如圖3。

3.3 處理器相關部分彙編實現

整個uC/OS II移植實現中,只需要提供一個彙編語言檔案,提供幾個必須由彙編才能實現的函式。

a)OSStartHighRdy() 該函式在OSStart()多任務啟動之後,負責從最高優先權任務的TCB控制塊中獲得該任務的堆疊指針sp,通過sp依次將CPU現場恢復,此時系統就將控制權交給用戶創建的該任務的進程,直到該任務被阻塞或者被其他更高優先權的任務搶占了CPU。該函式僅僅在多任務啟動時被執行一次,用來啟動第一個,也就是最高優先權的任務執行。

b)OSCtxSw() 該函式是任務級的上下文切換函式,在任務因為被阻塞而主動請求與CPU調度時執行,主要工作是先將當前任務的CPU現場保存到該任務堆疊中,然後獲得最高優先權任務的堆疊指針,從該堆疊中恢復此任務的CPU現場,使之繼續執行,從而完成一次任務切換。

C)OSIntExit() 該函式是中斷級的任務切換函式,在時鐘中斷ISR中發現有高優先權任務在等待時,需要在中斷退出後不返回被中斷的任務,而是直接調度就緒的高優先權任務執行。其目的在於能夠儘快讓高優先權的任務得到回響,保證系統的實時性能。

d)OSTickISR() 該函式是時鐘中斷處理函式,主要任務是負責處理時鐘中斷,調用系統實現的OSTimeTick函式,如果有等待時鐘信號的高優先權任務,則需要在中斷級別上調度其執行。另外兩個相關函式是OSIntEnter()和OSIntExit(),都需要在ISR中執行。

測試

至此代碼移植過程已經完成,下一步工作就是測試。測試一個象uC/OS II一樣的多任務實時核心並不複雜,甚至可以在沒有應用程式的情況下測試。換句話說,就是讓這個實時核心在目標板上跑起來,讓核心自己測試自己。這樣做有兩個好處:第一,避免使本來就複雜的事情更加複雜;第二,如果出現問題,可以知道問題出在核心代碼上而不是應用程式。剛開始的時候可以運行一些簡單的任務和時鐘節拍中斷服務例程。一旦多任務調度成功地運行了,再添加應用程式的任務就是非常簡單的工作了。

結束語

採用基於ARM9的S3C2410嵌入式微處理,可以使系統具備高性能的運算能力的同時便於與各種外設連線擴展,簡化了硬體設計,維持小型化的同時降低了系統成本。uC/OS II作為一個原始碼公開的作業系統,在具體套用中穩定可靠,並且支持uIPTCP/IP協定棧、ucGUI等,可擴展性強,功能強大。本系統采ARM9+uC/OS II開發設計,具有精度高、運行穩定、實時性好、抗干擾能力強、性價比高的特點,可以在各種工業場合中廣泛套用,達到了設計的初衷 μC/OS-II作為一個嵌入式實時作業系統,自1992年以來,因其原始碼的完全公開和優越性能,已為眾多的愛好者和開發人員所了解並得到了廣泛套用。μC/OS-II是一個占先式核心,執行時間可確定(即函式的調用與服務的時間是可知的,不依賴於應用程式的大小),目前最多支持64個任務(8個為系統保留),總是執行處於就緒態的優先權最高的任務。51系列及其擴展型單片機仍在單片機套用系統占較大比重,因而詳細介紹μC/OS-II在AT89C51上的移植實現過程,解決移植過程中出現的問題,有很大的實用意義。

相關詞條

相關搜尋

熱門詞條

聯絡我們