複製鏈接
請複製以下鏈接發送給好友

μC/OS-II

鎖定
μC/OS-II 是一種基於優先級搶佔式多任務實時操作系統,包含了實時內核、任務管理、時間管理、任務間通信同步(信號量,郵箱,消息 隊列)和內存管理等功能。它可以使各個任務獨立工作,互不干涉,很容易實現準時而且無誤執行,使實時應用程序的設計和擴展變得容易,使應用程序的設計過程大為減化。
μC /OS-II是一個完整的、可移植、可固化、可裁剪的搶佔式實時多任務內核。μC/OS-II絕大部分的代碼是用ANSII的C語言編寫的,包含一小部分彙編代碼,使之可供不同架構的微處理器使用。從8位到64位,μC/OS-II已在超過40種不同架構上的微處理器上運行。μC/OS-II已經在世界範圍內得到廣泛應用,包括很多領域, 如手機、路由器集線器不間斷電源、飛行器、醫療設備及工業控制上。實際上,μC/OS-II已經通過了非常嚴格的測試,並且得到了美國航空管 理局(Federal Aviation Administration)的認證,可以用在飛行器上。這説明μC/OS-II是穩定可靠的,可用於與人性命攸關的安全緊要(safety critical)系統。除此以外,μC/OS-II 的鮮明特點就是源碼公開,便於移植和維護。
中文名
μC/OS-II
外文名
基於優先級的搶佔式多任務
意    思
基於優先級的搶佔式多任務
分    類
任務類消息類同步類

μC/OS-II內核結構

多任務系統中,內核負責管理各個任務,或者説為每個任務分配CPU 時間,並且負責任務之間的通訊。內核提供的基本服務是任務切換。μC/OS-II可以管理多達64個任務。由於它的作者佔用和保留了8個任務,所以留給用户應用程序最多可有56個任務。賦予各個任務的優先級必須是不相同的。這意味着μC/OS-II不支持時間片輪轉調度法(round-robin scheduli ng)。μC/OS-II為每個任務設置獨立的堆棧空間,可以快速實現任務切換 。μC/OS-II近似地每時每刻總是讓優先級最高的就緒任務處於運行狀態,為了保證這一點,它在調用系統API 函數、中斷結束、定時中斷結束時總是執行調度算法,μC/OS-II通過事先計算好數據簡化了運算量,通過精心設計就緒表結構使得延時可預知。

μC/OS-II主要特點

1、源代碼:µC/OS-II全部以源代碼的方式提供給使用者(約5500行)。該源碼清晰易讀,結構協調,且註解詳盡,組織有序;
2、可移植(portable): µC/OS-II的源代碼絕大部分是用移植性很強的ANSI C寫的,與微處理器硬件相關的部分是用彙編語言寫的。µC/OS-II可以移植到許許多多不同的微處理器上,條件是:該微處理器具有堆棧指針,具有CPU內部寄存器入棧、出棧指令,使用的C編譯器必須支持內嵌彙編,或者該C語言可擴展和可鏈接彙編模塊,使得關中斷和開中斷能在C語言程序中實現;
3、可固化(ROMable): µC/OS-II是為嵌入式應用而設計的,意味着只要具備合適的系列軟件工具(C編譯、彙編、鏈接以及下載/固化)就可以將µC/OS-II嵌入到產品中作為產品的一部分;
4、可裁減(scalable): 可以只使用µC/OS-II中應用程序需要的系統服務。可裁減性是靠條件編譯實現的,只需要在用户的應用程序中定義那些µC/OS-II中的功能應用程序需要的部分就可以了;
5、可搶佔性(preemptive): µC/OS-II是完全可搶佔型的實時內核,即µC/OS-II總是運行就緒條件下優先級最高的任務;
6、多任務: µC/OS-II可以管理64個任務。賦予每個任務的優先級必須是不相同的,這就是説µC/OS-II不支持時間片輪轉調度法(該調度法適用於調度優先級平等的任務);
7、可確定性: 絕大多數µC/OS-II的函數調用和服務的執行時間具有可確定性。也就是説用户能知道µC/OS-II的函數調用與服務執行了多長時間。進而可以説,除了函數OSTimeTick()和某些事件標誌服務,µC/OS-II系統服務的執行時間不依賴於用户應用程序任務數目的多少;
8、任務棧: 每個任務都有自己單獨的棧。µC/OS-II允許每個任務有不同的棧空間,以便降低應用程序對RAM的需求;
9、系統服務: µC/OS-II提供許多系統服務,比如信號量、互斥信號量、事件標誌、消息郵箱消息隊列、時間管理等等;
10、中斷管理: 中斷可以使正在執行的任務暫時掛起。如果優先級更高的任務被該中斷喚醒,則高優先級的任務在中斷嵌套全部退出後立即執行,中斷嵌套層數可以達255層;
11、穩定性和可靠性: µC/OS-II的每一種功能、每一個函數以及每一行代碼都經過了考驗和測試,具有足夠的安全性與穩定性,能用於與人性命攸關、安全性條件極為苛刻的系統中。

