內容簡介
計算機書籍
《精通arm嵌入式linux系統開發(含cd光碟1張) 》全書共25章,從嵌入式處理器arm開始,講解了arm處理器的資源、arm的指令集、ads開發工具、嵌入式系統硬體環境的構建、bootloader、linux核心移植、嵌入式檔案系統、嵌入式linux多任務程式開發、嵌入式linux設備驅動開發、嵌入式linux網路程式開發、minigui圖形界面開發、設備驅動開發案例、綜合案例等內容。書中通過大量的例程來講解知識要點,並提供了大量極有參考價值的開發案例,讀者可以通過這些例程和開發案例對嵌入式linux開發有一個系統的學習和提高。
《精通arm嵌入式linux系統開發(含cd光碟1張) 》共包括4個方面的內容:在嵌入式系統的硬體結構中講述了嵌入式處理器arm的特點、嵌入式系統硬體環境的構建和ads開發工具的使用;在嵌入式linux系統移植中講述了目標板軟體環境的構建,主要包括boot loader、linux核心、檔案系統及交叉開發環境的構建;在嵌入式linux軟體開發中講述了嵌入式linux c語言開發工具的使用、標準庫的使用、多任務開發基礎和設備驅動開發基礎;在嵌入式套用系統實例分析中講述了嵌入式linux的網路程式開發、minigui圖形界面開發、can匯流排設備驅動設計、dm9000網路驅動設計、sd卡驅動設計和嵌入式b超系統設計。
《精通arm嵌入式linux系統開發(含cd光碟1張) 》語言通俗易懂,內容豐富,注重理解與實例,知識涵蓋面廣,非常適合從事嵌入式linux系統開發的初級工程師、高校學生、linux程式開發人員閱讀和學習。
目錄
《精通arm嵌入式linux系統開發(含cd光碟1張) 》
第1章 嵌入式系統概述 1
本章介紹了嵌入式系統的一些基礎知識,解釋了什麼是嵌入式系統、嵌入式系統中的處理器及嵌入式系統中的軟體系統。在學習了本章內容後,讀者會對嵌入式系統有一個整體的印象。本章將讀者引入嵌入式系統開發的大門,從下一章開始,將逐步學習嵌入式系統的開發過程。
1.1 嵌入式系統簡介 1
1.1.1 嵌入式系統 1
1.1.2 嵌入式系統的特點 2
1.1.3 嵌入式系統的發展趨勢 2
1.2 嵌入式系統中的處理器 4
1.2.1 微處理器 4
1.2.2 微控制器 4
1.2.3 數位訊號處理器 5
1.2.4 嵌入式片上系統 5
1.3 嵌入式系統中的軟體系統 5
1.3.1 嵌入式系統軟體 5
1.3.2 嵌入式系統軟體開發的一般過程 6
1.3.3 嵌入式應用程式的開發 6
1.4 本章小結 6
第2章 快速體驗——目標板 7
本章首先介紹了目標板的結構,然後帶領讀者對該目標板做了一番初次體驗,包括軟體的安裝和簡單使用,以及在linux下體驗telnet和ftp命令。希望通過本章的講解,使讀者對嵌入式系統開發有一個初步的、感性的認識。
2.1 目標板結構 7
.2.2 arm初體驗 8
2.2.1 測試arm處理器 8
2.2.2 安裝ads 1.2 9
2.2.3 安裝multi-ice和配置axd 11
2.2.4 ads的簡單使用 13
2.2.5 使用telnet和ftp 16
2.3 本章小結 16
第3章 arm的內部資源 17
本章對s3c2440嵌入式處理器片內資源的基本特性及功能進行了簡單的描述,希望讀者通過對本章的閱讀,能對s3c2440嵌入式處理器的片內資源有一個比較全面的了解和掌握,但在此處不過於深入每一個功能模組的具體細節。如果讀者有興趣對s3c2440的各個功能模組進行詳細的了解,可以參考相關用戶手冊。
3.1 s3c2440微處理器 17
3.1.1 主要結構 17
3.1.2 片內資源 18
3.1.3 體系結構 18
3.2 s3c2440存儲器映射 18
3.2.1 bank0匯流排寬度 18
3.2.2 nwait引腳的作用 19
3.2.3 nxbreq/nxback引腳操作 19
3.3 s3c2440內部資源詳解 20
3.3.1 cache高速快取 20
3.3.2 時鐘和電源管理 20
3.3.3 中斷控制器 22
3.3.4 脈衝頻寬調製定時器(pwm) 23
3.3.5 實時時鐘(rtc) 23
3.3.6 通用i/o連線埠 24
3.3.7 lcd控制器 24
3.3.8 uart控制器 25
3.3.9 a/d轉換和觸控螢幕接口 25
3.3.10 看門狗定時器 26
3.3.11 iic匯流排接口 26
3.3.12 ac’97音頻解碼器接口 27
3.3.13 usb設備控制器 27
3.3.14 sd接口 27
3.3.15 spi接口 28
3.3.16 相機接口 28
3.3.17 工作電壓 29
3.4 本章小結 29
第4章 熟悉arm處理器 30
本章首先介紹了arm公司的歷史,並列出了目前比較流行的arm處理器系列,讀者可以根據不同的需要做出自己的選擇。接下來詳細介紹了arm的指令集。希望讀者通過本章的學習,能對arm處理器有一個大體的認識,熟悉arm的指令集並在實際開發中學習和套用。
4.1 為什麼用arm 30
4.2 arm公司簡介 30
4.3 arm微處理器系列 30
4.3.1 arm7微處理器 30
4.3.2 arm9微處理器 31
4.3.3 arm10e微處理器 31
4.3.4 arm11微處理器 32
4.4 arm微處理器的結構 32
4.4.1 體系結構 32
4.4.2 暫存器結構 33
4.4.3 指令結構 33
4.5 arm微處理器的選擇 33
4.5.1 核心的選擇 33
4.5.2 工作頻率的選擇 33
4.5.3 晶片記憶體儲器的選擇 33
4.5.4 片內外圍電路的選擇 34
4.6 arm的指令集概述 34
4.6.1 arm微處理器的指令分類和格式 34
4.6.2 指令的條件域 35
4.7 arm指令的定址方式 36
4.7.1 立即定址 36
4.7.2 暫存器定址 36
4.7.3 暫存器間接定址 36
4.7.4 基址變址定址 36
4.7.5 多暫存器定址 37
4.7.6 相對定址 37
4.7.7 堆疊定址 37
4.8 arm指令集詳解 38
4.8.1 跳轉指令 38
4.8.2 數據處理指令 38
4.8.3 乘法指令與乘加指令 42
4.8.4 程式狀態暫存器訪問指令 44
4.8.5 載入/存儲指令 45
4.8.6 批量數據載入/存儲指令 47
4.8.7 數據交換指令 47
4.8.8 移位指令 48
4.8.9 協處理器指令 49
4.8.10 異常產生指令 51
4.9 本章小結 51
第5章 熟悉ads集成開發環境 52
本章介紹了ads集成開發環境,通過具體的例子,展示了ads的使用過程和主要功能。希望讀者通過本章的學習,能夠初步學會使用ads,幫助自己學習和開發arm系統。
5.1 命令行開發工具 52
5.1.1 armcc介紹 52
5.1.2 armcc用法詳解 53
5.1.3 armlink介紹 54
5.1.4 armlink用法詳解 54
5.1.5 arm運行時庫 54
5.1.6 ads調試器 55
5.1.7 實用程式 56
5.1.8 支持的軟體 56
5.2 使用ads創建工程 56
5.2.1 建立一個工程 57
5.2.2 編譯和連結工程 60
5.2.3 target設定選項 60
5.2.4 language settings 61
5.2.5 linker設定 61
5.2.6 arm fromelf工具 63
5.2.7 命令行下編譯工程 64
5.3 使用axd調試代碼 65
5.3.1 打開調試檔案 65
5.3.2 查看存儲器內容 66
5.3.3 設定斷點 66
5.3.4 查看變數值 67
5.4 本章小結 67
第6章 arm的外部電路 68
本章詳細介紹了基於s3c2440處理器的基本套用電路圖。這些電路在s3c2440微處理器的系統設計中會經常使用到,讀者也可以根據自身的實際需求,進行必要的修改。
6.1 核心板電路 68
6.1.1 晶振電路 68
6.1.2 復位電路 69
6.1.3 啟動配置電路 69
6.1.4 flash接口 69
6.1.5 sdram接口 72
6.2 底板電路 73
6.2.1 電源電路 73
6.2.2 串口電路 74
6.2.3 usb接口 75
6.2.4 乙太網接口 75
6.2.5 jtag調試接口 76
6.2.6 音頻接口 77
6.2.7 lcd接口 77
6.2.8 sd卡接口 78
6.3 本章小結 79
第7章 嵌入式作業系統概述 80
本章從作業系統的一般特性講起,介紹了作業系統的進程管理、存儲管理、檔案管理和設備管理等基本功能。然後對嵌入式作業系統與一般作業系統的特性進行了區別,介紹了嵌入式作業系統的特點、發展和分類。最後介紹了目前常見的一些嵌入式作業系統及它們的特點和主要的套用領域。
7.1 作業系統的結構和功能 80
7.2 進程管理 81
7.2.1 進程的描述 82
7.2.2 進程的調度 82
7.3 存儲管理 83
7.3.1 存儲器的體系結構 83
7.3.2 記憶體管理的基本概念 84
7.3.3 連續分配存儲管理方式 84
7.3.4 頁式存儲管理方式 86
7.4 檔案管理 87
7.4.1 檔案 88
7.4.2 目錄 89
7.4.3 ext2檔案系統 89
7.5 設備管理 92
7.5.1 設備的分類 92
7.5.2 數據傳輸控制方式 93
7.5.3 中斷處理 93
7.5.4 設備驅動程式 94
7.6 嵌入式作業系統的特點 95
7.6.1 嵌入式作業系統的發展 95
7.6.2 嵌入式作業系統的優勢 96
7.6.3 嵌入式作業系統的分類 96
7.7 常見的嵌入式作業系統 97
7.7.1 vxworks 97
7.7.2 psos 97
7.7.3 palm os 98
7.7.4 qnx 98
7.7.5 windows ce 99
7.7.6 μc/os-ii 100
7.7.7 嵌入式linux 100
7.8 本章小結 101
第8章 快速體驗——構建開發環境 102
本章主要介紹了嵌入式開發環境的構建過程,首先對交叉開發的概念進行了介紹,說明了在嵌入式系統的開發中採用交叉開發的原因。然後分別介紹了主機環境和目標板系統環境的構建過程,同時對這兩個環境的連線方式也做了簡要的介紹。最後介紹了目標板系統的3個主要方面:bootloader、kernel和根檔案系統,說明了它們的作用和構建方法,同時舉例說明了一些常用配置的配置方法。
8.1 交叉開發環境介紹 102
8.2 主機與目標板的連線方式 103
8.2.1 串口通信接口 103
8.2.2 乙太網接口 104
8.2.3 usb接口 104
8.2.4 jtag接口 105
8.3 建立主機開發環境 105
8.3.1 ubuntu 6.06的安裝 105
8.3.2 minicom的安裝配置 107
8.3.3 tftp服務的安裝配置 109
8.3.4 nfs的安裝配置 110
8.3.5 建立交叉工具鏈 112
8.4 啟動目標板系統 116
8.4.1 bootloader和kernel 117
8.4.2 根檔案系統 118
8.5 本章小結 119
第9章 linux使用基礎 120
linux的命令行博大精深,有數不清的內容等待讀者去探索。本章僅就一些最基本的知識做了最簡要的介紹。另外,由於linux中的命令非常多,要全部介紹也是幾乎不可能的。因此,本章按照命令的用途進行了分類講解,力求舉一反三。通過本章的介紹,相信讀者可以很快地掌握linux命令行的基本操作,並熟練掌握常用的命令。
9.1 linux的基本概念 120
9.1.1 檔案 120
9.1.2 目錄 120
9.1.3 分區 121
9.1.4 掛載 122
9.1.5 用戶系統 122
9.1.6 用戶許可權 122
9.1.7 shell 123
9.1.8 環境變數 124
9.2 linux的命令行 124
9.2.1 執行命令 124
9.2.2 參數 125
9.2.3 重定向符號 125
9.2.4 獲取幫助 125
9.3 linux的常用命令 127
9.3.1 檔案管理 127
9.3.2 內容管理 130
9.3.3 許可權管理 131
9.3.4 備份壓縮 132
9.3.5 系統設定 133
9.3.6 進程控制 136
9.3.7 網路設定 138
9.4 本章小結 139
第10章 bootloader 140
本章介紹了bootloader的概念、基本結構,並對bootloader的一般工作原理進行了介紹,重點介紹了vivi和u-boot的開發調試及使用。通過學習這兩種常見的bootloader,可以使讀者實際接觸到bootloader的工作原理和代碼實現。
10.1 bootloader的概念 140
10.1.1 bootloader所支持的嵌入式體系 141
10.1.2 bootloader的安裝位置 141
10.1.3 bootloader的啟動過程 142
10.1.4 bootloader與主機的通信 142
10.1.5 bootloader的操作模式 142
10.2 bootloader的基本結構 143
10.2.1 bootloader的stage1 143
10.2.2 bootloader的stage2 144
10.3 vivi簡介 149
10.3.1 vivi的體系架構 149
10.3.2 vivi啟動的第一階段 150
10.3.3 vivi啟動的第二階段 154
10.4 vivi的基本命令 158
10.4.1 mem命令 158
10.4.2 load命令 159
10.4.3 part命令 159
10.4.4 param命令 160
10.4.5 boot命令 160
10.4.6 go命令 161
10.4.7 bon命令 161
10.4.8 reset命令 161
10.4.9 help命令 161
10.5 u-boot簡介 162
10.5.1 u-boot的特點 162
10.5.2 u-boot的目錄結構 163
10.5.3 u-boot的啟動過程 163
10.5.4 u-boot的移植 165
10.6 u-boot的基本命令 167
10.6.1 設定環境變數 167
10.6.2 數據通信 167
10.6.3 存儲器操作 168
10.6.4 系統引導 168
10.6.5 其他 169
10.7 本章小結 169
第11章 linux核心移植 170
本章講解了linux核心移植中需要的基本知識,包括:linux核心的5個子系統及其相互關係;linux核心源碼各目錄包含的模組及其功能;linux核心編譯的方法和步驟;linux核心編譯時的詳細配置指南;linux核心下載和調試的相關知識。其中需要初學者熟練掌握linux編譯的方法和步驟,並對其他相關知識有所了解。
11.1 linux核心結構 170
11.2 linux源碼結構 171
11.2.1 arch目錄 172
11.2.2 drivers目錄 172
11.2.3 fs目錄 173
11.2.4 其他目錄 174
11.3 核心編譯 175
11.3.1 編譯準備 175
11.3.2 設定flash分區 176
11.3.3 配置核心 178
11.4 核心配置選項 180
11.4.1 常規設定 180
11.4.2 模組和塊設備層 182
11.4.3 cpu類型 183
11.4.4 電源管理 185
11.4.5 匯流排和網路 187
11.4.6 驅動 188
11.4.7 檔案系統 195
11.4.8 其他 198
11.5 下載核心 200
11.6 核心調試 201
11.6.1 核心調試步驟 201
11.6.2 常見核心問題 202
11.7 本章小結 203
第12章 嵌入式linux檔案系統 204
本章首先介紹了嵌入式系統中兩種主要的存儲介質nand flash和nor flash,對它們的特點和區別進行了闡述。然後介紹了常見的適用於嵌入式系統的5種檔案系統:cramfs檔案系統、yaffs 1/2檔案系統、jffs 1/2檔案系統、ramdisk檔案系統和tmpfs/ramfs檔案系統,分析了這些檔案系統的基本結構和實現原理,介紹了各種檔案系統及相應的映像檔案的製作方法。最後針對檔案系統的選擇和設計提出了參考意見和方法。
12.1 嵌入式檔案系統基礎 204
12.1.1 nor型flash存儲器 204
12.1.2 nand型flash存儲器 205
12.1.3 mtd 簡介 206
12.1.4 日誌型檔案系統 207
12.1.5 busybox 208
12.2 cramfs檔案系統 210
12.2.1 cramfs檔案系統的特性 210
12.2.2 cramfs檔案系統映像檔案的結構 211
12.2.3 cramfs檔案系統的工作原理 212
12.2.4 cramfs檔案系統的初始化過程 213
12.2.5 cramfs檔案系統的製作 213
12.2.6 cramfs檔案系統的掛載流程 216
12.3 yaffs檔案系統 217
12.3.1 yaffs檔案系統的數據存儲方式 217
12.3.2 yaffs檔案系統的工作原理 218
12.3.3 yaffs檔案系統對mtd的依賴性 220
12.3.4 yaffs檔案系統驅動的安裝流程 222
12.3.5 yaffs檔案系統的製作 222
12.4 jffs檔案系統 224
12.4.1 jffs1檔案系統簡介 224
12.4.2 jffs2檔案系統簡介 226
12.4.3 jffs3檔案系統簡介 228
12.4.4 jffs2檔案系統的工作原理 228
12.4.5 jffs2檔案系統的製作 231
12.5 基於ram的檔案系統 231
12.5.1 ramdisk檔案系統 231
12.5.2 ramfs/tmpfs檔案系統 232
12.6 嵌入式檔案系統的設計 233
12.6.1 檔案系統格式選擇的基本策略 234
12.6.2 混合型檔案系統格式的設計方法 234
12.7 本章小結 235
第13章 嵌入式linux c語言開發工具 236
“工欲善其事,必先利其器”,熟悉手頭的開發工具是每一個開發人員都必須完成的功課。本章介紹了在開發嵌入式c語言時需要用到的主要開發工具,包括命令行模式下的開發工具:編輯器vim、編譯器gcc、調試器gdb、項目管理make、版本管理cvs和圖形化模式下的集成開發環境eclipse等。讀者可根據個人的喜好選擇一種適合自己的開發環境。
13.1 編輯器vim 236
13.1.1 vim的編輯模式 236
13.1.2 vim的進入與退出 238
13.1.3 游標的移動 239
13.1.4 刪除和恢復 239
13.1.5 複製和貼上 240
13.1.6 查找和替換 240
13.1.7 網路資源 241
13.2 編譯器gcc 242
13.2.1 gcc的編譯流程 242
13.2.2 gcc的常用編譯選項 245
13.2.3 實例分析 248
13.3 調試器gdb 250
13.3.1 gdb使用概述 250
13.3.2 gdb的使用流程 251
13.3.3 gdbserver遠程調試 253
13.4 工程管理make 255
13.4.1 makefile檔案介紹 255
13.4.2 makefile的規則 256
13.4.3 makefile的變數 258
13.4.4 make命令的使用 260
13.4.5 使用自動工具生成makefile 261
13.5 集成開發環境eclipse 263
13.5.1 eclipse的安裝 263
13.5.2 eclipse的界面簡介 264
13.5.3 創建hello項目 265
13.5.4 調試hello項目 267
13.5.5 使用cvs進行版本管理 267
13.6 本章小結 271
第14章 快速體驗——嵌入式c語言開發流程 272
本章分別介紹了命令行模式下和集成開發環境下開發嵌入式程式的基本流程。首先介紹了在命令行下如何通過vi編輯一個代碼檔案,如何在pc和開發板上運行編譯好的程式和如何通過編寫makefile檔案提高編譯和檔案管理的效率。然後介紹了在eclipse下創建工程、編寫代碼、編譯工程和運行最終程式的過程。
14.1 命令行下的開發流程 272
14.1.1 編寫代碼 272
14.1.2 編譯程式 274
14.1.3 運行程式 275
14.1.4 交叉編譯 275
14.1.5 編寫makefile 276
14.2 基於eclipse的開發流程 277
14.2.1 下載和安裝eclipse 277
14.2.2 新建工程 278
14.2.3 編寫代碼 279
14.2.4 編譯工程 280
14.2.5 運行程式 281
14.3 本章小結 281
第15章 嵌入式linux c語言基礎 282
本章一起學習和回顧了c語言的基礎知識,主要包括:c語言概述、數據類型、運算符、表達式、流程、函式、數組和指針、複雜數據結構。本章的目的在於將c語言的語法精華濃縮成一章的內容,便於讀者隨時翻閱和查找。通過本章的學習,讀者可以立即進入編程的實戰階段。
15.1 c語言概述 282
15.1.1 c語言的特點 282
15.1.2 c語言程式的總體結構 282
15.1.3 c語言的語句 283
15.1.4 c語言的關鍵字 284
15.1.5 c語言程式設計步驟 284
15.2 數據類型 284
15.2.1 基本數據類型 284
15.2.2 常量與變數 285
15.2.3 整型數據、實型數據 285
15.2.4 字元型數據 286
15.3 運算符 287
15.3.1 算術運算符 287
15.3.2 關係和邏輯運算符 287
15.3.3 位操作符 288
15.3.4 ?操作符 288
15.3.5 表達式的優先權 288
15.4 表達式 289
15.4.1 類型轉換 289
15.4.2 構成符cast和可讀性 289
15.5 流程控制 289
15.5.1 格式輸入/輸出 289
15.5.2 順序程式設計 292
15.5.3 選擇結構設計 293
15.5.4 循環結構設計 294
15.6 函式 296
15.6.1 概述 296
15.6.2 函式定義的一般形式 297
15.6.3 函式的參數和函式的值 297
15.6.4 函式的調用 298
15.6.5 局部變數和全局變數 299
15.7 數組與指針 300
15.7.1 數組 300
15.7.2 指針的基本概念 302
15.7.3 指針與數組 304
15.7.4 指針與字元串 306
15.7.5 指針與函式 307
15.7.6 指針其他用法 308
15.7.7 動態記憶體管理 308
15.8 複雜數據結構 309
15.8.1 結構體定義 309
15.8.2 結構體使用 310
15.8.3 鍊表 312
15.8.4 枚舉類型 313
15.8.5 共用體類型 313
15.9 本章小結 313
第16章 嵌入式linux c語言標準庫 314
本章介紹了在linux下編程時常用的標準庫函式,包括字元測試、數據轉換、基本i/o、標準i/o、記憶體配置、字元串處理、日期時間、錯誤處理、系統日誌和環境管理等函式。著重介紹了這些函式的基本格式和用法,並對主要的函式進行了舉例說明。靈活使用這些函式,將給程式設計帶來很大的便利。
16.1 glibc簡介 314
16.2 字元測試和數據轉換函式 316
16.2.1 字元測試函式 316
16.2.2 數據轉換函式 317
16.3 基本i/o函式 318
16.3.1 open()函式 319
16.3.2 close()函式 320
16.3.3 read()函式和write()函式 320
16.3.4 其他函式 321
16.4 標準i/o函式 322
16.4.1 fopen()函式 322
16.4.2 fclose()函式 323
16.4.3 fread()函式和fwrite()函式 324
16.4.4 printf()函式和scanf()函式 325
16.4.5 其他函式 326
16.5 記憶體配置及字元串處理函式 326
16.5.1 記憶體分配函式 327
16.5.2 memxxx函式 327
16.5.3 strxxx函式 330
16.5.4 釋放記憶體的函式 331
16.5.5 動態記憶體分配的實例 332
16.6 日期時間函式 334
16.6.1 時間的定義 334
16.6.2 日曆時間 334
16.6.3 時鐘計時單元 336
16.6.4 格式化日期和時間 337
16.6.5 自定義時間格式 337
16.7 其他函式 339
16.7.1 錯誤處理函式 339
16.7.2 系統日誌函式 342
16.7.3 環境管理函式 344
16.8 本章小結 345
第17章 嵌入式linux的多任務編程 346
本章介紹了多任務處理的基本知識,主要介紹了基於進程和執行緒實現多任務處理的不同特點及區別。分別介紹了進程和執行緒的概念、數據結構,介紹了創建和終止一個進程或執行緒的基本方法,同時對於一些較為深入的內容,如殭屍(zombie)進程、執行緒屬性等,也做了基本的介紹。最後,介紹了一種多任務處理的解決方案:執行緒池,並給出了全部的實現代碼,具有很好的參考價值。
17.1 什麼是多任務 346
17.1.1 對話級多任務 346
17.1.2 進程級多任務 347
17.1.3 執行緒級多任務 347
17.1.4 多任務處理的特點 348
17.2 進程 349
17.2.1 進程的概念 350
17.2.2 進程的數據結構 351
17.2.3 進程的創建 353
17.2.4 檔案描述符共享 355
17.2.5 vfork()函式 357
17.2.6 exec()函式族 357
17.2.7 執行新程式 359
17.2.8 進程的終止 361
17.2.9 進程的退出狀態 363
17.2.10 zombie進程 365
17.3 執行緒 366
17.3.1 執行緒的概念 366
17.3.2 執行緒的創建 367
17.3.3 執行緒的終止 368
17.3.4 執行緒的基本屬性 370
17.3.5 執行緒屬性的修改 371
17.3.6 執行緒的擴展屬性 374
17.4 執行緒池 377
17.4.1 執行緒池的工作原理 377
17.4.2 執行緒池的實現 378
17.4.3 工作狀態的記錄 383
17.4.4 執行緒池的測試 386
17.5 本章小結 387
第18章 多任務間通信和同步 388
本章介紹了在嵌入式linux下進行多任務處理時,任務間通信和同步的方法。主要介紹了信號、信號集、管道、fifo、共享記憶體(mmap()方式和semget()方式)等數據通信方式,以及信號量(systemv方式和posix方式)、互斥鎖、條件變數等同步方式。這些內容都是編制多任務處理程式時所必備的,而且不同的方式有其不同的特點和適用的場合,因此在實際套用中應該在對任務有充分理解和測試後進行最佳化選擇。
18.1 信號 388
18.1.1 信號的概念 388
18.1.2 信號的產生 390
18.1.3 kill()函式和raise()函式 390
18.1.4 alarm()函式和pause()函式 391
18.1.5 about()函式 392
18.1.6 信號的處理 392
18.1.7 signal()函式 392
18.1.8 sigaction()函式 393
18.1.9 信號集 395
18.1.10 sigprocmask()函式 396
18.1.11 sigpending()函式 396
18.1.12 sigsuspend()函式 396
18.2 管道 397
18.2.1 管道的相關概念 398
18.2.2 管道的創建 398
18.2.3 多進程中的管道通信 399
18.2.4 管道的套用實例 401
18.2.5 fifo的相關概念 402
18.2.6 fifo的創建 403
18.2.7 fifo的讀寫規則 404
18.2.8 fifo的套用實例 405
18.3 共享記憶體 407
18.3.1 系統調用mmap() 408
18.3.2 系統調用munmap() 408
18.3.3 系統調用msync() 409
18.3.4 mmap()的套用實例 409
18.4 system v共享記憶體 411
18.4.1 系統調用shmget() 411
18.4.2 系統調用shmat() 412
18.4.3 系統調用shmdt() 412
18.4.4 system v共享記憶體的套用實例 412
18.5 訊息佇列 413
18.5.1 系統調用msgget() 413
18.5.2 系統調用msgsnd() 414
18.5.3 系統調用msgrcv() 414
18.5.4 系統調用msgctl() 415
18.5.5 訊息佇列的套用實例 415
18.6 system v信號量 417
18.6.1 系統調用semget() 417
18.6.2 系統調用semop() 418
18.6.3 系統調用semctl() 419
18.6.4 system v信號量的套用實例 419
18.7 posix信號量 421
18.7.1 系統調用sem_init() 422
18.7.2 系統調用sem_wait() 422
18.7.3 系統調用sem_post() 422
18.7.4 系統調用sem_destory() 422
18.7.5 posix信號量的套用實例 422
18.8 互斥鎖 424
18.8.1 系統調用pthread_mutex_init() 424
18.8.2 系統調用pthread_mutex_lock() 424
18.8.3 系統調用pthread_mutex_trylock() 424
18.8.4 系統調用pthread_mutex_unlock () 425
18.8.5 系統調用pthread_mutex_destory () 425
18.8.6 互斥鎖的套用實例 425
18.9 條件變數 427
18.9.1 系統調用pthread_cond_init() 428
18.9.2 系統調用pthread_cond_wait () 428
18.9.3 系統調用pthread_cond_timedwait () 428
18.9.4 系統調用pthread_cond_signal() 428
18.9.5 系統調用pthread_cond_broadsignal() 428
18.9.6 系統調用pthread_cond_destroy() 428
18.9.7 條件變數的套用實例 429
18.10 本章小結 430
第19章 設備驅動開發基礎 431
本章主要介紹了linux驅動開發的基礎知識,包括字元設備和塊設備驅動。其中字元設備知識主要包括:核心與模組、並發控制、阻塞、中斷、記憶體操作。
作為初學者,大多數讀者並不需要在實際工作中接觸到塊設備的驅動編寫,因此建議讀者將主要精力放在學習字元設備驅動之上,而這也足以滿足大多數情況下的實際需要。
19.1 linux設備管理和驅動概述 431
19.1.1 linux設備的分類 431
19.1.2 設備驅動程式的作用 431
19.1.3 訪問設備的實現 432
19.1.4 linux設備控制方式 432
19.2 linux設備驅動開發流程 434
19.2.1 構造和運行模組 434
19.2.2 字元設備驅動編寫 435
19.2.3 字元設備驅動實例 437
19.2.4 並發控制 440
19.2.5 阻塞與非阻塞 445
19.2.6 select和poll 449
19.2.7 中斷處理 451
19.2.8 記憶體與i/o操作 452
19.3 塊設備驅動編寫 456
19.3.1 塊設備的i/o操作特點 457
19.3.2 block_device_operations結構體 457
19.3.3 gendisk結構體 457
19.3.4 request結構體 459
19.3.5 request操作函式 462
19.3.6 bio結構體 464
19.3.7 註冊與註銷 466
19.3.8 載入與卸載 466
19.3.9 打開與釋放 468
19.3.10 ioctl()函式 468
19.3.11 i/o請求處理 469
19.4 本章小結 472
第20章 嵌入式linux的網路編程 473
本章介紹了開發嵌入式linux網路程式的基本流程,先後分析了tcp server程式、tcp client程式、udp通信程式、多執行緒檔案伺服器程式和proxy程式。針對網路程式涉及的函式多、內容複雜等特點,本章採取了在實際的網路程式代碼中學習編程的方法,在閱讀代碼的同時進行講解,將在進行網路編程中常用的函式和知識做了詳細的闡述,希望對讀者理解網路程式的編寫能有所幫助。
20.1 tcp/ip協定 473
20.2 tcp協定 474
20.2.1 tcp連線建立的過程 474
20.2.2 tcp連線的標識 474
20.2.3 關閉tcp連線 475
20.3 udp協定 475
20.4 socket簡介 475
20.4.1 socket的定義 476
20.4.2 socket的類型 476
20.5 tcp server程式設計 476
20.5.1 tcp的通信過程 476
20.5.2 tcp server程式 477
20.5.3 網路地址的表示 478
20.5.4 建立socket 479
20.5.5 綁定本地地址 479
20.5.6 位元組順序轉換 480
20.5.7 ip地址轉換 481
20.5.8 listen()函式 481
20.5.9 等待連線 482
20.5.10 數據通信 483
20.5.11 關閉套接字 484
20.6 tcp client程式設計 485
20.6.1 dns操作 486
20.6.2 連線伺服器 487
20.6.3 測試實例 488
20.7 udp通信的程式設計 489
20.7.1 udp的通信過程 489
20.7.2 udp通信伺服器端 490
20.7.3 udp通信客戶端 491
20.8 多執行緒檔案伺服器 493
20.8.1 檔案伺服器主程式 493
20.8.2 動態分配監聽連線埠 495
20.8.3 多執行緒伺服器的實現 495
20.8.4 大數據量的讀寫函式 496
20.8.5 客戶端測試例程 499
20.8.6 編譯和測試 501
20.9 proxy原始碼分析 501
20.9.1 主函式main() 502
20.9.2 參數處理函式parse_args() 503
20.9.3 守護進程函式daemonize() 505
20.9.4 代理服務函式do_proxy() 507
20.9.5 錯誤信息函式errorout() 510
20.10 本章小結 510
第21章 minigui圖形界面設計 511
本章主要介紹了嵌入式圖形界面庫minigui的程式設計。首先介紹了minigui的安裝、配置及使用eclipse進行minigui套用開發的配置方式。然後對開發minigui程式的基本函式進行解釋,包括訊息和訊息傳遞、視窗過程、對話框、控制項、圖形設備和配置檔案等方面。最後列舉了一個利用minigui編成的圖形界面程式miniqq,對這個例程的3個主要視窗的設計與編寫進行了詳細的介紹。
21.1 minigui概述 511
21.1.1 minigui的特點 511
21.1.2 minigui v1.3.3軟體包 512
21.1.3 minigui運行模式 512
21.2 minigui的安裝和使用 514
21.2.1 安裝minigui庫 514
21.2.2 安裝minigui的資源 515
21.2.3 配置minigui 515
21.2.4 編譯應用程式例子 516
21.2.5 交叉編譯minigui庫 516
21.2.6 交叉編譯例程 517
21.2.7 qvfb圖形引擎 518
21.2.8 framebuffer圖形引擎 519
21.3 利用eclipse編寫minigui程式 520
21.3.1 建立vacs工程 520
21.3.2 配置編譯選項 521
21.3.3 配置外部工具qvfb 522
21.3.4 運行vacs 523
21.3.5 調試vacs 523
21.4 minigui的編程基礎 524
21.4.1 頭檔案 525
21.4.2 程式入口 525
21.4.3 創建和顯示主視窗 526
21.4.4 進入訊息循環 526
21.4.5 視窗過程函式 528
21.4.6 螢幕輸出 528
21.4.7 程式的退出 528
21.5 訊息循環和視窗過程 529
21.5.1 訊息處理函式 529
21.5.2 重要的訊息 530
21.5.3 視窗及視窗過程 530
21.6 對話框和控制項編程 531
21.6.1 控制項的概念 531
21.6.2 預定義控制項 532
21.6.3 自定義控制項 534
21.6.4 控制項子類化 535
21.6.5 對話框和對話框模板 536
21.6.6 模態和非模態對話框 538
21.7 圖形設備接口 539
21.7.1 圖形設備上下文 539
21.7.2 矩形操作和區域操作 540
21.7.3 像素值和調色板 542
21.7.4 點陣圖操作函式 543
21.7.5 字型和文本輸出 544
21.7.6 繪製圖形 546
21.8 其他功能 547
21.8.1 讀寫配置檔案 547
21.8.2 定點數運算 548
21.9 miniqq界面設計 549
21.9.1 登錄視窗 551
21.9.2 好友列表視窗 554
21.9.3 聊天視窗 557
21.9.4 其他 559
21.10 本章小結 560
第22章 can匯流排驅動設計 561
隨著需求的發展,許多工業控制場合需要嵌入式設備,需要提供can匯流排接口來連線can設備,以滿足套用的需要。本章詳細介紹了can匯流排的基礎知識,對linux系統下的can驅動程式進行了詳細的分析。最後結合《精通arm嵌入式linux系統開發(含cd光碟1張) 》使用的arm9平台,介紹了移植can驅動程式的要點。
22.1 can匯流排介紹 561
22.2 sja1000介紹 561
22.2.1 sja1000的特性 561
22.2.2 sja1000內部原理 562
22.2.3 sja1000引腳說明 563
22.3 sja1000暫存器介紹 564
22.3.1 控制暫存器cr 564
22.3.2 命令暫存器cmr 565
22.3.3 狀態暫存器sr 566
22.3.4 中斷暫存器ir 567
22.3.5 傳送緩衝器 568
22.3.6 接收緩衝器 568
22.3.7 驗收濾波器 569
22.4 sja1000與s3c2440連線 569
22.5 sja1000的驅動程式 571
22.5.1 驅動程式原始碼 571
22.5.2 測試的操作方法 579
22.6 本章小結 580
第23章 sd卡驅動設計 581
sd卡在嵌入式設備中的使用越來越多,本章首先介紹了sd卡的基本知識和協定內容,然後結合s3c2440的sd卡控制器,詳細分析了linux下sd卡的驅動程式,並給出了實現過程。驅動程式的編寫對程式設計師要求很高,不僅要求代碼完全正確,效率低下的驅動程式也是不合格的。因此如果要編寫出好的驅動程式,經驗非常重要。
23.1 sd卡概述及協定 581
23.1.1 sd卡概述 581
23.1.2 sd卡協定 582
23.2 sd卡驅動設計 583
23.2.1 塊設備驅動設計 583
23.2.2 sd卡驅動程式分析 584
23.2.3 sd卡驅動程式設計 586
23.3 本章小結 588
第24章 網路驅動設計 589
近年來,internet獲得了突飛猛進的發展。嵌入式系統接入internet後將使得遠程監測、遠程維護變得非常容易,因此嵌入式系統的網路功能也是非常重要的。嵌入式系統實現internet接入的前提條件是系統的軟體中有tcp/ip協定支持。幸運的是,linux核心提供了包括tcp/ip在內的多種協定的支持。本章以dm9000網路晶片為例,分析了linux核心中網路設備驅動程式的運行機理,並介紹了實現linux網路驅動程式的關鍵過程。
24.1 linux網路設備概述 589
24.2 dm9000晶片介紹 590
24.3 重要的數據結構 591
24.3.1 通用部分 591
24.3.2 硬體相關部分 591
24.3.3 物理層相關數據 592
24.3.4 網路層協定相關部分 592
24.3.5 服務處理部分 593
24.4 網路設備初始化 593
24.5 激活和關閉網路設備 595
24.6 中斷控制的實現 596
24.7 傳送過程的實現 598
24.8 接收過程的實現 599
24.8.1 sk_buff結構 599
24.8.2 接收函式的實現 601
24.9 其他接口函式 602
24.10 本章小結 602
第25章 綜合案例——嵌入式b超 603
本章針對某一具體實例,向讀者展示了嵌入式開發的基本內容和步驟,相信讀者讀完本章內容以後對嵌入式系統開發會有一個更全面的認識。讀者在開發項目的時候,可以參考本章內容,同時更要關注最新的技術發展,以便更好地完成和實現自己的項目設計。
25.1 系統終端的結構設計 603
25.1.1 總體結構 603
25.1.2 顯示控制晶片選型 604
25.2 系統終端的軟體設計 604
25.2.1 u-boot 605
25.2.2 嵌入式linux移植 605
25.2.3 minigui移植 606
25.3 fpga與arm接口設計 608
25.3.1 硬體連線 608
25.3.2 fpga驅動程式設計 608
25.4 顯示晶片的連線與控制 610
25.4.1 選擇sm501的原因 610
25.4.2 sm501驅動程式設計 610
25.5 超聲動態圖像的實時顯示 612
25.5.1 圖像動態顯示 612
25.5.2 坐標轉換和灰度插值 612
25.6 圖形界面的結構 614
25.6.1 需求分析 614
25.6.2 總體結構 614
25.6.3 網路通信 615
25.6.4 多執行緒編程 616
25.7 操作界面設計 616
25.7.1 區域分配 617
25.7.2 鍵盤回響 617
25.7.3 控制項設計 618
25.8 測量模組設計 619
25.8.1 橢圓的畫法 619
25.8.2 橢圓測量周長和面積 620
25.8.3 軌跡法測量面積 621
25.9 本章小結 621