內容簡介
本書內容包括:高效、穩定和規範的程式基礎,多任務環境,I/O系統的內部結構,驅動模型,BSP設計要素,嵌入式軟體設計的經驗技巧;在硬體基礎方面討論了匯流排與設備的模型,基於MIPS和ARMSoC在多個系統平台VxWorks,Linux及WinCE下的系統資源的操控。
《嵌入式軟體設計之思想與方法》可作為在校學生學習嵌入式軟體設計原理的教學參考用書,也可作為嵌入式軟體開發工程人員深入掌握系統軟體設計的指南,以及嵌入式軟體培訓的參考教材。
作者簡介
張邦術,1999年畢業於電子科技大學,先後在聯想、泰鼎、微開和泰克公司從事近10年嵌入式軟體及系統軟體的研發工作,在VxWorks,Linux和WinCE系統平台上的開發,以及在音/視頻、移動媒體、測試儀器等領域具有豐富的設計經驗,在軟體團隊的組建、培訓和項目管理等方面積累了大量經驗。
目錄
第一篇基礎方法篇
第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
……
內容節選
第一篇 基礎方法篇
本篇就筆者的理解來討論一些嵌入式軟體設計所必備的基礎技能。如果讀者急於了解嵌入式系統軟體設計的方法,可以直接跳到第二篇“驅動模型篇”。借用一些老套的話——“萬丈高樓從地起”“磨刀不誤砍柴功”,打好紮實的基礎是非常重要的。在我看來,對嵌入式軟體系統的基本要求是高效和穩定,它要求軟體開發人員設計出的程式邏輯嚴密,層次清楚,效率最佳化,品質高精;與此同時,軟體需要與硬體系統打交道,需要處理複雜的套用問題,涉及到的專業面廣泛且深入,由此軟體開發人員還需要掌握很多複雜的專業知識。所以,基礎與方法對於嵌入式軟體的設計至關重要。
本書雖然不求將各種專業知識與技能講解得全面透徹,但希望筆者多年積累的一些點滴經驗,能夠給讀者帶來開指路的功效。
1.心理準備
如上所述,嵌入式軟體的設計是一項極其艱辛複雜的程式設計工作,它需要有豐富、紮實的專業知識,還需要有艱苦卓絕、鍥而不捨、敢於拼搏和敢於挑戰的精神。在最開始著手研究嵌入式軟體開發時,就需要樹立腳踏實地的學習和工作作風,在設計工作中要實事求是,不能臆想,不能武斷,不能自大。
另外,也要去除心目中的畏難情緒和神秘觀念。只要認真學習、深入鑽研,就可以設計出性能優秀的嵌入式產品;只要思路清晰、方法正確,也可以創造奇蹟。
嵌入式軟體系統既是軟體設計,又是藝術設計。它要求不但要實現產品的功能,還要設計出友好、易用、能夠一眼就吸引住用戶眼球的界面。所以嵌入式軟體不但要求內部結構精細,還要求外部界面設計精細,每一個細微角落都要體現出設計者的獨具匠心!
誠然,嵌入式軟體設計也是軟體設計人員人生的一大樂趣。當一個產品從你手中誕生時;當一個用戶津津樂道地使用一個PS2玩一個遊戲,或者使用一個手持設備觀看一部驚險電影時;當一名工作人員使用辦公室的大螢幕進行遠程監控,或遠程操作一個複雜的機器設備時;如果這些軟體系統都是出自於自己的作品,那么這些豈不是為之振奮的事情?
當大家有了這些心理準備,有了這些遠景的樂趣,就會為自己的學習產生巨大潛能和動力。興趣是攻克難關的先導,希望讀者帶著強烈的興趣閱讀完本書!