μC/OS-IIμCOS-II API 介紹

任何一個操作系統都會提供大量的API供程序員使用,μC/OS-II 也不例外。由於μC/OS-II 面向的是嵌入式開發,並不要求大而全,所以內核提供的API也就大多和多任務息息相關。主要有以下幾類:
1)任務類
2)消息類
3)同步類
4)時間類
5)臨界區與事件類
初級程序員而言,任務類和事件類是必須要首先掌握的兩種API。

μC/OS-II實驗內容簡介

μC/OS-II任務管理實驗

此實驗的目的是讓讀者理解嵌入式操作系統中任務管理的基本原理,瞭解任務的各個基本狀態及其變遷過程;掌握µC/OS-II中任務管理的基本方法(創建、啓動、掛起和解掛任務);熟練使用µC/OS-II任務管理的基本系統調用

μC/OS-II優先級反轉實驗

通過此實驗讀者可以瞭解在基於搶佔式嵌入式實時操作系統並有共享資源的應用中,出現優先級反轉現象的原理。優先級反轉發生在有多個任務共享資源的情況下,高優先級任務被低優先級任務阻塞,並等待低優先級任務執行的現象。

μC/OS-II優先級繼承實驗

通過此實驗讀者可以瞭解嵌入式實時操作系統µC/OS-II解決優先級反轉的策略——優先級繼承的原理,以此解決低優先級任務在佔用了共享資源的情況下,被高優先級任務搶佔了CPU使用權而導致的優先級反轉的問題。

μC/OS-II哲學家就餐實驗

通過經典的哲學家就餐應用,讀者可以瞭解如何利用嵌入式實時操作系統µC/OS-II的信號量機制來對共享資源進行互斥訪問。

μC/OS-II內存管理實驗

通過此實驗讀者可以瞭解嵌入式實時操作系統µC/OS-II中的內存管理的原理,包括對內存的分配和回收。

μC/OS-II時鐘中斷實驗

通過此實驗讀者可以瞭解嵌入式實時操作系統µC/OS-II中,時鐘中斷的使用情況。

μC/OS-II消息隊列實驗

通過此實驗讀者可以瞭解嵌入式實時操作系統µC/OS-II中的消息隊列機制。讀者可以瞭解一個應用中的任務是如何進行通信的,如何能使它們相互協調工作。

μC/OS-IIμCOS-Ⅱ中的任務描述

一個任務通常是一個無限的循環,由於任務的執行是操作系統內核調度的,因此任務是絕不會返回的,其返回參數必須定義成void。在μC/OS-Ⅱ中,當一個運行着的任務使一個比它優先級高的任務進入了就緒態,當前任務的CPU使用權就會被搶佔,高優先級任務會立刻得到CPU的控制權(在系統允許調度和任務切換的前提下)。μC/OS-Ⅱ可以管理多達64個任務,版本的μC/OS-Ⅱ有兩個任務已經被系統佔用了(即空閒任務和統計任務)。必須給每個任務賦以不同的優先級,任務的優先級號就是任務編號(ID),優先級可以從0到OS_LOWEST_PR10-2。優先級號越低,任務的優先級越高。μC/OS-Ⅱ總是運行進入就緒態的優先級最高的任務。

