內容簡介
本書共12章,分為四部分,分別是嵌入式系統基礎、在ARM處理器系統上移植Linux作業系統、在Linux作業系統上進行軟體開發及綜合套用。本書既有嵌入式系統硬體結構、ARM處理器基礎、作業系統基礎等的介紹,也有一步步將Linux作業系統移植到ARM處理器上的過程,還有在嵌入式Linux上進行軟體開發的過程,並且提供了大量套用實例。
目錄
第一部分 嵌入式系統基礎
第1章 嵌入式系統概述 2
1.1 嵌入式系統的發展 2
1.1.1 單片機時代(20世紀70~80年代) 2
1.1.2 專用處理器時代(20世紀90年代~21世紀) 3
1.1.3 ARM時代(21世紀至今) 4
1.2 嵌入式系統的構成 4
1.2.1 嵌入式系統的層次模型 4
1.2.2 嵌入式系統的處理器 6
1.2.3 嵌入式系統的作業系統 7
1.3 嵌入式系統和通用計算機系統的簡單比較 10
1.4 嵌入式系統的開發流程 11
1.4.1 硬體系統設計 11
1.4.2 操作講盼歸系統移植 11
1.4.3 套用軟體設計 11
1.5 嵌入式系統的套用 12
第2章 嵌入式系統的硬體 13
2.1 嵌入式系統的ARM處理器 13
2.1.1 ARM處理器的發展歷程 13
2.1.2 ARM處理器的架構、類型和型號及一些專用術語 15
2.1.3 ARM處理器的分類 18
2.2 嵌入式系統的存儲器件 25
2.2.1 SDRAM 25
2.2.2 FLASH 28
2.2.3 E2PROM 33
2.2.4 大容量存儲系統 34
2.3 嵌入式系統的外圍器件 34
2.4 S3C2440處理器和GT2440嵌入式開發板 34
2.4.1 S3C2440處理器的特點和內部資源 34
2.4.2 S3C2440處理器灶匙婆的內部結構和工作模式 39
2.4.3 GT2440嵌入式蘭請協開發板的硬體資源 46
第3章 嵌入式系統的Linux作業系統 49
3.1 Linux作業系統基礎 49
3.1.1 Linux作業系統的發展 49
3.1.2 Linux作業系統的特點 50
3.1.3 Linux作業系統的組成結構 51
3.1.4 Linux作業系統的發行版 53
3.2 Linux作業系統的人機互動方法 54
3.2.1 Linux的圖形界面 54
3.2.2 Linux的Shell 54
3.3 Linux作業系統的命令 56
3.3.1 Linux作業系統的命令基礎 56
3.3.2 目錄操作命令 60
3.3.3 檔案操作命令 63
3.3.4 磁碟管理命令 70
3.3.5 用戶管理命令 73
3.3.6 網路管理命令 75
3.3.7 其他命令 76
第二部分 在ARM處理器系統上移植Linux作業系統
第4章 移植和使用嵌入式系統的引導軟體(Bootloader) 80
4.1 嵌入式系統的軟體開發 80
4.1.1 進行裸機開發 80
4.1.2 在嵌入式作業系統下進行開發 87
4.2 嵌入式系統的引導軟體基礎 87
4.2.1 Bootloader介紹 87
4.2.2 基於Bootloader的嵌入式架構 88
4.2.3 Bootloader的工作模式 89
4.2.4 Bootloader的啟動方式 89
4.2.5 Bootloader的啟動流程 91
4.2.6 常見的Bootloader 93
4.3 【套用實例】——移植Bootloader軟體U-Boot 93
4.3.1 U-Boot的特點和功能 93
4.3.2 U-Boot的原始碼結構分析 94
4.3.3 移植U-Boot 100
4.3.4 刻錄U-Boot 108
4.4 【套用實例】——使用U-Boot 112
4.4.1 使求奔企促用超級終端和嵌入式系獄坑統進行通信 112
4.4.2 使用DNW下載工具和嵌入式系統進行通信 115
第5章 建立和使用嵌入式系凳旋奔熱統的設旋設交叉編譯環境 117
5.1 建立交叉編譯環境 117
5.1.1 交叉編譯環境的工具鏈 117
5.1.2 【套用實例】——安裝交叉編譯環境 118
5.2 使用交叉編譯環境 120
5.2.1 使用編輯器vim 120
5.2.2 使用編譯工具gcc 124
5.2.3 使用調試工具gdb 126
5.2.4 使用管理工具make 129
5.2.5 使用autotools 131
第6章 在嵌入式系統上移植作業系統和檔案系統 136
6.1 Linux核心移植基礎 136
6.1.1 Linux的核心組成 136
6.1.2 Linux核心的配置工具 137
6.2 【套用實例】——在嵌入式系統上移植Linux核心 139
6.2.1 配置核心 139
6.2.2 建立依賴關係 142
6.2.3 建立核心 142
6.3 檔案系統移植基礎 142
6.3.1 Linux檔案系統基礎 143
6.3.2 檔案系統的管理機制 144
6.3.3 嵌入式系統中的常用檔案系統介紹 145
6.4 【套用實例】——在嵌入式系統上移植檔案系統 148
6.4.1 檔案系統映像的製作 148
6.4.2 使用NFS檔案系統 151
第三部分 在Linux作業系統上進行軟體開發
第7章 在嵌入式Linux作業系統中進行C語言開發 155
7.1 Linux如何執行一個程式 155
7.2 Linux 的程式存儲空間 157
7.3 Linux C的main函式 158
7.4 【套用實例】——Hello GT2440 159
7.5 將程式下載到開發板 160
7.5.1 【套用實例】——使用隨身碟傳遞數據 160
7.5.2 【套用實例】——通過串口傳遞數據 160
7.6 Linux作業系統典型庫函式介紹及其使用 161
7.6.1 Linux的系統調用和庫函式基礎 161
7.6.2 【套用實例】——求平方根 162
7.6.3 【套用實例】——產生隨機數 163
7.6.4 【套用實例】——獲得系統時間和日期 164
7.6.5 【套用實例】——列印單字元 166
7.6.6 【套用實例】——將字元串轉換為數字 167
7.6.7 【套用實例】——字元串複製 167
7.6.8 【套用實例】——添加通訊錄條目 169
7.6.9 【套用實例】——記憶體映射 171
7.6.10 【套用實例】——標準輸入/輸出 172
第8章 在嵌入式Linux中進行檔案和流操作 175
8.1 Linux的檔案操作基礎 175
8.1.1 Linux的檔案系統介紹 175
8.1.2 Linux的檔案類型 179
8.2 Linux的基礎檔案操作 182
8.2.1 使用open函式打開檔案 182
8.2.2 使用close函式關閉檔案 184
8.2.3 使用create函式創建檔案 184
8.2.4 使用write函式寫檔案 185
8.2.5 使用lseek函式對檔案進行內部定位 186
8.2.6 使用read函式讀檔案 188
8.3 檔案的高級操作 190
8.3.1 使用stat函式操作檔案狀態 190
8.3.2 使用utime函式操作檔案時間 191
8.3.3 使用dup和dup2函式操作檔案的描述符 192
8.3.4 使用rename函式修改檔案的名稱 193
8.4 Linux的目錄檔案操作 194
8.4.1 創建和刪除目錄 194
8.4.2 打開、關閉目錄及對目錄的讀操作 195
8.5 Linux的流操作基礎 200
8.5.1 流和檔案的關係 200
8.5.2 流的結構和操作流程 201
8.5.3 Linux的標準流 202
8.6 Linux的流操作 203
8.6.1 打開和關閉流 203
8.6.2 設定流的緩衝區 205
8.6.3 使用字元方式對流進行讀寫 208
8.6.4 使用行方式對流進行讀寫 210
8.6.5 使用二進制方式對流進行讀寫 212
8.6.6 流的出錯處理 214
8.6.7 流的沖洗 215
8.6.8 在流中進行內部定位 215
第9章 在嵌入式Linux中進行進程和執行緒操作 219
9.1 Linux的進程基礎 219
9.1.1 Linux的進程及其執行過程 219
9.1.2 Linux的進程描述符和標識符 222
9.1.3 【套用實例】——獲取進程的用戶標識符 224
9.1.4 Linux的進程調度 225
9.1.5 Linux下的進程執行流程 226
9.2 在嵌入式Linux中進行進程操作 227
9.2.1 使用fork和vfork函式創建進程 227
9.2.2 使用exec系列函式執行進程 231
9.2.3 使用exit系列函式退出進程 235
9.2.4 調用wait系列函式銷毀進程 236
9.3 Linux的執行緒基礎 240
9.3.1 執行緒的運行方式 240
9.3.2 執行緒的標識符 241
9.3.3 用戶態執行緒和核心態執行緒 241
9.3.4 編譯帶執行緒的代碼 242
9.4 在嵌入式Linux中進行執行緒操作 242
9.4.1 調用pthread_create函式創建執行緒 242
9.4.2 調用pthread_exit函式退出執行緒 244
9.4.3 調用pthread_join函式阻塞執行緒 245
9.4.4 調用pthread_cancel函式取消執行緒 246
9.4.5 調用pthread_cleanup系列函式清理執行緒環境 247
9.4.6 調用pthread_deatch函式分離執行緒 249
9.4.7 執行緒和進程操作的總結和比較 251
第10章 在嵌入式Linux中進行進程間和執行緒間通信 252
10.1 Linux的進程通信和信號基礎 252
10.1.1 Linux的進程通信 252
10.1.2 Linux中的信號機制和信號 253
10.1.3 信號的工作方式 255
10.1.4 Linux下的信號說明 256
10.1.5 調用signal系列函式來註冊信號 259
10.2 Linux中信號的基礎操作 262
10.2.1 使用kill函式和raise函式傳送信號 262
10.2.2 使用alarm進行信號的定時操作 266
10.2.3 使用setitimer函式進行精確定時 267
10.2.4 使用abort傳送進程退出信號 269
10.3 Linux的管道和進程通信 269
10.3.1 管道基礎 269
10.3.2 管道的實現方法 270
10.3.3 管道讀寫操作規則 271
10.3.4 管道的特點 272
10.4 在Linux中進行管道操作 272
10.4.1 使用pipe函式來創建管道 273
10.4.2 【套用實例】——父子進程使用管道通信 273
10.4.3 【套用實例】——兄弟進程使用管道通信 274
10.4.4 管道的高級操作 276
10.5 Linux的命名管道基礎 277
10.5.1 在Linux中使用命名管道 278
10.5.2 命名管道的常用工作方式 279
10.5.3 命名管道的打開和讀寫 281
10.6 Linux的命名管道操作 282
10.6.1 使用mkfifo函式來創建命名管道 282
10.6.2 【套用實例】——命名管道的讀寫 283
10.7 Linux中的執行緒同步操作 285
10.7.1 使用互斥鎖實現執行緒同步 285
10.7.2 使用條件變數實現執行緒同步 288
第11章 在嵌入式Linux中進行網路編程 291
11.1 Linux的網路通信模型 291
11.1.1 OSI網路模型 291
11.1.2 TCP/IP協定和其網路模型 292
11.1.3 客戶端/伺服器結構 295
11.1.4 Linux的連線埠和套接字 295
11.1.5 Linux套接字的結構定義 297
11.2 在嵌入式Linux中進行網路基礎操作 298
11.2.1 使用位元組順序轉換函式族來轉換地址模式 298
11.2.2 使用位元組操作函式族操作多位元組數據 299
11.2.3 使用IP位址轉換函式族轉換IP位址 300
11.2.4 使用域名轉換函式族轉換域名 302
11.3 在嵌入式Linux中操作網路套接字 304
11.3.1 使用socket函式創建套接字 304
11.3.2 使用bind函式綁定套接字 305
11.3.3 使用connect函式建立連線 307
11.3.4 使用listen切換套接字為傾聽模式 309
11.3.5 使用accept函式接收連線 311
11.3.6 使用close函式關閉連線 311
11.3.7 使用read和write函式讀寫套接字 312
11.3.8 使用getsockname和getpeername函式獲取套接字地址 312
11.3.9 使用send和recv函式傳送和接收數據 313
11.4 在嵌入式Linux中進行TCP編程 314
11.4.1 TCP基礎 315
11.4.2 TCP的工作流程 316
11.4.3 【套用實例】——使用TCP協定傳送當前系統時間 317
11.5 在嵌入式Linux中進行UDP編程 320
11.5.1 UDP基礎 320
11.5.2 UDP的工作流程 321
11.5.3 【套用實例】——使用UDP協定傳送當前系統時間 322
第四部分 綜 合 應 用
第12章 嵌入式Linux綜合套用實例 327
12.1 【套用實例】——定時創建檔案寫入數據 327
12.1.1 實例的需求說明和分析 327
12.1.2 實例的基礎設計 328
12.1.3 實例的綜合 333
12.2 【套用實例】——串口雙機通信 335
12.2.1 實例的需求說明和分析 335
12.2.2 實例的基礎設計 335
12.2.3 實例的綜合 346
12.3 【套用實例】——設計守護進程 348
12.3.1 實例的需求說明和分析 348
12.3.2 實例的基礎設計 349
12.3.3 實例的綜合 350
12.4 【套用實例】——設計生產者-消費者模型 351
12.4.1 實例的需求說明和分析 351
12.4.2 實例的基礎設計 352
12.5 【套用實例】——從網路伺服器獲取當前時間信息 356
12.5.1 實例的需求說明和分析 356
12.5.2 實例的基礎設計 356
12.5.3 實例的綜合 357
3.3.4 磁碟管理命令 70
3.3.5 用戶管理命令 73
3.3.6 網路管理命令 75
3.3.7 其他命令 76
第二部分 在ARM處理器系統上移植Linux作業系統
第4章 移植和使用嵌入式系統的引導軟體(Bootloader) 80
4.1 嵌入式系統的軟體開發 80
4.1.1 進行裸機開發 80
4.1.2 在嵌入式作業系統下進行開發 87
4.2 嵌入式系統的引導軟體基礎 87
4.2.1 Bootloader介紹 87
4.2.2 基於Bootloader的嵌入式架構 88
4.2.3 Bootloader的工作模式 89
4.2.4 Bootloader的啟動方式 89
4.2.5 Bootloader的啟動流程 91
4.2.6 常見的Bootloader 93
4.3 【套用實例】——移植Bootloader軟體U-Boot 93
4.3.1 U-Boot的特點和功能 93
4.3.2 U-Boot的原始碼結構分析 94
4.3.3 移植U-Boot 100
4.3.4 刻錄U-Boot 108
4.4 【套用實例】——使用U-Boot 112
4.4.1 使用超級終端和嵌入式系統進行通信 112
4.4.2 使用DNW下載工具和嵌入式系統進行通信 115
第5章 建立和使用嵌入式系統的交叉編譯環境 117
5.1 建立交叉編譯環境 117
5.1.1 交叉編譯環境的工具鏈 117
5.1.2 【套用實例】——安裝交叉編譯環境 118
5.2 使用交叉編譯環境 120
5.2.1 使用編輯器vim 120
5.2.2 使用編譯工具gcc 124
5.2.3 使用調試工具gdb 126
5.2.4 使用管理工具make 129
5.2.5 使用autotools 131
第6章 在嵌入式系統上移植作業系統和檔案系統 136
6.1 Linux核心移植基礎 136
6.1.1 Linux的核心組成 136
6.1.2 Linux核心的配置工具 137
6.2 【套用實例】——在嵌入式系統上移植Linux核心 139
6.2.1 配置核心 139
6.2.2 建立依賴關係 142
6.2.3 建立核心 142
6.3 檔案系統移植基礎 142
6.3.1 Linux檔案系統基礎 143
6.3.2 檔案系統的管理機制 144
6.3.3 嵌入式系統中的常用檔案系統介紹 145
6.4 【套用實例】——在嵌入式系統上移植檔案系統 148
6.4.1 檔案系統映像的製作 148
6.4.2 使用NFS檔案系統 151
第三部分 在Linux作業系統上進行軟體開發
第7章 在嵌入式Linux作業系統中進行C語言開發 155
7.1 Linux如何執行一個程式 155
7.2 Linux 的程式存儲空間 157
7.3 Linux C的main函式 158
7.4 【套用實例】——Hello GT2440 159
7.5 將程式下載到開發板 160
7.5.1 【套用實例】——使用隨身碟傳遞數據 160
7.5.2 【套用實例】——通過串口傳遞數據 160
7.6 Linux作業系統典型庫函式介紹及其使用 161
7.6.1 Linux的系統調用和庫函式基礎 161
7.6.2 【套用實例】——求平方根 162
7.6.3 【套用實例】——產生隨機數 163
7.6.4 【套用實例】——獲得系統時間和日期 164
7.6.5 【套用實例】——列印單字元 166
7.6.6 【套用實例】——將字元串轉換為數字 167
7.6.7 【套用實例】——字元串複製 167
7.6.8 【套用實例】——添加通訊錄條目 169
7.6.9 【套用實例】——記憶體映射 171
7.6.10 【套用實例】——標準輸入/輸出 172
第8章 在嵌入式Linux中進行檔案和流操作 175
8.1 Linux的檔案操作基礎 175
8.1.1 Linux的檔案系統介紹 175
8.1.2 Linux的檔案類型 179
8.2 Linux的基礎檔案操作 182
8.2.1 使用open函式打開檔案 182
8.2.2 使用close函式關閉檔案 184
8.2.3 使用create函式創建檔案 184
8.2.4 使用write函式寫檔案 185
8.2.5 使用lseek函式對檔案進行內部定位 186
8.2.6 使用read函式讀檔案 188
8.3 檔案的高級操作 190
8.3.1 使用stat函式操作檔案狀態 190
8.3.2 使用utime函式操作檔案時間 191
8.3.3 使用dup和dup2函式操作檔案的描述符 192
8.3.4 使用rename函式修改檔案的名稱 193
8.4 Linux的目錄檔案操作 194
8.4.1 創建和刪除目錄 194
8.4.2 打開、關閉目錄及對目錄的讀操作 195
8.5 Linux的流操作基礎 200
8.5.1 流和檔案的關係 200
8.5.2 流的結構和操作流程 201
8.5.3 Linux的標準流 202
8.6 Linux的流操作 203
8.6.1 打開和關閉流 203
8.6.2 設定流的緩衝區 205
8.6.3 使用字元方式對流進行讀寫 208
8.6.4 使用行方式對流進行讀寫 210
8.6.5 使用二進制方式對流進行讀寫 212
8.6.6 流的出錯處理 214
8.6.7 流的沖洗 215
8.6.8 在流中進行內部定位 215
第9章 在嵌入式Linux中進行進程和執行緒操作 219
9.1 Linux的進程基礎 219
9.1.1 Linux的進程及其執行過程 219
9.1.2 Linux的進程描述符和標識符 222
9.1.3 【套用實例】——獲取進程的用戶標識符 224
9.1.4 Linux的進程調度 225
9.1.5 Linux下的進程執行流程 226
9.2 在嵌入式Linux中進行進程操作 227
9.2.1 使用fork和vfork函式創建進程 227
9.2.2 使用exec系列函式執行進程 231
9.2.3 使用exit系列函式退出進程 235
9.2.4 調用wait系列函式銷毀進程 236
9.3 Linux的執行緒基礎 240
9.3.1 執行緒的運行方式 240
9.3.2 執行緒的標識符 241
9.3.3 用戶態執行緒和核心態執行緒 241
9.3.4 編譯帶執行緒的代碼 242
9.4 在嵌入式Linux中進行執行緒操作 242
9.4.1 調用pthread_create函式創建執行緒 242
9.4.2 調用pthread_exit函式退出執行緒 244
9.4.3 調用pthread_join函式阻塞執行緒 245
9.4.4 調用pthread_cancel函式取消執行緒 246
9.4.5 調用pthread_cleanup系列函式清理執行緒環境 247
9.4.6 調用pthread_deatch函式分離執行緒 249
9.4.7 執行緒和進程操作的總結和比較 251
第10章 在嵌入式Linux中進行進程間和執行緒間通信 252
10.1 Linux的進程通信和信號基礎 252
10.1.1 Linux的進程通信 252
10.1.2 Linux中的信號機制和信號 253
10.1.3 信號的工作方式 255
10.1.4 Linux下的信號說明 256
10.1.5 調用signal系列函式來註冊信號 259
10.2 Linux中信號的基礎操作 262
10.2.1 使用kill函式和raise函式傳送信號 262
10.2.2 使用alarm進行信號的定時操作 266
10.2.3 使用setitimer函式進行精確定時 267
10.2.4 使用abort傳送進程退出信號 269
10.3 Linux的管道和進程通信 269
10.3.1 管道基礎 269
10.3.2 管道的實現方法 270
10.3.3 管道讀寫操作規則 271
10.3.4 管道的特點 272
10.4 在Linux中進行管道操作 272
10.4.1 使用pipe函式來創建管道 273
10.4.2 【套用實例】——父子進程使用管道通信 273
10.4.3 【套用實例】——兄弟進程使用管道通信 274
10.4.4 管道的高級操作 276
10.5 Linux的命名管道基礎 277
10.5.1 在Linux中使用命名管道 278
10.5.2 命名管道的常用工作方式 279
10.5.3 命名管道的打開和讀寫 281
10.6 Linux的命名管道操作 282
10.6.1 使用mkfifo函式來創建命名管道 282
10.6.2 【套用實例】——命名管道的讀寫 283
10.7 Linux中的執行緒同步操作 285
10.7.1 使用互斥鎖實現執行緒同步 285
10.7.2 使用條件變數實現執行緒同步 288
第11章 在嵌入式Linux中進行網路編程 291
11.1 Linux的網路通信模型 291
11.1.1 OSI網路模型 291
11.1.2 TCP/IP協定和其網路模型 292
11.1.3 客戶端/伺服器結構 295
11.1.4 Linux的連線埠和套接字 295
11.1.5 Linux套接字的結構定義 297
11.2 在嵌入式Linux中進行網路基礎操作 298
11.2.1 使用位元組順序轉換函式族來轉換地址模式 298
11.2.2 使用位元組操作函式族操作多位元組數據 299
11.2.3 使用IP位址轉換函式族轉換IP位址 300
11.2.4 使用域名轉換函式族轉換域名 302
11.3 在嵌入式Linux中操作網路套接字 304
11.3.1 使用socket函式創建套接字 304
11.3.2 使用bind函式綁定套接字 305
11.3.3 使用connect函式建立連線 307
11.3.4 使用listen切換套接字為傾聽模式 309
11.3.5 使用accept函式接收連線 311
11.3.6 使用close函式關閉連線 311
11.3.7 使用read和write函式讀寫套接字 312
11.3.8 使用getsockname和getpeername函式獲取套接字地址 312
11.3.9 使用send和recv函式傳送和接收數據 313
11.4 在嵌入式Linux中進行TCP編程 314
11.4.1 TCP基礎 315
11.4.2 TCP的工作流程 316
11.4.3 【套用實例】——使用TCP協定傳送當前系統時間 317
11.5 在嵌入式Linux中進行UDP編程 320
11.5.1 UDP基礎 320
11.5.2 UDP的工作流程 321
11.5.3 【套用實例】——使用UDP協定傳送當前系統時間 322
第四部分 綜 合 應 用
第12章 嵌入式Linux綜合套用實例 327
12.1 【套用實例】——定時創建檔案寫入數據 327
12.1.1 實例的需求說明和分析 327
12.1.2 實例的基礎設計 328
12.1.3 實例的綜合 333
12.2 【套用實例】——串口雙機通信 335
12.2.1 實例的需求說明和分析 335
12.2.2 實例的基礎設計 335
12.2.3 實例的綜合 346
12.3 【套用實例】——設計守護進程 348
12.3.1 實例的需求說明和分析 348
12.3.2 實例的基礎設計 349
12.3.3 實例的綜合 350
12.4 【套用實例】——設計生產者-消費者模型 351
12.4.1 實例的需求說明和分析 351
12.4.2 實例的基礎設計 352
12.5 【套用實例】——從網路伺服器獲取當前時間信息 356
12.5.1 實例的需求說明和分析 356
12.5.2 實例的基礎設計 356
12.5.3 實例的綜合 357