3dwoo大學簡體電腦書店
C++嵌入式開發實例精解
( 簡體 字)
作者:[美]艾格爾·威亞契克 著 劉颙 譯類別:1. -> 程式設計 -> C++ -> C++
   2. -> 電腦組織與體系結構 -> 嵌入式系統
出版社:清華大學出版社C++嵌入式開發實例精解 3dWoo書號: 55923
詢問書籍請說出此書號!
缺書
NT售價: 595
出版日:7/1/2022
頁數:330
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787302607809 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
第1章嵌入式系統的基礎知識 1
1.1考查嵌入式系統 1
1.1.1與臺式機或Web應用程序的不同之處 1
1.1.2嵌入式系統的類型 2
1.1.3微控制器 2
1.1.4片上系統 3
1.1.5專用集成電路 4
1.1.6現場可編程門陣列 4
1.2與有限的資源協同工作 4
1.3考查性能影響 4
1.4與不同的架構協同工作 5
1.4.1字節順序 5
1.4.2對齊問題 7
1.4.3定寬整數類型 8
1.5處理硬件錯誤 8
1.5.1硬件的早期版本 8
1.5.2硬件的不可靠性 9
1.5.3環境條件的影響 9
1.6C++嵌入式開發 9
1.6.1不必為無用的事務付諸實踐 10
1.6.2基于面向對象編程的代碼復雜度計算 12
1.6.3資源獲取時即初始化 12
1.6.4異常機制 14
1.6.5強大的標準庫 16
1.6.6線程和內存模型 16
1.7遠程部署軟件 17
1.8遠程運行軟件 18
1.9日志和診斷 18
1.10本章小結 19
第2章配置開發環境 21
2.1在Docker容器中配置構建系統 22
2.1.1實現方式 22
2.1.2工作方式 23
2.1.3更多內容 24
2.2與模擬器協同工作 24
2.2.1實現方式 25
2.2.2工作方式 25
2.2.3更多內容 27
2.3交叉編譯 27
2.3.1準備工作 27
2.3.2實現方式 27
2.3.3工作方式 28
2.3.4更多內容 31
2.4連接至嵌入式系統 31
2.4.1準備工作 31
2.4.2實現方式 31
2.4.3工作方式 32
2.4.4更多內容 33
2.5調試嵌入式應用程序 34
2.5.1準備工作 34
2.5.2實現方式 34
2.5.3工作方式 35
2.5.4更多內容 36
2.6針對遠程調試使用gdbserver 37
2.6.1準備工作 37
2.6.2實現方式 37
2.6.3工作方式 38
2.6.4更多內容 39
2.7使用CMake作為構建系統 40
2.7.1準備工作 40
2.7.2實現方式 40
2.7.3工作方式 41
2.7.4更多內容 44
第3章與不同的體系結構協同工作 45
3.1定寬整數類型 45
3.1.1實現方式 46
3.1.2工作方式 47
3.1.3更多內容 48
3.2處理size_t類型 48
3.2.1實現方式 48
3.2.2工作方式 49
3.2.3更多內容 50
3.3檢測平臺的字節順序 50
3.3.1實現方式 51
3.3.2工作方式 52
3.3.3更多內容 53
3.4轉換字節順序 53
3.4.1實現方式 54
3.4.2工作方式 57
3.5處理數據對齊問題 58
3.5.1實現方式 59
3.5.2工作方式 60
3.5.3更多內容 61
3.6處理打包結構 61
3.6.1實現方式 62
3.6.2工作方式 62
3.6.3更多內容 63
3.7緩存行對齊數據 63
3.7.1實現方式 63
3.7.2工作方式 65
3.7.3更多內容 66
第4章處理中斷 67
4.1數據輪詢 67
4.2中斷服務程序 68
4.3對ISR的一般考慮 68
4.48051微控制器中斷 69
4.5實現中斷服務程序 70
4.5.1實現方式 70
4.5.2工作方式 72
4.6通過8位自動重載模式生成一個5kHz的方波信號 73
4.6.1實現方式 74
4.6.2工作方式 75
4.7使用Timer1作為事件計數器計數一個1Hz脈沖 76
4.7.1實現方式 76
4.7.2工作方式 78
4.7.3更多內容 79
4.8串行接收和傳輸數據 79
4.8.1實現方式 80
4.8.2工作方式 80
4.8.3更多內容 81
第5章調試、日志和分析 83
5.1技術需求 83
5.2在GDB中運行源程序 84
5.2.1實現方式 84
5.2.2工作方式 86
5.2.3更多內容 90
5.3處理斷點 91
5.3.1實現方式 91
5.3.2工作方式 92
5.3.3更多內容 96
5.4處理核心轉儲 96
5.4.1實現方式 96
5.4.2工作方式 97
5.4.3更多內容 99
5.5使用gdbserver進行調試 99
5.5.1準備工作 100
5.5.2實現方式 100
5.5.3工作方式 100
5.6添加調試日志機制 101
5.6.1實現方式 101
5.6.2工作方式 102
5.6.3更多內容 104
5.7與調試和發布版本協同工作 104
5.7.1實現方式 105
5.7.2工作方式 106
5.7.3更多內容 108
第6章內存管理 109
6.1使用動態內存分配 109
6.1.1實現方式 110
6.1.2工作方式 112
6.2對象池 112
6.2.1實現方式 113
6.2.2工作方式 115
6.2.3更多內容 118
6.3環狀緩沖區 118
6.3.1實現方式 119
6.3.2工作方式 121
6.4使用共享內存 124
6.4.1實現方式 125
6.4.2工作方式 128
6.4.3更多內容 131
6.5使用專用內存 131
6.5.1實現方式 131
6.5.2工作方式 133
6.5.3更多內容 135
第7章多線程和同步機制 137
7.1C++語言中的線程支持 137
7.1.1實現方式 138
7.1.2工作方式 139
7.2數據同步機制 140
7.2.1實現方式 140
7.2.2工作方式 141
7.2.3更多內容 143
7.3使用條件變量 143
7.3.1實現方式 143
7.3.2工作方式 145
7.3.3更多內容 147
7.4使用原子變量 147
7.4.1實現方式 148
7.4.2工作方式 150
7.4.3更多內容 151
7.5使用C++內存模型 152
7.5.1實現方式 152
7.5.2工作方式 154
7.5.3更多內容 155
7.6無鎖同步機制 155
7.6.1實現方式 155
7.6.2工作方式 157
7.6.3更多內容 158
7.7在共享內存中使用原子變量 159
7.7.1實現方式 159
7.7.2工作方式 162
7.8異步函數和特性 164
7.8.1實現方式 165
7.8.2工作方式 166
7.8.3更多內容 168
第8章通信和序列化 169
8.1在應用程序中使用進程間的通信 169
8.1.1實現方式 170
8.1.2工作方式 172
8.1.3更多內容 175
8.2進程間的通信機制 175
8.2.1準備工作 175
8.2.2實現方式 176
8.2.3工作方式 177
8.2.4更多內容 178
8.3消息隊列和發布者-訂閱者模式 178
8.3.1實現方式 179
8.3.2工作方式 182
8.3.3更多內容 184
8.4針對回調使用C++lambda函數 185
8.4.1實現方式 185
8.4.2工作方式 186
8.4.3更多內容 187
8.5數據序列化 187
8.5.1實現過程 188
8.5.2工作方式 190
8.5.3更多內容 191
8.6使用FlatBuffers庫 192
8.6.1實現方式 192
8.6.2工作方式 194
8.6.3更多內容 195
第9章外圍設備 197
9.1控制通過GPIO連接的設備 197
9.1.1實現方式 197
9.1.2工作方式 199
9.2脈沖寬度調制 201
9.2.1實現方式 201
9.2.2工作方式 203
9.2.3更多內容 204
9.3在Linux中使用ioctl訪問實時時鐘 204
9.3.1實現方式 205
9.3.2工作方式 207
9.3.3更多內容 208
9.4使用libgpiod控制GPIO引腳 208
9.4.1實現方式 209
9.4.2工作方式 210
9.4.3更多內容 211
9.5控制I2C外圍設備 211
9.5.1實現方式 212
9.5.2工作方式 216
9.5.3更多內容 219
第10章降低功耗 221
10.1技術需求 221
10.2考查Linux中的節能模式 221
10.2.1實現方式 222
10.2.2工作方式 223
10.2.3更多內容 224
10.3利用RTC進行喚醒 224
10.3.1實現方式 224
10.3.2工作方式 225
10.3.3更多內容 226
10.4控制USB設備的自動掛起 226
10.4.1實現方式 226
10.4.2工作方式 227
10.4.3更多內容 229
10.5配置CPU頻率 230
10.5.1實現方式 230
10.5.2工作方式 231
10.5.3更多內容 235
10.6等待事件 235
10.6.1實現方式 235
10.6.2工作方式 238
10.6.3更多內容 241
10.7利用PowerTOP分析功耗 241
10.7.1實現方式 241
10.7.2工作方式 242
10.7.3更多內容 244
第11章時間點和時間間隔 245
11.1C++Chrono庫 245
11.1.1實現方式 245
11.1.2工作方式 246
11.1.3更多內容 247
11.2測量時間間隔 247
11.2.1實現方式 248
11.2.2工作方式 249
11.2.3更多內容 250
11.3處理延遲問題 250
11.3.1實現方式 250
11.3.2工作方式 252
11.3.3更多內容 253
11.4使用單調遞增時鐘 254
11.4.1實現方式 254
11.4.2工作方式 256
11.4.3更多內容 257
11.5使用POSIX時間戳 258
11.5.1實現方式 258
11.5.2工作方式 259
11.5.3更多內容 260
第12章錯誤處理和容錯機制 261
12.1處理錯誤代碼 261
12.1.1實現方式 261
12.1.2工作方式 264
12.1.3更多內容 265
12.2針對錯誤處理使用異常 265
12.2.1實現方式 266
12.2.2工作方式 267
12.2.3更多內容 269
12.3捕捉異常時使用常量引用 269
12.3.1實現方式 269
12.3.2工作方式 271
12.3.3更多內容 272
12.4處理靜態對象 273
12.4.1實現方式 273
12.4.2工作方式 275
12.5與定時器協同工作 276
12.5.1實現方式 277
12.5.2工作方式 278
12.6高可用系統的心跳信號 280
12.6.1實現方式 280
12.6.2工作方式 283
12.6.3更多內容 287
12.7實現軟件反抖動邏輯 287
12.7.1實現方式 287
12.7.2工作方式 289
第13章實時系統 291
13.1使用Linux中的實時調度器 291
13.1.1實現方式 292
13.1.2工作方式 293
13.2使用靜態分配的內存 295
13.2.1實現方式 295
13.2.2工作方式 297
13.2.3更多內容 298
13.3避免錯誤處理異常 298
13.3.1實現方式 299
13.3.2工作方式 301
13.3.3更多內容 302
13.4實時系統 302
13.4.1實現方式 302
13.4.2工作方式 303
13.4.3更多內容 304
第14章安全性系統的指導原則 305
14.1使用全部函數的返回值 305
14.1.1實現方式 306
14.1.2工作方式 308
14.1.3更多內容 310
14.2使用靜態代碼分析器 310
14.2.1實現方式 311
14.2.2工作方式 311
14.2.3更多內容 312
14.3使用前置條件和后置條件 312
14.3.1實現方式 313
14.3.2工作方式 314
14.3.3更多內容 316
14.4代碼正確性的正規驗證方案 316
14.4.1實現方式 316
14.4.2工作方式 317
14.4.3更多內容 319
第15章微控制器編程 321
15.1設置開發環境 321
15.1.1實現方式 321
15.1.2工作方式 322
15.1.3更多內容 323
15.2編譯并上傳程序 323
15.2.1實現方式 323
15.2.2工作方式 323
15.2.3更多內容 325
15.3調試微控制器代碼 326
15.3.1實現方式 326
15.3.2工作方式 327
本書詳細闡述了與C++嵌入式開發相關的基本解決方案,主要包括嵌入式系統的基礎知識,配置開發環境,與不同的體系結構協同工作,處理中斷,調試、日志和分析,內存管理,多線程和同步機制,通信和序列化,外圍設備,降低功耗,時間點和時間間隔,錯誤處理和容錯機制,實時系統、安全性系統的指導原則,微控制器編程等內容。此外,本書還提供了相應的示例、代碼,以幫助讀者進一步理解相關方案的實現過程。
本書適合作為高等院校計算機及相關專業的教材和教學參考書,也可作為相關開發人員的自學用書和參考手冊。
長久以來,嵌入式系統開發基本通過C語言或匯編語言予以實現,其原因在于,硬件往往缺少應有的資源運行高級編程語言(如C++、Java或Python)編寫的程序。更為重要的是,沒有必要使用這些語言編寫軟件。有限的硬件資源限制了軟件的復雜性,嵌入式應用程序的功能依然相對簡單,這也使得C語言足以勝任此項工作。
隨著硬件開發的不斷進步,越來越多的嵌入式系統由廉價而強大的系統芯片驅動,甚至能夠運行通用的多任務系統,如Linux。不斷增長的硬件能力需要我們編寫更加復雜的軟件,因此,C++越來越多地成為新的嵌入式系統的首選語言。C++允許開發人員創建使用計算和內存資源的應用程序,就像使用C語言編寫的應用程序一樣,但為開發人員提供了更多的工具處理復雜性和更安全的資源管理問題,如面向對象編程和RAII習慣用法。
具有豐富C語言經驗的資深嵌入式開發人員通常傾向于以類似的、習慣性的方式使用C++編寫代碼,并將這種語言視為C語言的面向對象擴展,即帶有類的C語言。然而,現代C++語言擁有自己的最佳實踐方案和概念,如果使用得當,它可以幫助開發人員避免常見的陷阱,并允許開發人員在幾行代碼中完成諸多工作。
另一方面,當具有C++經驗的開發人員步入嵌入式系統這一領域時,他們需要了解特定的硬件平臺,以及應用程序領域的需求、限制條件和相關功能,進而設計C++代碼。
本書旨在填補這一項空白,并演示如何在嵌入式系統中應用現代C++語言的特性和最佳實踐方案。
適用讀者
本書適用于軟件開發人員、電子硬件工程師、軟件工程師和系統芯片工程師,可幫助他們通過C++語言構建高效的嵌入式程序。
嵌入式系統涵蓋了較為廣泛的領域,本書試圖討論其中的一種類型,即運行Linux操作系統的SoC,如樹莓派或BeagleBoard,并簡要介紹底層微控制器,如Arduino。
本書希望讀者了解與C++這門編程語言相關的基礎知識,但并不需要具備豐富的C++知識或嵌入式系統經驗。