μC/OS-II配置手冊

本章將介紹μC/OS-II中的初始化配置項。由於μC/OS-II向用户提供源代碼,初始化配置項由一系列#define constant語句構成,都在文件OS_CFG.H中。用户的工程文件組中都應該包含這個文件。
本節介紹每個用#define constant定義的常量,介紹的順序和它們在OS_CFG.H中出現的順序是相同的。表12.1列出了常量控制的μC/OS-II函數。“類型”為函數所屬的類型,“置1”表示當定義常量為1時可以打開相應的函數,“其他常量”為與這個函數有關的其他控制常量。
注意編譯工程文件時要包含OS_CFG.H,使定義的常量生效。

μC/OS-II雜相

OSInit()無OS_MAX_EVENTS
OS_Q_EN and OS_MAX_QS
OS_MEM_EN
OS_TASK_IDLE_STK_SIZE
OS_TASK_STAT_EN
OS_TASK_STAT_STK_SIZE
OSSchedLock()無無
OSSchedUnlock()無無
OSStart()無無
OSStatInit()OS_TASK_STAT_EN &&
OS_TASK_CREATE_EXT_ENOS_TICKS_PER_SEC
OSVersion()無無

μC/OS-II中斷處理

OSIntEnter()無無
OSIntExit()無無

μC/OS-II消息郵箱

OSMboxAccept()OS_MBOX_EN無
OSMboxCreate()OS_MBOX_ENOS_MAX_EVENTS
OSMboxPend()OS_MBOX_EN無
OSMboxPost()OS_MBOX_EN無
OSMboxQuery()OS_MBOX_EN無

μC/OS-II內存塊管理

OSMemCreate()OS_MEM_ENOS_MAX_MEM_PART
OSMemGet()OS_MEM_EN無
OSMemPut()OS_MEM_EN無
OSMemQuery()OS_MEM_EN無

μC/OS-II消息隊列

OSQAccept()OS_Q_EN無
OSQCreate()OS_Q_ENOS_MAX_EVENTS
OS_MAX_QS
OSQFlush()OS_Q_EN無
OSQPend()OS_Q_EN無
OSQPost()OS_Q_EN無
OSQPostFront()OS_Q_EN無
OSQQuery()OS_Q_EN無

μC/OS-II信號量管理

OSSemAccept()OS_SEM_EN無
OSSemCreate()OS_SEM_ENOS_MAX_EVENTS
OSSemPend()OS_SEM_EN無
OSSemPost()OS_SEM_EN無
OSSemQuery()OS_SEM_EN無

μC/OS-II任務管理

OSTaskChangePrio()OS_TASK_CHANGE_PRIO_ENOS_LOWEST_PRIO
OSTaskCreate()OS_TASK_CREATE_ENOS_MAX_TASKS
OS_LOWEST_PRIO
OSTaskCreateExt()OS_TASK_CREATE_EXT_ENOS_MAX_TASKS
OS_STK_GROWTH
OS_LOWEST_PRIO
OSTaskDel()OS_TASK_DEL_ENOS_LOWEST_PRIO
OSTaskDelReq()OS_TASK_DEL_ENOS_LOWEST_PRIO
OSTaskResume()OS_TASK_SUSPEND_ENOS_LOWEST_PRIO
OSTaskStkChk()OS_TASK_CREATE_EXT_ENOS_LOWEST_PRIO
OSTaskSuspend()OS_TASK_SUSPEND_ENOS_LOWEST_PRIO
OSTaskQuery()OS_LOWEST_PRIO

μC/OS-II時鐘管理

OSTimeDly()無無
OSTimeDlyHMSM()無OS_TICKS_PER_SEC
OSTimeDlyResume()無OS_LOWEST_PRIO
OSTimeGet()無無
OSTimeSet()無無
OSTimeTick()無無

μC/OS-II用户定義函數

OSTaskCreateHook()OS_CPU_HOOKS_EN無
OSTaskDelHook()OS_CPU_HOOKS_EN無
OSTaskStatHook()OS_CPU_HOOKS_EN無
OSTaskSwHook()OS_CPU_HOOKS_EN無
OSTimeTickHook()OS_CPU_HOOKS_EN無

