《嵌入式軟體設計之思想與方法》

《嵌入式軟體設計之思想與方法》,作者張邦術,北京航空航天大學出版社2009年1月出版。

基本信息

內容簡介

本書從教學的角度出發,全面討論了嵌入式軟體設計的思想與方法。在編排上循序漸進,從基礎準備,到驅動模型,再深入到整個系統及系統的構建。在講解上通過建立模型來幫助讀者系統掌握嵌入式軟體設計的普遍原理與編程接口。內容包括:高效、穩定和規範的程式基礎,多任務環境,I/O系統的內部結構,驅動模型,BSP設計要素,嵌入式軟體設計的經驗技巧;在硬體基礎方面討論了匯流排與設備的模型,基於MIPS和ARMSoC在多個系統平台VxWorks,Linux及WinCE下的系統資源的操控。本書可作為在校學生學習嵌入式軟體設計原理的教學參考用書,也可作為嵌入式軟體開發工程人員深入掌握系統軟體設計的指南,以及嵌入式軟體培訓的參考教材。

前言

硬體技術的飛速發展,使硬體的性能顯著提高,並且成本極速降低。微處理器已經深入到人們生活和生產的各個領域,各種產品和設備都逐漸增加了複雜的智慧型化功能,使得消費類電子產品、個人媒體產品、個人數字助理以及工業控制等領域得以快速發展。隨著這些產品的高度智慧型化和複雜化,嵌入式軟體的需求得到迅猛發展。從單片機的控制軟體,到功能強大的多任務實時作業系統平台,產品的智慧型化程度越來越高,易用性越來越好,嵌入式軟體及其套用領域越來越廣泛,從而對嵌入式軟體的要求也變得越來越複雜。本書旨在為嵌入式軟體開發愛好者提供一個入門的引導。面對複雜的嵌入式系統軟體,作為一位初學者,如何清楚把握嵌入式軟體的設計對象與目標,如何尋找一個很好的切入點,儘快參與到嵌入式軟體的設計當中,對於這些問題,希望通過本書的講解,能夠為讀者提供一些有益的啟示。筆者多年來一直在嵌入式軟體領域從事實際項目的開發工作,出於對軟體設計的執著與偏愛,筆者把這些年從事嵌入式軟體設計的經驗點滴整理出來,與更多的嵌入式軟體設計愛好者分享。目前,儘管介紹嵌入式軟體設計方面的書籍較多,但全面、系統地討論如何從頭開始設計嵌入式系統軟體的書籍卻很少。很多嵌入式軟體設計方面的書籍都是一些諸如百科全書的參考手冊,由於體系過於龐大,或討論過於專業,初學者很難在短時間內把握其中有用的部分,因而更難將龐大體系里各書籍中的精華串到一起,而本書正是這些書籍精華的一種提煉。本書以講述的方式,深入剖析嵌入式系統軟體設計的各個層面,以及設計實踐中的各個關鍵之事,以幫助讀者輕鬆地領會嵌入式軟體設計的方法,掌握嵌入式軟體的核心架構。書中通過對嵌入式系統的分解,重點講述嵌入式系統軟體的層次結構。通過對目前多個主流系統(VxWorks,Linux,WinCE)核心進行深入淺出的剖析與對比,幫助讀者建立起正確的驅動設計模型;通過對不同硬體平台(MIPS,ARM)所開發的板級支持包(BSP)的深入討論,幫助讀者掌握硬體適配層(OAL)設計的核心概念,使讀者清楚理解系統環境的上下文,前因後果,從而更好地把握各個軟體模組設計的分界與接口,把握設計的對象與目標,在設計中做到心中有數,目標明確,從而更好、更快地解決問題。要想成為一名成功的嵌入式軟體程式設計師,程式的設計能力是首要的技能。如何打好程式設計基礎,如何編寫工程化的程式,如何在設計中與團隊協作開發、在後續開發中有效地升級與維護,如何編寫規範的文檔等,這些都是工程化軟體設計中非常關鍵的環節,本書花費大量篇幅進行介紹,以幫助讀者提高程式設計能力。書中從各種複雜的軟體系統中抽象出驅動模型和板級支持包的設計模型;對於硬體基礎,也通過模型化的方法講述了匯流排的一般概念與作用,抽象出輸入/輸出設備的模型。通過這些模型化的講解,便於讀者掌握嵌入式軟體設計的目標與內容,從而提高軟體設計能力。1.讀者對象本書的讀者對象為嵌入式程式設計的初學者,本書也可作為大中專學生學習嵌入式軟體設計的入門參考。對於那些已從事嵌入式軟體設計一段時間,但是在設計實踐中感覺力不從心,需要全面掌握嵌入式軟體設計內容與目標,掌握一些新的技巧與方法的讀者,相信本書將會起到良師益友的作用。本書也可以作為嵌入式軟體培訓的教材。2.題材與組織本書共分為四篇,其中第一篇著重討論作為一名優秀的嵌入式軟體設計人員所必備的知識和技能。需要說明的是:限於時間和精力,本書沒能全面囊括嵌入式軟體設計的所有知識點和技術面,但希望本書能讓讀者掌握基本的框架,使讀者在今後的學習和工作實踐中,更好地結合優秀讀物和參考資料,不斷學習和實踐,從而提高自身的軟體設計能力和水平。

