本書主要介紹基于Cortex—M微控制器的μC/OS—Ⅱ嵌入式系統設計,內容包括:實時操作系統內核基礎、任務管理、任務調度、系統啟動與初始化、中斷和時間管理、事件管理、消息管理、內存管理、移植方式及其在Cortex—M微控制器上的移植方法。后對輕量級TCP/IP—μC/TCP—IP協議棧設計進行概要介紹。
從20世紀70年代單片機出現起,隨著各式各樣的嵌入式微處理器、微控制器的大規模使用,嵌入式系統已經廣泛應用于消費電子、有線、移動通信、汽車、醫療、工業控制、航空航天以及國防等領域的民用和軍用電子設備中。在當前嵌入式芯片市場上,ARM芯片是嵌入式微處理器中的佼佼者,是很多數字電子產品的核心。ARM處理器的優勢就在于體積小、功耗低、價格低廉,并且還能提供優異的性能,確實是眾多嵌入式設備的首選。ARM將在低端微控制器市場逐步取代傳統的8位/16位單片機。其中ARM的Coretex-M系列是經過優化的專門針對低端控制應用的處理器核,與傳統的單片機相比,它的處理能力更加優秀,并且其價格還非常便宜。
芯片處理能力的提高能夠將嵌入式操作系統應用于嵌入式系統設計,μC/OS-Ⅱ很適合開發那些對系統要求不是很苛刻,且RAM和ROM有限的Coretex-M系列處理器。μC/OS-Ⅱ是在μC-OS的基礎上發展起來的,是美國嵌入式系統專家Jean J.Labrosse用C語言編寫的一個結構小巧、搶占式的多任務實時內核。μC/OS-Ⅱ能管理256個任務,并提供任務調度與管理、內存管理、任務間同步與通信、時間管理和中斷服務等功能,具有執行效率高、占用空間小、實時性能優良和可擴展性強等特點。μC/OS-Ⅱ是一個結構簡單、功能完備和實時性很強的嵌入式操作系統內核,適合于廣大的嵌入式系統開發人員和愛好者入門學習,以及供高校教學和科研。本書以介紹嵌入式系統開發的核心——嵌入式實時操作系統μC/OS-Ⅱ為重點,并結合具體實驗例程,有助于讀者深入理解和掌握嵌入式實時操作系統,內容涵蓋了嵌入式實時操作系統的相關領域。
本書力求全面、實用,并對例題做出了詳細的分析和解釋,這樣既可以幫助讀者學習理解知識和概念,降低學習難度,又具有啟發性,幫助讀者更加輕松、迅速地理解和掌握本書內容。
本書由11章組成,各章具體內容如下:
第1章主要對嵌入式實時操作系統進行概述,介紹嵌入式實時操作系統概念、體系結構、功能及特點、發展趨勢以及嵌入式實時操作系統的實時性和可靠性等概念,并且講解制約實時性的幾個約束條件。最后對TI公司推出的用于開發DSP的集成開發環境CCS(Code Composer Studio)進行介紹,以便為后續調試程序做準備。
第2章介紹了嵌入式硬件系統的組成、主流的嵌入式微處理器ARM系列和MIPS系列、總線、嵌入式系統存儲器結構及輸入/輸出接口和設備。本章還對ARM的體系結構和基于ARM v7體系結構的Cortex-M4處理器進行了詳細介紹。
第3章介紹了嵌入式實時內核的基礎知識,主要從三個方面進行了介紹。首先在內核概要部分,重點闡述了μC/OS-Ⅱ內核的相關特點,具體涉及微內核、多任務操作系統等相關概念。接著具體介紹內核的主要功能,其中包括任務管理、同步與通信管理、中斷管理、時間管理、對共享資源的互斥管理、內存管理、I/O管理、出錯管理、用戶擴展管理、電源管理共10種主要功能,其中同步與通信管理又涉及信號量、互斥信號量、事件標志組、消息郵箱和消息隊列等多種機制,這些機制高效全面地實現了任務與任務、任務與中斷服務程序之間的同步與通信功能。最后主要對內核的性能指標進行了闡述,國際上常見的實時操作系統有很多,例如VxWorks、μC/OS-Ⅱ等不同內核的實時操作系統。因此要評價這些操作系統的好壞,應重點對實時性進行評價。
第4章主要對任務的存儲結構進行介紹,其中包括任務代碼、任務控制塊和任務堆棧。任務堆棧用來實現任務切換、函數調用等基本功能。任務控制塊用來存儲任務的基本信息,包括任務堆棧的位置、任務優先級、任務狀態等。μC/OS-Ⅱ系統采用雙向鏈表的形式管理任務控制塊,包括已經被任務使用的任務塊鏈表和未被使用的空任務塊鏈表。為了快速找到系統中優先級最高的就緒任務,μC/OS-Ⅱ采用任務就緒表管理當前系統中所有處于就緒狀態的任務。
第5章對任務的創建、刪除、掛起以及恢復等任務管理功能進行介紹,并且講解了任務調度的基本原理;最后詳細分析了μC/OS-Ⅱ操作系統的初始化和啟動過程。
第6章主要介紹了μC/OS-Ⅱ的中斷處理過程和時鐘管理,并講解了μC/OS-Ⅱ的中斷管理和中斷服務程序的結構;μC/OS-Ⅱ的系統時鐘及實現方法;時間管理服務包括延時、取消及延時等操作。
第7章通過闡述時間管理的數據結構、事件管理程序、信號量結構、信號量管理程序、互斥信號量結構、互斥信號量管理程序、事件標志組結構,以及事件標志組管理程序,介紹了μC/OS-Ⅱ實時多任務操作系統的事件管理機制,并給出了相應的信號量、互斥信號量和事件標志組的具體應用實例,方便讀者的學習與理解。
第8章介紹了消息管理的相關內容。μC/OS-Ⅱ中存在多種通信機制,除了信號量等事件管理外,μC/OS-Ⅱ實時操作系統內核中還包括消息郵箱和消息隊列通信機制。本章通過對消息郵箱的數據結構、消息郵箱管理程序、消息隊列結構、消息隊列管理程序的闡述,詳細介紹了管理消息傳遞的過程。
第9章主要對μC/OS-Ⅱ的動態內存管理方法和內存管理中提供的服務進行了介紹。μC/OS-Ⅱ通過定義一個二維數組,在內存中劃分了一個內存分區,并將分區又分成了大小相同的內存塊,組建空閑內存塊鏈表。操作系統通過內存控制塊對每一個內存分區進行管理。μC/OS-Ⅱ操作系統內存管理服務包括創建內存分區、申請內存塊、釋放內存塊、查詢內存分區的狀態、讀取內存分區名稱的有效長度和設置內存分區名稱。
第10章介紹了采用TI公司的TM4C123GH6PM微控制器的TM4C123G LaunchPad開發板對μC/OS-Ⅱ的移植步驟。該章詳細介紹了如何修改與處理器相關的三個文件。移植完成后如何進行測試,以保證操作系統正確運行。
第11章以控制器局域網絡CAN為例介紹如何設計一個嵌入式系統。本章主要介紹CAN模塊的相關知識,然后介紹Tiva微控制器CAN總線功能,包括CAN的初始化和配置、CAN數據的收發、CAN位速率的控制、CAN的中斷處理以及CAN的測試模式。最后給出實例加深讀者對CAN的理解。
本書內容全面、重點突出。書中對知識點的介紹循序漸進、由淺入深。書內所有示例均可運行通過,本書還配有免費的電子課件,歡迎選用本書作為教材的老師登錄www.hzbook.com本書頁面下載。
對參加本書編寫、校對以及程序測試工作的研究生金馳和黃瑞峰的支持,在此表示感謝!
由于作者水平有限,書中難免有錯誤和不足之處,懇請各位專家和讀者批評指正。
丁山 2016年4月
前言
第1章 緒論 1
1.1 嵌入式實時操作系統概要 1
1.2 嵌入式實時操作系統 2
1.2.1 體系結構 3
1.2.2 功能及特點 5
1.2.3 分類介紹 7
1.3 嵌入式系統實時性的概念 9
1.4 約束條件 11
1.4.1 時間約束 11
1.4.2 優先約束 12
1.4.3 資源約束 13
1.5 搭建開發環境 14
1.5.1 CCS 6.0的安裝 14
1.5.2 利用CCS 6.0新建工程 18
本章小結 21
練習與思考題 21
第2章 嵌入式硬件系統 22
2.1 嵌入式系統的硬件構成 22
2.2 嵌入式微處理器概述 23
2.2.1 嵌入式微處理器的存儲體系結構 23
2.2.2 嵌入式微處理器的指令集 24
2.2.3 主流的嵌入式微處理器 25
2.3 總線 26
2.4 存儲器 28
2.5 輸入/輸出接口和設備 28
2.6 ARM系列 28
2.6.1 ARM 指令集體系結構的演變29
2.6.2 ARM產品系列 33
2.7 ARM Cortex-M4系列處理器 41
2.7.1 ARM Cortex-M4處理器的特點 41
2.7.2 Cortex-M4處理器的結構 42
2.7.3 Cortex-M4的操作模式和特權級別 46
2.7.4 Cortex-M4的寄存器組 47
2.7.5 Cortex-M4的異常處理 51
2.7.6 Cortex-M4的存儲器映射 55
2.8 TM4C123GH6PM微控制器 57
2.8.1 TM4C123GH6PM微控制器的電氣特性與封裝 57
2.8.2 TM4C123GH6PM微控制器的特性 58
2.8.3 TM4C123GH6PM微控制器的結構 59
2.9 TM4C123GH6PM實驗板卡 61
2.10 RGB LED點亮實驗 65
2.10.1 建立新的CCS工程 65
2.10.2 源代碼解析 70
本章小結 72
練習與思考題 72
第3章 嵌入式實時內核 73
3.1 內核概要 73
3.1.1 μC/OS-Ⅱ的內核 73
3.1.2 調度算法 74
3.1.3 不可剝奪型內核 74
3.1.4 可剝奪型內核 75
3.1.5 數據類型的重定義與宏定義 76
3.2 內核功能 77
3.2.1 任務管理 77
3.2.2 同步與通信管理 78
3.2.3 中斷管理 81
3.2.4 時間管理 82
3.2.5 對共享資源的互斥管理 83
3.2.6 內存管理 84
3.2.7 I/O管理 85
3.2.8 出錯管理 86
3.2.9 用戶擴展管理 86
3.2.10 電源管理 87
3.3 內核性能測試實例 87
3.3.1 概述 87
3.3.2 中斷時序圖 88
3.3.3 中斷延遲時間 89
3.3.4 內核最大關中斷時間 90
3.3.5 中斷響應時間 92
3.3.6 中斷恢復時間 95
3.3.7 非屏蔽中斷 97
3.3.8 中斷處理時間 98
3.3.9 任務切換時間 98
3.3.10 任務響應時間 103
3.3.11 系統調用的執行時間 103
3.3.12 有關時間確定性的測試 104
3.3.13 嵌入式實時內核的存儲開銷 105
本章小結 105
練習與思考題 106
第4章 任務管理的數據結構 107
4.1 任務及其存儲結構 107
4.2 任務狀態 108
4.3 任務生成代碼實例 109
4.4 任務的優先級 111
4.5 系統任務 111
4.6 任務堆棧 115
4.6.1 任務堆棧的創建 115
4.6.2 任務堆棧的增長方向 115
4.6.3 任務堆棧的初始化 116
4.7 任務控制塊 116
4.7.1 任務控制塊的結構 117
4.7.2 任務控制塊鏈表 119
4.7.3 任務控制塊的初始化 121
4.8 任務就緒表 123
4.8.1 任務就緒表的結構 123
4.8.2 任務就緒表的操作 126
4.9 臨界段 131
本章小結 132
練習與思考題 132
第5章 任務管理 133
5.1 創建任務 133
5.1.1 用OSTaskCreate創建任務 133
5.1.2 用OSTaskCreateExt創建任務 135
5.2 刪除任務 137
5.3 請求刪除任務 143
5.4 掛起和恢復任務 144
5.4.1 任務掛起 145
5.4.2 任務恢復 146
5.5 任務優先級別的修改 148
5.6 任務TCB信息的獲取 151
5.7 任務堆棧檢查 152
5.8 任務調度 154
5.8.1 μC/OS-Ⅱ的調度算法 154
5.8.2 μC/OS-Ⅱ的任務級調度 154
5.8.3 任務級任務切換函數OS_TASK_SW( ) 157
5.9 μC/OS-Ⅱ的初始化和多任務的啟動 161
5.9.1 μC/OS-Ⅱ的初始化 161
5.9.2 μC/OS-Ⅱ的多任務啟動 167
5.10 任務級調度實例 168
5.10.1 程序功能說明 168
5.10.2 程序實現及源代碼解析 169
5.10.3 CCS工程導入 172
本章小結 173
練習與思考題 173
第6章 中斷與時鐘 174
6.1 μC/OS-Ⅱ的中斷管理 174
6.1.1 μC/OS-Ⅱ的中斷管理過程 174
6.1.2 進入中斷處理函數 175
6.1.3 退出中斷處理函數 176
6.1.4 中斷級任務切換函數 177
6.2 μC/OS-Ⅱ的時鐘 178
6.2.1 系統時鐘中斷服務程序 178
6.2.2 時鐘節拍服務函數 179
6.3 μC/OS-Ⅱ的時間管理 181
6.3.1 任務延時函數 182
6.3.2 按時分秒延時函數 182
6.3.3 取消任務的延時函數 184
6.3.4 獲取系統時間函數 185
6.3.5 設置系統時間函數 185
6.4 中斷管理實例 186
6.4.1 程序功能說明 186
6.4.2 程序實現及源代碼解析 186
本章小結 188
練習與思考題 188
第7章 任務同步機制與通信方式 189
7.1 任務同步與事件管理 189
7.1.1 任務之間的關系 189
7.1.2 同步與通信 190
7.1.3 臨界區 191
7.1.4 信息傳遞 191
7.2 事件管理的數據結構 192
7.2.1 事件 192
7.2.2 事件控制塊ECB 193
7.2.3 事件等待組和事件等待表 194
7.2.4 事件控制塊空閑鏈表 196
7.2.5 事件管理程序 196
7.3 信號量 199
7.3.1 信號量概述 199
7.3.2 數據結構 200
7.3.3 信號量的操作 201
7.3.4 應用舉例 209
7.4 互斥信號量 214
7.4.1 任務優先級的反轉現象 215
7.4.2 互斥型信號量概述 216
7.4.3 數據結構 217
7.4.4 互斥信號量的操作 217
7.4.5 應用舉例 228
7.5 事件標志組 232
7.5.1 事件標志組概述 232
7.5.2 事件標志組的數據結構 233
7.5.3 事件標志組的操作 236
7.5.4 事件標志組管理實例 249
本章小結 255
練習與思考題 255
第8章 消息管理 256
8.1 消息郵箱 256
8.1.1 消息郵箱概述 256
8.1.2 消息郵箱的數據結構 257
8.1.3 消息郵箱的操作 257
8.1.4 消息郵箱實例 265
8.2 消息隊列 267
8.2.1 消息隊列概述 267
8.2.2 消息隊列的數據結構 268
8.2.3 消息隊列的操作 270
8.2.4 消息隊列實例 278
本章小結 281
練習與思考題 281
第9章 內存管理 282
9.1 μC/OS-Ⅱ的內存管理機制 282
9.2 內存控制塊 282
9.2.1 內存分區 283
9.2.2 內存控制塊的結構 283
9.2.3 內存控制塊的初始化 283
9.3 創建內存分區 285
9.4 申請一個內存塊 287
9.5 釋放一個內存塊 288
9.6 查詢內存分區的狀態 289
9.7 讀取內存分區名稱的有效長度 290
9.8 設置內存分區名稱 291
9.9 內存管理應用實例 292
9.9.1 程序功能說明 292
9.9.2 程序實現及源代碼分析 292
本章小結 296
練習與思考題 296
第10章 μC/OS-Ⅱ的移植 297
10.1 移植說明 297
10.2 移植詳解 298
10.2.1 工程的建立和目錄結構 298
10.2.2 板級支持包 298
10.2.3 文件os_cpu.h的編寫 298
10.2.4 文件os_cpu_c.c的編寫 300
10.2.5 文件os_cpu_a.asm的編寫 303
10.3 測試μC/OS-Ⅱ 309
本章小結 310
練習與思考題 310
第11章 CAN總線應用設計 311
11.1 CAN協議概述 311
11.1.1 CAN總線的特點 311
11.1.2 CAN協議報文的幀類型 312
11.2 Tiva微控制器的CAN接口 314
11.2.1 CAN模塊內部結構 314
11.2.2 信號描述 315
11.3 功能說明 316
11.3.1 初始化和配置 316
11.3.2 數據收發 317
11.3.3 位速率的控制 323
11.3.4 中斷處理 324
11.3.5 測試模式 325
11.4 應用舉例 326
本章小結 331
練習與思考題 332