本書內容
第1章定義了嵌入式系統的具體含義、嵌入式系統與其他系統之間的區別、所需的特定編程技術,以及為何大多數時候C++語言是嵌入式開發的首選方案。另外,本章還將介紹嵌入式開發人員在日常工作中所面臨的約束和挑戰,即有限的系統資源和CPU性能、處理硬件錯誤和遠程調試。
第2章解釋了嵌入式系統開發環境與Web或桌面應用程序開發的區別,并介紹了構建和目標系統、交叉編譯和交叉工具箱、串行控制臺和遠程Shell等概念。對于運行Windows、macOS或Linux的大多數常見桌面配置,本章還提供了設置虛擬化構建和目標主機的實際操作步驟。
第3章解釋了C++代碼中目標系統的CPU架構和內存配置之間的差別。
第4章介紹了中斷和中斷服務例程的底層概念。在現代操作系統中,開發人員或啟動程序需要使用操作系統提供的高層API,因而需要通過8051微控制器考查中斷技術。
第5章討論基于Linux的嵌入式系統的調試技術,如在目標板(target board)上直接運行gdb、針對遠程調試機制的gdb服務器,以及針對調試和故障根源分析的日志機制的重要性。
第6章提供與內存分配相關的多個示例和最佳實踐方案,這對于嵌入式系統的開發人員來說十分有用。其間討論了為何需要在嵌入式應用程序中避免使用動態內存分配,以及快速、專用內存分配的相關替代方案。
第7章將討論如何使用C++標準庫中的函數和類實現高效的多線程應用程序,同時發揮現代多核CPU的最大功效。
第8章將討論進程和系統通信間的一些概念、挑戰性問題和最佳實踐方案,如Socket、管道、共享內存和基于FlatBuffers庫的高效內存序列化機制。另外,本章還討論如何將應用程序解耦為獨立的組件,且這些組件使用定義良好的異步協議相互通信,這實際上是擴展軟件系統同時保持其快速和容錯的標準方法。
第9章將介紹如何在C++程序中與各種外圍設備協同工作。雖然大多數設備通信API并不依賴于特定的編程語言,但我們仍將通過C++語言的強大功能編寫封裝器(這對于開發人員來說十分方便),并防止出現創建的資源泄露錯誤。
第10章將探討編寫高效節能的應用程序,以及利用操作系統電源管理功能的最佳實踐方案。本章針對基于Linux的嵌入式系統提供了多個示例,在此基礎上,相同的概念也可擴展至其他操作系統和平臺。
第11章介紹與時間管理相關的各種話題,如測算時間間隔、增加延時。此外,我們還將學習C++ Chrono標準庫提供的API,并以此構建可移植的應用程序。
第12章將討論C++嵌入式應用程序中錯誤機制的可能實現和最佳實踐方案,同時還將解釋如何高效地使用C++異常機制,并將該機制與其他替代方案進行比較,如傳統的錯誤代碼和復雜的返回機制。其間將涉及一些基本的容錯機制,如看門狗計時器和心跳信號。
第13章討論實時系統規范,主要介紹實時系統的定義方式,以及實時系統所包含的類型。本章通過實際案例探討了如何使應用程序的行為更具確定性,這也是實時系統的關鍵需求。
第14章考查什么是安全關鍵系統,以及安全系統與其他嵌入式系統之間的不同之處。本章涵蓋了開發關鍵安全系統時所需的開發方法和工具,如編碼指南(包括MISRA、AUTOSAR或JSF)、靜態代碼分析、軟件驗證工具。
第15章簡要介紹微處理器C++代碼的編寫、編譯和調試等概念。同時使用Arduino電路板作為示例,并討論如何設置開發環境。
嵌入式系統開發意味著應用程序將與某些專用硬件進行交互,如特定的SoC平臺、特定的微控制器或特定的外圍設備。因此,存在多種可能的硬件配置,以及與這些硬件設置協同工作的專用操作系統或IDE。
本書旨在指導讀者學習如何實現嵌入式系統編程,但不會過多地涉及硬件內容。因此,大多數示例工作于虛擬Linux環境或模擬器中,某些示例可能需要使用真實的硬件設備。這些示例將運行于Raspberry Pi或Arduino這些廣泛使用且價格低廉的平臺上,具體內容如表1所示。
表1
本書涉及的軟件/硬件 操 作 系 統
Docker ? 64位Microsoft Windows 10專業版或企業版
? macOS 10.13或更新的版本
? Ubuntu Linux 16.04或更新的版本
? Debian Linux Stretch(9)或Buster(10)
? Fedora Linux 30或更新的版本
QEMU ? Windows 8或更新的版本(32位或64位)
? macOS 10.7或更新的版本
? Linux(各個版本)
Raspberry Pi 3 Model B+
Arduino UNO R3或ELEGOO UNO R3
如果讀者正在閱讀本書的電子版,建議輸入代碼或通過GitHub存儲庫查看代碼,這有助于防止代碼復制、粘貼過程中出現的潛在錯誤。
下載示例代碼文件
讀者可訪問并通過個人賬戶下載本書的示例代碼文件。無論讀者在何處購買了本書,均可訪問,經注冊后我們會直接將相關文件通過電子郵件的方式發送給您。
下載代碼文件的具體操作步驟如下。
(1)訪問并注冊。
(2)選擇Support選項卡。
(3)單擊Code Downloads。
(4)在Search搜索框中輸入書名。
當文件下載完畢后,可利用下列軟件的最新版本解壓或析取文件夾中的內容。
? WinRAR/7-Zip(Windows環境)。
? Zipeg/iZip/UnRarX(Mac環境)。
? 7-Zip/PeaZip(Linux環境)。
另外,本書的代碼包也托管于GitHub上,對應網址。若代碼被更新,現有的GitHub庫也會保持同步更新。
讀者還可訪問并從對應分類中查看其他代碼包和視頻內容。
下載彩色圖像
我們還進一步提供了本書中截圖/圖表的彩色圖像,讀者可訪問進行查看。
圖標表示警告或重要的注意事項。
圖標表示提示信息和操作技巧。

讀者反饋和客戶支持
歡迎讀者對本書提出建議或意見并予以反饋。
對此,讀者可發送郵件,并以書名作為郵件標題。
勘誤表
盡管我們希望將本書做到盡善盡美,但疏漏依然在所難免。如果讀者發現謬誤,無論是文字錯誤或是代碼錯誤,還望不吝賜教。對此,讀者選取對應書籍,輸入并提交相關問題的詳細內容。
版權須知
一直以來,互聯網上的版權問題從未間斷,Packt出版社對此類問題異常重視。若讀者在互聯網上發現本書任意形式的副本,請告知我們網絡地址或網站名稱,我們將對此予以處理。關于盜版問題,讀者可發送郵件。
若讀者針對某項技術具有專家級的見解,抑或計劃撰寫書籍或完善某部著作的出版工作。
問題解答
若讀者對本書有任何疑問,可發送郵件,我們將竭誠為您服務。
pagetop