目錄

第一篇基礎方法篇
第1章程式基礎
1.1設計高性能程式的必要性3
1.1.1設計高性能程式的必要性3
1.1.2嵌入式軟體的設計範疇3
1.1.3嵌入式軟體的分層結構6
1.2嵌入式軟體的程式設計要求8
1.2.1代碼結果的要求9
1.2.2代碼形式的要求10
1.3嵌入式軟體開發的基本思路和原則10
1.3.1系統分析,定義接口11
1.3.2函式實現,最佳化算法12
1.3.3清理代碼,補充注釋14
1.3.4測試修訂,完善文檔14
1.4程式實例剖析14
1.4.1正確理解棧14
1.4.2記憶體泄漏18
1.4.3消除編譯依賴18
1.4.4消除潛在隱患20
1.4.5規範實現範例21
1.4.6性能最佳化23
1.5程式設計其他注意點30
1.5.1謹慎使用“宏”30
1.5.2正確理解預定義宏34
1.5.3避免歧義37
第2章多任務作業系統
2.1板級支持包40
2.2嵌入式作業系統與實時性40
2.2.1嵌入式作業系統41
2.2.2實時作業系統42
2.3多任務概述42
2.3.1進程、執行緒與任務43
2.3.2何時需要多任務44
2.3.3任務狀態的轉換50
2.3.4進程調度與調試算法51
2.3.5任務相關的API51
2.4進程間共享代碼與可重入性53
2.4.1共享代碼53
2.4.2共享代碼可重入性問題53
2.4.3使用私有數據55
2.4.4使用臨界區數據57
2.5執行緒間通信57
2.5.1共享數據結構57
2.5.2互斥59
2.5.3信號量60
2.5.4臨界區與信號量的實現實例63
第3章硬體基礎
3.1ARM74
3.1.1ARM編程模式75
3.1.2ARM指令概述78
3.1.3ARM異常及處理80
3.2MIPS86
3.2.1MIPS編程模式87
3.2.2MIPS指令概述90
3.2.3MIPS中斷與異常95
3.3接口基礎98
3.3.1匯流排概述99
3.3.2I2C匯流排105
3.3.3PCI匯流排108
3.3.4設備模型115
3.3.5一個IDE控制器設備實例117第二篇驅動模型篇
第4章驅動的通用模型
4.1設備驅動的作用121
4.2驅動類型123
4.2.1Linux中的驅動類型123
4.2.2WinCE中的驅動類型125
4.2.3VxWorks中的驅動類型125
4.3設備驅動的通用模型126
4.3.1模組部分的驅動126
4.3.2設備的驅動例程127
第5章VxWorks的驅動模型
5.1VxWorks的I/O系統131
5.1.1I/O系統概述131
5.1.2檔案名稱與設備133
5.1.3基本I/O134
5.1.4緩衝I/O136
5.1.5格式化I/O136
5.2VxWorks的驅動及其內部結構137
5.2.1驅動的安裝、驅動表138
5.2.2設備的創建、設備鍊表140
5.2.3檔案的打開、檔案描述符表142
5.2.4檔案的讀、寫、控制和關閉操作143
第6章Linux的驅動模型
6.1Linux的驅動載入方式145
6.1.1核心驅動模組與模組化驅動145
6.1.2模組化驅動的載入與卸載146
6.2Linux的驅動架構147
6.2.1一個最簡單的核心驅動148
6.2.2一個最簡單的模組驅動151
6.2.3Linux驅動中註冊驅動153
6.2.4Linux系統中的設備檔案154
6.3Linux字元型設備驅動155
6.3.1驅動的載入與清理155
6.3.2中斷的申請與釋放156
第7章WinCE的驅動模型
7.1WinCE驅動類型158
7.2設備管理器及其驅動模型159第三篇BSP/OAL篇
第8章BSP的基本概念
8.1BSP與驅動161
8.2BSP開發的目標任務162
第9章BSP的設計要素
9.1中斷處理163
9.1.1物理中斷號與邏輯中斷號163
9.1.2CPU中斷與中斷控制器擴展164
9.1.3中斷源的查找165
9.1.4中斷處理執行緒166
9.2CPU異常166
9.2.1異常向量表167
9.2.2向量表的安裝173
9.2.3異常處理代碼實例177
9.3硬體I/O的訪問188
9.3.1避免使用絕對物理地址188
9.3.2記憶體一致性問題192
9.3.3I/O訪問的刷新198
第10章Linux的啟動過程
10.1Linux的啟動流程199
10.2Linux的啟動過程簡介201
10.2.1_stext函式201
10.2.2start_kernel函式203
10.2.3setup_arch函式204
10.2.4trap_init函式204
10.2.5init_IRQ函式205
10.2.6sched_init函式205
10.2.7do_initcalls函式205
10.2.8init函式206
10.2.9init程式207
第11章WinCE的設計
11.1WinCEOS平台開發簡介209
11.1.1WinCE平台的開發流程209
11.1.2WinCE核心結構211
11.1.3WinCE設計中的一些名詞術語212
11.2WinCEBSP開發213
11.2.1啟動裝載器213
11.2.2OAL開發215
11.2.3WinCE配置檔案219
11.3WinCE設備驅動的開發流程221
11.3.1設備驅動原始碼221
11.3.2修改配置檔案222
11.3.3向OS平台注入驅動223第四篇擴展篇
第12章理解程式的內部結構
12.1x86彙編及其程式結構226
12.1.1x86程式段定義227
12.1.2關聯段暫存器、確定段的種類230
12.1.3段組偽指令230
12.2嵌入式系統中的程式結構231
12.2.1嵌入式系統中執行程式的映像231
12.2.2連結器與命令腳本236
12.3ELF檔案格式241
12.3.1ELF檔案格式概述241
12.3.2ELF檔案格式分析器248
第13章嵌入式系統的設計思想
13.1直截了當的思想262
13.2層次化的思想267
13.3循序漸進的思想269
13.4實踐是最好的老師269
13.5團隊協作意識270
13.6大膽嘗試與積極創新270
結束語272
參考文獻273

