TOP
經典不再等待!讀懂羅馬人的強大,開啟你的智力冒險
C++嵌入式開發實例精解(簡體書)
滿額折

C++嵌入式開發實例精解(簡體書)

商品資訊

人民幣定價:119 元
定價
:NT$ 714 元
優惠價
87621
海外經銷商無庫存,到貨日平均30天至45天
下單可得紅利積點 :18 點
商品簡介
名人推薦
目次

商品簡介

本書詳細闡述了與C 嵌入式開發相關的基本解決方案,主要包括嵌入式系統的基礎知識,配置開發環境,與不同的體系結構協同工作,處理中斷,調試、日志和分析,內存管理,多線程和同步機制,通信和序列化,外圍設備,降低功耗,時間點和時間間隔,錯誤處理和容錯機制,實時系統、安全性系統的指導原則,微控制器編程等內容。此外,本書還提供了相應的示例、代碼,以幫助讀者進一步理解相關方案的實現過程。 本書適合作為高等院校計算機及相關專業的教材和教學參考書,也可作為相關開發人員的自學用書和參考手冊。

名人推薦

隨著硬件開發的不斷進步,越來越多的嵌入式系統由廉價而強大的系統芯片驅動,甚至能夠運行通用的多任務系統,如Linux。不斷增長的硬件能力需要我們編寫更加複雜的軟件,因此,C 越來越多地成為新的嵌入式系統的語言。C 允許開發人員創建使用計算和內存資源的應用程序,就像使用C語言編寫的應用程序一樣,但為開發人員提供了更多的工具處理複雜性和更安全的資源管理問題,如面向物件編程和RAII習慣用法。

長久以來,嵌入式系統開發基本通過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(https://www.docker.com/products/docker-desktop) ? 64位Microsoft Windows 10專業版或企業版
? macOS 10.13或更新的版本
? Ubuntu Linux 16.04或更新的版本
? Debian Linux Stretch(9)或Buster(10)
? Fedora Linux 30或更新的版本
QEMU(https://www.qemu.org/download/) ? Windows 8或更新的版本(32位或64位)
? macOS 10.7或更新的版本
? Linux(各個版本)
Raspberry Pi 3 Model B
Arduino UNO R3或ELEGOO UNO R3
如果讀者正在閱讀本書的電子版,建議輸入代碼或通過GitHub存儲庫查看代碼,這有助於防止代碼復制、粘貼過程中出現的潛在錯誤。
下載示例代碼文件
讀者可訪問www.packt.com並通過個人帳戶下載本書的示例代碼文件。無論讀者在何處購買了本書,均可訪問www.packt.com/support,經注冊後我們會直接將相關文件通過電子郵件的方式發送給您。
下載代碼文件的具體操作步驟如下。
(1)訪問www.packt.com並注冊。
(2)選擇Support選項卡。
(3)單擊Code Downloads。
(4)在Search搜索框中輸入書名。
當文件下載完畢後,可利用下列軟件的版本解壓或析取文件夾中的內容。
? WinRAR/7-Zip(Windows環境)。
? Zipeg/iZip/UnRarX(Mac環境)。
? 7-Zip/PeaZip(Linux環境)。
另外,本書的代碼包也托管於GitHub上,對應網址為https://github.com/PacktPublishing/ Embedded-Programming-with-Modern-CPP-Cookbook。若代碼被更新,現有的GitHub庫也會保持同步更新。
讀者還可訪問https://github.com/PacktPublishing/並從對應分類中查看其他代碼包和視頻內容。
下載彩色圖像
我們還進一步提供了本書中截圖/圖表的彩色圖像,讀者可訪問https://static.packt-cdn. com/downloads/9781838821043_ColorImages.pdf進行查看。
圖標表示警告或重要的注意事項。
圖標表示提示信息和操作技巧。

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

目次

第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.6 C 嵌入式開發 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.4 8051微控制器中斷 69
4.5 實現中斷服務程序 70
4.5.1 實現方式 70
4.5.2 工作方式 72
4.6 通過8位自動重載模式生成一個5 kHz的方波信號 73
4.6.1 實現方式 74
4.6.2 工作方式 75
4.7 使用Timer 1作為事件計數器計數一個1 Hz脈衝 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.1 C 語言中的線程支持 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.1 C 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

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 621
海外經銷商無庫存,到貨日平均30天至45天

暢銷榜

客服中心

收藏

會員專區