我造輪子,你造車,創客一塊兒造起來!塔克創新資訊【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/ 】 程序員
簡單的小型系統設計通常是基於先後臺的或者無限循環的系統。包含一個無限循環的模塊實現須要的操做(後臺)。中斷處理程序實現異步事件(前臺)。前臺也叫作中斷級,後臺也叫做任務級。臨界操做應該在任務級中被執行,不可避免地必須在中斷處理程序中執行也要確保是在很短的時間內完成。由於這會致使ISR 佔用更長的時間。一般的,ISR 中使能相關的信息而在後臺程序中執行相應的操做。這叫作任務級響應。任務級響應的時間依賴於後臺循環一次所需的時間,一般這不是一個固定常量。另外,若是其中的代碼稍有改動,那麼循環一次所用的時間也將有所變化。 數據結構
大多數高產量低成本微控制器的應用軟件(例如微波爐,電話玩具等)都是基於先後臺系統的。 架構
實時內核是一個能管理MPU、MCU、DSP 時間和資源的軟件。實時內核的應用包括迅速地響應,可靠地完成工做的各個部分。任務(也叫作線程)是一段簡單的程序,運行時徹底地佔用CPU。 app
在單CPU 中,任什麼時候候只有1 個任務被執行。內核的責任是管理任務,也作多任務處理。多任務處理的做用是協調和切換多個任務依次享用CPU。多任務處理最大化CPU 的功能同時會讓咱們感受是多個CPU 在同時運行。多任務處理也有利於處理模塊化的應用。多任務處理一個最重要的方面在於它容許程序員管理複雜的實時應用。在多任務處理中程序員能夠簡單的維護和升級產品。 異步
uC/OS-III 是一個搶佔式內核,這意味着uC/OS-III 老是執行最重要的就緒任務,以下圖。 模塊化
uC/OS-III是一個可擴展的,可固化的,搶佔式的實時內核,它管理的任務個數不受限制。它是第三代內核,提供了現代實時內核所指望的全部功能包括資源管理、同步、內部任務交流等。uC/OS-III 也提供了不少特性是在其餘實時內核中所沒有的。好比能在運行時測量運行性能,直接得發送信號或消息給任務,任務能同時等待多個信號量和消息隊列。如下列出uC/OS-III 的特色: 函數
源代碼:uC/OS-III 徹底根據ANSI-C 標準寫的。代碼的規範是Micrium 團隊的一種文化。雖然不少商業內核供應商提供他們產品的源代碼,可是這些產品頗有多是笨重且難以利用的。除非代碼嚴格地遵循標準而且產品有完整的帶例子的說明書以展現代碼是怎樣工做的。經過這本書,你將會對uC/OS-III 內部的工做狀況有一個很深的瞭解。 oop
應用程序接口(API):uC/OS-III 是很直觀的。若是你熟悉相似的編碼規範,你能輕鬆地知道函數名所對應的服務,以及須要怎樣的參數。例如:指向對象的指針一般是第一個參數,指向錯誤代碼的指針一般是最後一個參數。 性能
搶佔式多任務處理:uC/OS-III 是一個搶佔式多任務處理內核,所以,uC/OS-III 正在運行的常常是最重要的就緒任務。 學習
時間片輪轉調度:uC/OS-III 容許多個任務擁有相同的優先級。當多個相同優先級的任務就緒時,而且這個優先級是目前最高的。uC/OS-III 會分配用戶定義的時間片給每一個任務去運行。每一個任務能夠定義不一樣的時間片。當任務用不完時間片時可讓出CPU 給另外一個任務。
快速響應中斷: uC/OS-III 有一些內部的數據結構和變量。uC/OS-III 保護臨界段能夠經過鎖定調度器代替關中斷。所以關中斷的時間會很是少。這樣就使uC/OS-III 能夠響應一些很是快的中斷源了。
肯定性的:uC/OS-III 的中斷響應時間是可肯定的,uC/OS-III 提供的大部分服務的執行時間也是可肯定的。
可擴展的:根據應用的需求,代碼大小能夠被調整。編譯時經過調整uC/OS-III 源代碼中的大約40 個#define(見OS_CFG.H)能夠在添加或移除一些功能。uC/OS-III 的服務還提供一些實時檢查功能。特別的,uC/OS-III 能檢傳遞的參數是否爲NULL 指針,ISR 是否就緒了任務級服務。參數有容許範圍,指定選項都是有用的。檢測功能能夠被關閉(在編譯時)以提供更好的性能和縮減代碼大小。實際上,可擴展的uC/OS-III 支持更普遍的應用和項目。
易移植的:uC/OS-III 能夠被移植到大部分的CPU 架構中。大部分的支持uC/OS-II 的器件經過改動就能支持uC/OS-III。而uC/OS-II已經移植到45 種CPU 架構中了。
可固化的:uC/OS-III 專爲嵌入式系統設計,它能夠跟應用程序代碼一塊兒被固化。
可實時配置的:uC/OS-III 容許用戶在運行時配置內核。特別的,全部的內核對象如任務、堆棧、信號量、事件標誌組、消息隊列、消息、互斥信號量、內存分區、軟件定時器等都是在運行時分配的,以避免在編譯時的過分分配。
任務數無限制:uC/OS-III 對任務數量無限制。實際上,任務的數量限制於處理器能提供的內存大小。每個任務須要有本身的堆棧空間,uC/OS-III 在運行時監控任務堆棧的生長。uC/OS-III 對任務的大小無限制。
優先級數無限制:uC/OS-III 對優先級的數量無限制。然而,配置uC/OS-III 的優先級在32 到256 之間已經知足大多數的應用了。
內核對象數無限制:uC/OS-III 支持任何數量的任務、信號量、互斥信號量、事件標誌組、消息隊列、軟件定時器、內存分區。用戶在運行時分配全部的內核對象。
服務:uC/OS-III 提供了高檔實時內核所須要的全部功能,例如任務管理、時間管理、信號量、事件標誌組、互斥信號量、消息隊列、軟件定時器、內存分區等。
互斥信號量(Mutexes):互斥信號量用於資源管理。它是一個內置優先級的特殊類型信號量,用於消除優先級反轉。互斥信號量能夠被嵌套,所以,任務可申請同一個互斥信號量多達250 次。固然,互斥信號量的佔有者須要釋放同等次數。
嵌套的任務中止:uC/OS-III 容許任務中止自身或者中止另外的任務。中止一個任務意味着這個任務將再也不執行直到被其餘的任務恢復。中止能夠被嵌套到250 級。換句話說,一個任務能夠中止另外的任務多達250 次。固然,這個任務必須被恢復同等次數纔有資格再次得到CPU。
軟件定時器:能夠定義任意數量的一次性的、週期性的、或者二者兼有的定時器。定時器是倒計時的,執行用戶定義的行爲一直到計數減爲0。每個定時器能夠有本身的行爲,若是一個定時器是週期性的,計數減爲0 時會自動重裝計數值並執行用戶定義的行爲。
掛起多個對象:uC/OS-III 容許任務等待多個事件的發生。特別的,任務能夠同時等待多個信號量和消息隊列被提交。等待中的任務在事件發生的時候被喚醒。
任務信號量:uC/OS-III 容許ISR 或者任務直接地發送信號量給其它任務。這樣就避免了必須產生一箇中間級內核對象如一個信號量或者事件標誌組只爲了標記一個任務。提升了內核性能。
任務消息:uC/OS-III 容許ISR 或者任務直接發送消息到另外一個任務。這樣就避免產生一個消息隊列,提升了內核性能。
任務寄存器:每個任務能夠擁有用戶可定義的任務寄存器,不一樣於CPU 寄存器。
錯誤檢測:uC/OS-III 能檢測指針是否爲NULL、在ISR 中調用的任務級服務是否容許、參數在容許範圍內、配置選項的有效性、函數的執行結果等。每個uC/OS-III 的API 函數返回一個對應於函數調用結果的錯誤代號。
內置的性能測量:uC/OS-III 有內置性能測量功能。能測量每個任務的執行時間,每一個任務的堆棧使用狀況,任務的執行次數,CPU的使用狀況,ISR 到任務的切換時間,任務到任務的切換時間,列表中的峯值數,關中斷、鎖調度器平均時間等。
可優化: uC/OS-III 被設計於可以根據CPU 的架構被優化。uC/OS-III 所用的大部分數據類型可以被改變,以更好地適應CPU 固有的字大小。優先級調度法則能夠經過編寫一些彙編語言而獲益於一些特殊的指令如位設置、位清除、計數清零指令(CLZ),find-first-one(FF1)指令。
死鎖預防:uC/OS-III 中全部的掛起服務均可以有時間限制,預防死鎖。
任務級的時基處理:uC/OS-III 有時基任務,時基ISR 觸發時基任務。uC/OS-III 使用了哈希列表結構,能夠大大減小處理延時和任務超時所產生的開支。
用戶可定義的鉤子函數:uC/OS-III 容許程序員定義hook 函數,hook 函數被uC/OS-III 調用。hook 函數容許用戶擴展uC/OS-III 的功能。有的hook 函數在任務切換的時候被調用,有的在任務建立的時候被調用,有的在任務刪除的時候被調用。
時間戳:爲了測量時間,uC/OS-III 須要一個16 位或者32 位的時時間戳計數器。這個計數器值能夠在運行時被讀取以測量時間。例如:當ISR 提交消息到任務時,時間戳計數器自動讀取並保存做爲消息。當接收者接收到這條消息,時間戳被提供在消息內。經過讀取如今的時間戳,消息的響應時間能夠被肯定。
嵌入的內核調試器:這個功能容許內核調試器查看uC/OS-III 的變量和數據結構經過一個用戶定義的通道。(可是隻能在調試器遇到斷點的時候查看)。uC/OS-III 內核也支持uC/Probe(探針)在運行時顯示信息。
對象名稱:每一個uC/OS-III 的內核對象有一個相關聯的名字。這樣就能很容易的識別出對象所指定的做用。分配一個ASCII 碼的名字給任務、信號量、互斥信號量、事件標誌組、消息隊列、內存塊、軟件定時器。對象的名字長度沒有限制,可是必須以空字符結束。
各版本對比
uC/OS-III的源碼已經跟前面版本的源碼相差很大,不少方面都作了更加規範的修改,建議沒有了解過uC/OS的用戶直接上手uC/OS-III,不要再學習uC/OS-II。
如今市面上講解uC/OS-III的書籍或資料大都基於《嵌入式實時操做系統 uC/OS-III》修改,想系統學習uC/OS-III的用戶,瞭解更多uC/OS-III細節,建議直接閱讀該書,講解很是全面。
uC/OS-III細節內容較多,須要通常專著講解,本教程旨在引導用戶使用uC/OS-III系統,包括將uC/OS-III移植X-CTR100控制器,並經過A、B、C三個任務設計經典RTOS應用例程,經過簡單的例程使用戶更容易學習uC/OS-III的使用。
本小節講解將uC/OS-III移植到X工程模板的過程。
uC/OS-III文件結構以下圖
①配置文件,經過定義這些文件裏宏的值能夠輕易地裁剪uC/OS-III 的功能。
②用戶應用文件,定義和聲明應用任務。
③內核服務文件,其代碼與 CPU 無關,能夠不作任何修改移植到任何CPU。
④底層函數庫,好比字符串的常規操做,經常使用的數學計算等等。
⑤CPU移植文件,用戶若是想要移植uC/OS-III到不一樣平臺上,須要修改這部分代碼。
⑥CPU 配置文件,主要是CPU的一些工做模式和服務函數。
⑦其餘CPU 相關文件。
配置文件
文件名 |
做用 |
lib_cfg.h |
uC/LIB配置文件,若是使用uC/LIB調用函數Mem_Init()初始化 |
os_cfg.h |
uC/OS相關函數配置 |
os_cfg.h |
內核任務配置(中斷管理,空閒/統計任務,定時器) |
app_cfg.h |
用戶任務配置 |
cpu_cfg.h |
uC/CPU相關配置 |
os_type.h |
變量類型定義 |
下載源碼
登錄Micrium公司官方網站(http://micrium.com/),下載源碼,本文使用uC/OS-III V3.04.04版本,資料裏面下載好的源碼,目錄結構以下圖,移植過程將從該源碼向X工程拷貝文件。
步驟一:建立文件夾,複製官方源碼對應文件夾到移植工程。
複製文件夾到移植工程uC-CPU、uC-LIB、uCOS-III文件夾
刪除不用的編譯器文件夾
複製以下文件到uCOS-APP
複製文件到uCOS-BSP
步驟二:修改工程配置。
以下圖添加工程目錄和文件,具體文件位置可根據文件名稱對應目錄查找。
添加時注意選擇All file,添加.h和.asm文件。
添加工程路徑
步驟三:修改工程文件
首先修改工程的啓動文件" startup_stm32f40xx.s"。
其中將PendSV_Handler 和SysTick_Handler 分別改成OS_CPU_PendSVHandler 和OS_CPU_SysTickHandler,共有兩處修改位置兩處。
初始化時,使能硬件浮點。
修改bsp.h,頭文件包括ax_basis.h基礎板載資源文件。
保留三個函數名稱。
修改bsp.c文件,BSP_Init()函數,調用AX_Init()初始化函數。
修改ax_basis.c文件,刪除滴答時鐘及延時函數部份內容,保留LED、BEEP、撥碼開關、串口操做內容,具體查看源文件。
修改app_cfg.h,該文件爲app配置文件,作以下修改。
修改app.c文件,該文件是應用程序文件,main()函數位於該文件,包括uC/OS-III系統初始化和初始任務建立。
int main(void) { OS_ERR err;
OSInit(&err); /* Init uC/OS-III. */
OSTaskCreate((OS_TCB *)&AppTaskStartTCB, /* Create the start task */ (CPU_CHAR *)"App Task Start", (OS_TASK_PTR)AppTaskStart, (void *)0, (OS_PRIO)APP_TASK_START_PRIO, (CPU_STK *)&AppTaskStartStk[0], (CPU_STK_SIZE)APP_TASK_START_STK_SIZE / 10, (CPU_STK_SIZE)APP_TASK_START_STK_SIZE, (OS_MSG_QTY)5u, (OS_TICK)0u, (void *)0, (OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err);
OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */
}
static void AppTaskStart(void *p_arg) { OS_ERR err;
(void)p_arg;
CPU_Init();
/* Initialize BSP functions */ BSP_Init(); BSP_Tick_Init(); //Configure and Initialize the OS Tick Services (SysTick).
Mem_Init(); //Initialize Memory Management Module
#if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */ #endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN CPU_IntDisMeasMaxCurReset(); #endif
/* Task body, always written as an infinite loop. */ while (1) { AX_LEDG_Toggle(); OSTimeDly(500, OS_OPT_TIME_DLY, &err); } } |
開始任務循環體,每隔0.5S翻轉綠色LED燈,以便觀察系統啓動狀況。
至此,移植完成,編譯後下載到X-CTR100,系統運行正常,綠色LED燈閃爍。
曾鳴等,《嵌入式實時操做系統 uC/OS-III》
秉火《uCOS-III 應用開發指南》
正點原子《STM32F4 UCOS開發手冊_V3.0》
屈環宇 譯《uC/OS-III手冊中文翻譯》