插圖索引
圖11嵌入式軟體的分層結構7
圖21VxWorks中的任務狀態轉換圖50
圖22驅動中的可重入性問題154
圖23驅動中的可重入性問題256
圖24使用共享數據區訪問臨界區的例子58
圖31ARM程式狀態暫存器格式77
圖32MIPSCPU暫存器88
圖33MIPSFPU暫存器90
圖34I2C數據位的傳輸106
圖35I2C起始條件和停止條件106
圖36I2C匯流排數據傳輸時序圖107
圖37PCICONFIGADDRESS暫存器格式113
圖38PCI類型0配置空間頭部114
圖39ITE8172IDE控制器框圖118
圖51驅動在系統中的層次結構132
圖52VxWorksI/O系統的調用關係133
圖53VxWorks驅動安裝140
圖54VxWorks設備添加141
圖55VxWorks檔案打開142
圖56檔案讀操作的I/O控制流程143
圖61Linux驅動與作業系統核心之間的關係147
圖71WinCE驅動內部框圖158
圖72WinCE系統中應用程式與設備驅動的互動160
圖91驅動程式中完整的中斷處理架構164
圖92IT8172G中斷控制器內部框圖177
圖101Linux啟動流程框圖200
圖102Linux啟動執行過程細節201
圖111WinCEOS開發的工作流程210
圖112WinCE的內部層次結構211
圖113WinCEBSP框圖214
圖121x86彙編段結構228
圖122宏彙編中的段連結映像230
圖123x86段組定義231
圖124節的簡單格式237
圖125節的完整定義239
圖126口(ENTRY)的定義240
圖127ELF目標檔案格式242

插表索引
表31ARM暫存器組織結構75
表32ARM狀態暫存器的模式位78
表33ARM異常處理的入口地址81
表34ARM異常的優先權86
表35MIPS系統控制暫存器CP088
表36MIPS32/MIPS64裝入/存儲指令所支持的數據類型91
表37MIPS對齊的裝入存儲指令91
表38MIPS非對齊的裝入存儲指令91
表39MIPS原子更新的裝入存儲指令92
表310協處理器裝入存儲指令92
表311MIPS立即數操作的算術指令92
表312MIPS三操作數算術指令92
表313MIPS二運算元算術指令93
表314MIPS移位指令93
表315MIPS乘除法指令94
表316MIPS256M區域內無條件跳轉指令95
表317MIPSPC相對的條件轉移指令95
表318MIPS的中斷、狀態及緣由暫存器的映射關係96
表319MIPS異常向量的基地址97
表320MIPS異常向量的偏移地址97
表321I2C匯流排術語定義105
表322PCI匯流排命令110
表323ITE8172IDE控制器的PCI配置暫存器119
表324ITE8172IDE匯流排主設備IDE輸入/輸出暫存器119
表325IDE命令暫存器120
表111WinCE常見的映像配置檔案219
表121字元串表簡單例子246
表122對字元串表索引所得到的字元串246

相關詞條

相關搜尋

熱門詞條

聯絡我們