譯者序
很高興終于完成了 uC/OS-III 嵌入式系統的翻譯,翻譯從 2011 年10 月 15 日開始到 2011 年 11 月 3 日為止 , 共 20 天時間 , 平均每天 5個小時。本想將 uC/OS-III 函數的 API 部分也翻譯的,但畢竟考研更甚于愛好,我得為 2013 年 1 月的考研做準備呀 ~~ 。
在此,我要感謝:
1 、 我的導師:樂教授。是您經常帶我去公司拓展視野,并讓我堅定不移地往嵌入式方面發展。
2 、 我的師傅:張博士。是您無償提供給我一些開發板,作為回報,幫您的店鋪宣傳一下as-robot
3 、 還有我的親朋好友們。
特別是今天上午,用了 3 小時終于在 MDK4.0 編譯器上 將uC/OS-III 移植到 stm32f103rb 處理器上,并成功運行。移植的步驟 ,我也會發布到網上的,謝謝大家。
序言
什么是 uC/OS-III?
uC/OS-III(Micro C OS Three 微型的 C 語言編寫的操作系統第 3版 ) 是一個可升級的,可固化的,基于優先級的實時內核。它對任務的個數無限制。 uC/OS-III 是一個第 3 代的系統內核,支持現代的實時內核所期待的大部分功能 。 例如資源管理 , 同步 , 任務間的通信等等。然而, uC/OS-III 提供的特色功能在其它的實時內核中是找不到的 , 比如說完備的運行時間測量性能 , 直接地發送信號或者消息到任務,任務可以同時等待多個內核對象等。為什么命名一個新的版本?
uC/OS 系列,第一代產生于 1992 。經過了多年的使用和上千人的反饋,已經產生了很多的進化版本。
uC/OS-III 是這些反饋和經驗的總結。在 uC/OS-II 中很少使用的功能已經被刪除或者被更新 , 添加了更高效的功能和服務 。 其中最有用的功能應該是時間片輪轉法( round robin), 這個是 uC/OS-II 中不支持的,但是現在已經是 uC/OS-III 的一個功能了。uC/OS-III 會提供新的功能以更好地適應新出現的處理器。特別的, uC/OS-III 被設計用于 32 位處理器,但是它也能在 16 位或 8 位處理器中很好地工作。
uC/OS-III 的目標
uC/OS-III 最主要的目標是提供一流的實時內核以適應更新很快的嵌入式產品。使用像 uC/OS-III 那樣具有雄厚的基礎和穩定的框架的商業實時內核,能夠幫助設計師們處理日益復雜的嵌入式設計。這本書中的目標 , 是為了介紹 uC/OS-III 的內部工作 。 了解這些會幫助讀者實現邏輯上的設計方案 , 協調統一硬件和軟件會讓你對整體的設計很有把握。
1 、簡介
在重要的地方,實時系統憑借其系統性的計算和及時的處理能力工作著。一共有 2 種類型的實時系統:軟實時系統和硬實時系統。軟實時系統和硬實時系統的區別在于一旦沒有在規定的時間內完成任務所導致后果的嚴重性 。 超過時限后所得到的結果即使正確也可能是毫無作用的。
硬實時系統中,運算超時是不允許發生的。在很多情況下,超時會導致巨大的災難,會威脅人們的生命安全。但是在軟實時系統中 ,超時不會導致嚴重后果。
實時系統的應用范圍很廣,但很多實時系統是嵌入式的。一個嵌入式系統是計算機中添加操作系統,但是用戶不公認這是個計算機 。以下列出嵌入式系統的一些例子
實時系統的設計,調試和配置比非實時系統難得多。
1-1 前后臺系統 前后臺系統 前后臺系統 前后臺系統簡單的小型系統設計一般是基于前后臺的或者無限循環的系統。包含一個無限循環的模塊實現需要的操作(后臺 ) 。中斷處理程序實現異步事件(前臺 ) 。前臺也叫做中斷級,后臺也叫作任務級。臨界操作應該在任務級中被執行,不可避免地必須在中斷處理程序中執行也要確保是在很短的時間內完成 。 因為這會導致 ISR 占用更長的時間 。 通常的 , ISR 中使能相關的信息而在后臺程序中執行相應的操作 。 這叫做任務級響應 。 任務級響應的時間依賴于后臺循環一次所需的時間 , 通常這不是一個固定常量 。 另外 , 如果其中的代碼稍有改動,那么循環一次所用的時間也將有所變化。
大多數高產量低成本微控制器的應用軟件 ( 例如微波爐 , 電話玩具等)都是基于前后臺系統的。
1-2 實時內核
實時內核是一個能管理 MPU 、 MCU 、 DSP 時間和資源的軟件。
實時內核的應用包括迅速地響應,可靠地完成工作的各個部分。
任務(也叫做線程)是一段簡單的程序,運行時完全地占用 CPU 。在單 CPU 中,任何時候只有 1 個任務被執行。
內核的責任是管理任務 , 也做多任務處理 。 多任務處理的作用是協調和切換多個任務依次享用 CPU 。多任務處理最大化 CPU 的功能同時會讓我們感覺是多個 CPU 在同時運行。多任務處理也有利于處理模塊化的應用 。 多任務處理一個最重要的方面在于它允許程序員管
理復雜的實時應用 。 在多任務處理中程序員可以簡單的維護和升級產品。
uC/OS-III 是一個搶占式內核 , 這意味著 uC/OS-III 總是執行最重要的就緒任務,如圖 1-2 。
F1-2 ( 1 ) 一個低優先級的任務正在被執行
F1-2 ( 2 )發生一個中斷, CPU 轉向 ISR
F1-2 ( 3 ) ISR 響應中斷請求設備 , 但是 ISR 只做非常少的工作 。 ISR應該標記或發送消息到一個高優先級的任務 , 讓中斷能夠快速處理完畢 。 例如 , 如果一個中斷來自于以太網控制器 , ISR 標記任務 , 在任務級響應以太網控制器。
F1-2 ( 4 ) 當 ISR 執行完畢 , uC/OS-III 注意到 ISR 創建的一個更高優先級的任務就緒。 uC/OS-III 將不會返回到中斷前的任務,它會切換到這個更高優先級的任務。
F1-2 ( 5 )高優先級任務執行必要的處理答復中斷請求設備。
F1-2 ( 6 )當高優先級任務完成時,返回原任務中斷前的代碼。
F1-2 ( 7 )原任務在它被中斷的地方開始執行。
uC/OS-III 內核也負責管理任務間的交流,系統的資源(內存 和I/O ) 。
系統中加入內核需要額外的支出,因為內核提供服務時需要時間去處理 。 大多數的額外支出取決于服務的調用頻繁度 。 在一個優秀的設計中,內核占用 CPU 的時間介于 2% 到 4% 之間。因為 uC/OS-II I是一個軟件,添加到目標系統中需要額外的 ROM 和 RAM 。低檔的單片機很有可能不支持像 uC/OS-III 那樣的實時內核 , 因為它只有很少的 RAM 可供訪問。 uC/OS-III 內核需要 1K 到 4K 之間 的RAM , 加上每個任務自己所需的堆棧空間 。 至少有 4K 大小 RAM 的處理器才有可能成功移植 uC/OS-III 。
最后,為了更好地使用 CPU , uC/OS-III 提供了大約 70 種常用的服務。當用過像 uC/OS-III 那樣的具有實時內核的系統后,你將不會再去使用前后臺系統了。
1-3 實時系統 RTOS
一個實時系統通常包括一個實時內核以及其他高級的服務 , 例如 :文件管理 , 堆棧協議 , 圖形用戶接口等等 。 大多數服務都是跟 I/O 有關的。Micrium 提供了 RTOS 一套完整的組件 , 包括 uC/FS 、 uC/TCP-IP 、uC/GUI 、 uC/USB 等 。 這些組件大部分都可以單獨執除了 uC/TCP-IP 。實時內核在應用中不是必須的 。 事實上 , 用戶可以單獨選擇您的應用所需用的組件。詳情和購買請聯系 Micrium 。
1-4 uC/OS-III
uC/OS-III 是一個可擴展的 , 可固化的 , 搶占式的實時內核 , 它管理的任務個數不受限制 。 它是第三代內核 , 提供了現代實時內核所期望的所有功能包括資源管理、同步、內部任務交流等。 uC/OS-III 也提供了很多特性是在其他實時內核中所沒有的 。 比如能在運行時測量運行性能 , 直接得發送信號或消息給任務 , 任務能同時等待多個信號量和消息隊列。
以下列出 uC/OS-III 的特點:
源代碼 : uC/OS-III 完全根據 ANSI-C 標準寫的。代碼的規范 是Micrium 團隊的一種文化 。 雖然很多商業內核供應商提供他們產品的源代碼 , 但是這些產品很有可能是笨重且難以利用的 。 除非代碼嚴格地遵循標準并且產品有完整的帶例子的說明書以展示代碼是怎樣工作的。通過這本書,你將會對 uC/OS-III 內部的工作情況有一個很深的了解。應用程序接口 ( 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-II I 源代碼中的大 約 4 0 個 #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-I I已經移植到 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 Mutexes Mutexes 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 有內置性能測量功能 。 能測量每一個任務的執行時間 , 每個任務的堆棧使用情況,任務的執行次數, CP U的使用情況 , 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 碼的名字給任務 、 信號量 、 互斥信號量 、 事件標志組 、 消息隊列 、 內存塊 、 軟件定時器。對象的名字長度沒有限制,但是必須以空字符結束。
完整的pdf格式文檔51黑下載地址(共316頁):
uCOS-III中文說明文檔.pdf
(5.31 MB, 下載次數: 907)
2018-4-26 08:36 上傳
點擊文件名下載附件
|