μC/OS-IIOS_MAX_EVENTS

OS_MAX_EVENTS定義系統中最大的事件控制塊的數量。系統中的每一個消息郵箱消息隊列信號量都需要一個事件控制塊。例如,系統中有10個消息郵箱,5個消息隊列,3個信號量,則OS_MAX_EVENTS最小應該為18。只要程序中用到了消息郵箱,消息隊列或是信號量,則OS_MAX_EVENTS最小應該設置為2。

μC/OS-IIOS_MAX_MEM_PARTS

OS_MAX_MEM_PARTS定義系統中最大的內存塊數,內存塊將由內存管理函數操作(定義在文件OS_MEM.C中)。如果要使用內存塊,OS_MAX_MEM_PARTS最小應該設置為2,常量OS_MEM_EN也要同時置1。

μC/OS-IIOS_MAX_QS

OS_MAX_QS定義系統中最大的消息隊列數。要使用消息隊列,常量OS_Q_EN也要同時置1。如果要使用消息隊列,OS_MAX_ QS最小應該設置為2。

μC/OS-IIOS_MAX_TASKS

OS_MAX_MEM_TASKS定義用户程序中最大的任務數。OS_MAX_MEM_TASKS不能大於62,這是由於μC/OS-II保留了兩個系統使用的任務。如果設定OS_MAX_MEM_TASKS剛好等於所需任務數,則建立新任務時要注意檢查是否超過限定。而OS_MAX_MEM_TASKS設定的太大則會浪費內存。
OS_LOWEST_PRIO
OS_LOWEST_PRIO設定系統中的任務最低優先級(最大優先級數)。設定OS_LOWEST_PRIO可以節省用於任務控制塊的內存。μC/OS-II中優先級數從0(最高優先級)到63(最低優先級)。設定OS_LOWEST_PRIO小於63意味着不會建立優先級數大於OS_LOWEST_PRIO的任務。μC/OS-II中保留兩個優先級系統自用:OS_LOWEST_PRIO和OS_LOWEST_PRIO-1。其中OS_LOWEST_PRIO留給系統的空閒任務(Idle task)(OSTaskIdle())。OS_LOWEST_PRIO-1留給統計任務(OSTaskStat())。用户任務的優先級可以從0到OS_LOWEST_PRIO-2。OS_LOWEST_PRIO和OS_MAX_TASKS之間沒有什麼關係。例如,可以設OS_MAX_TASKS為10而OS_LOWEST_PRIO為32。此時系統最多可有10個任務,用户任務的優先級可以是0到30。當然,OS_LOWEST_PRIO設定的優先級也要夠用,例如設OS_MAX_TASKS為20,而OS_LOWEST_PRIO為10,優先級就不夠用了。

μC/OS-IIOS_TASK_

OS_TASK_IDLE_STK_SIZE設置μC/OS-II中空閒任務(Idle task)堆棧的容量。注意堆棧容量的單位不是字節,而是OS_STK(μC/OS-II中堆棧統一用OS_STK聲明,會根據不同的硬件環境,OS_STK可為不同的長度----譯者注)。空閒任務堆棧的容量取決於所使用的處理器,以及預期的最大中斷嵌套數。雖然空閒任務幾乎不做什麼工作,但還是要預留足夠的堆棧空間保存CPU寄存器的內容,以及可能出現的中斷嵌套情況。

μC/OS-IIOS_TASK_STAT_EN

OS_TASK_STAT_EN設定系統是否使用μC/OS-II中的統計任務(statistic task)及其初始化函數。如果設為1,則使用統計任務OSTaskStat()。統計任務每秒運行一次,計算當前系統CPU使用率,結果保存在8位變量OSCPUUsage中。每次運行,OSTaskStat()都將調用OSTaskStatHook()函數,用户自定義的統計功能可以放在這個函數中。詳細情況請參考OS_CORE.C文件。統計任務OSTaskStat()的優先級總是設為OS_LOWEST_PRIO-1。
當OS_TASK_STAT_EN設為0的時候,全局變量OSCPUUsage,OSIdleCtrMax,OSIdleCtrRun和OSStatRdy都不聲明,以節省內存空間。

μC/OS-IIOS_TASK_STAT_

OS_TASK_STAT_STK_SIZE設置μC/OS-II中統計任務(statistic task)堆棧的容量。統計任務堆棧的容量取決於所使用的處理器類型,以及如下的操作:
進行32位算術運算所需的堆棧空間。
調用OSTimeDly()所需的堆棧空間。
調用OSTaskStatHook()所需的堆棧空間。
預計最大的中斷嵌套數。
如果想在統計任務中進行堆棧檢查,判斷實際的堆棧使用,用户需要設OS_TASK_CREATE_EXT_EN為1,並使用OSTaskCreateExt()函數建立任務。

μC/OS-IIOS_CPU_HOOKS_EN

此常量設定是否在文件OS_CPU_C.C中聲明對外接口函數(hook function),設為1為聲明。μC/OS-II中提供了5個對外接口函數,可以在文件OS_CPU_C.C中聲明,也可以在用户自己的代碼中聲明:
OSTaskCreateHook()
OSTaskDelHook()
OSTaskStatHook()
OSTaskSwHook()
OSTimeTickHook()

μC/OS-IIOS_MBOX_EN

OS_MBOX_EN控制是否使用μC/OS-II中的消息郵箱函數及其相關數據結構,設為1為使用。如果不使用,則關閉此常量節省內存。

μC/OS-IIOS_MEM_EN

OS_MEM_EN控制是否使用μC/OS-II中的內存塊管理函數及其相關數據結構,設為1為使用。如果不使用,則關閉此常量節省內存。

μC/OS-IIOS_Q_EN

OS_Q_EN控制是否使用μC/OS-II中的消息隊列函數及其相關數據結構,設為1為使用。如果不使用,則關閉此常量節省內存。如果OS_Q_EN設為0,則語句#define constant OS_MAX_QS無效。

μC/OS-IIOS_SEM_EN

OS_SEM_EN控制是否使用μC/OS-II中的信號量管理函數及其相關數據結構,設為1為使用。如果不使用,則關閉此常量節省內存。

μC/OS-IIOS_TASK_CHANGE_

此常量控制是否使用μC/OS-II中的OSTaskChangePrio()函數,設為1為使用。如果在應用程序中不需要改變運行任務的優先級,則將此常量設為0節省內存。

μC/OS-IIOS_TASK_CREATE_EN

此常量控制是否使用μC/OS-II中的OSTaskCreate()函數,設為1為使用。在μC/OS-II中推薦用户使用OSTaskCreateExt()函數建立任務。如果不使用OSTaskCreate()函數,將OS_TASK_CREATE_EN設為0可以節省內存。注意OS_TASK_CREATE_EN和OS_TASK_CREATE_EXT_EN至少有一個要為1,當然如果都使用也可以。

μC/OS-IIOS_TASK_

此常量控制是否使用μC/OS-II中的OSTaskCreateExt()函數,設為1為使用。該函數為擴展的,功能更全的任務建立函數。如果不使用該函數,將OS_TASK_CREATE_EXT_EN設為0可以節省內存。注意,如果要使用堆棧檢查函數OSTaskStkChk(),則必須用OSTaskCreateExt()建立任務。

μC/OS-IIOS_TASK_DEL_EN

此常量控制是否使用μC/OS-II中的OSTaskDel()函數,設為1為使用。如果在應用程序中不使用刪除任務函數,將OS_TASK_DEL_EN設為0可以節省內存。

μC/OS-IIOS_TASK_

此常量控制是否使用μC/OS-II中的OSTaskSuspend()和OSTaskResume()函數,設為1為使用。如果在應用程序中不使用任務掛起-喚醒函數,將OS_TASK_SUSPEND_EN設為0可以節省內存。

μC/OS-IIOS_TICKS_PER_SEC

此常量標識調用OSTimeTick()函數的頻率。用户需要在自己的初始化程序中保證OSTimeTick()按所設定的頻率調用(即系統硬件定時器中斷髮生的頻率----譯者注)。在函數OSStatInit(),OSTaskStat()和OSTimeDlyHMSM()中都會用到OS_TICKS_PER_SEC。