ARM嵌入式Linux系統開發技術詳解

ARM嵌入式Linux系統開發技術詳解

《ARM嵌入式Linux系統開發技術詳解》是2008年電子工業出版社出版的圖書,作者是楊水清。

宣傳語

繼《Windows驅動開發技術詳解》之後又一本心血力作!

原創經典,嵌入式系統一線工程師傾力打造。

深入Linux系統底層和核心,透析ARM嵌入式Linux系統開發的本質。

通過嵌入式系統開發實例,歸納ARM嵌入式Linux系統開發的整個過程。

內容簡介

本書由淺入深、通俗易懂地講解了嵌入式Linux的系統設計與開發。從嵌入式處理器ARM開始,講解了ARM處理器的資源、ARM的指令集、ADS開發工具、嵌入式系統硬體環境的構建、Boot Loader、Linux核心移植、嵌入式檔案系統、嵌入式Linux多任務程式開發、嵌入式Linux設備驅動開發、嵌入式Linux網路程式開發、MiniGUI圖形界面開發、設備驅動開發案例、綜合案例等內容。

書中通過大量的例程來講解知識要點,並提供了大量極有參考價值的開發案例,讀者可以通過這些例程和開發案例對嵌入式Linux開發有一個系統的學習和提高。

本書共有四個方面的內容。在嵌入式系統的硬體結構中講述了嵌入式處理器ARM的特點、嵌入式系統硬體環境的構建和ADS開發工具的使用。在嵌入式Linux系統移植中講述了目標板軟體環境的構建,主要包括Boot Loader、Linux核心、檔案系統以及交叉開發環境的構建。在嵌入式Linux軟體開發中講述了嵌入式Linux C語言開發工具的使用、標準庫的使用、多任務開發基礎和設備驅動開發基礎。在嵌入式套用系統實例分析中講述了嵌入式Linux的網路程式開發、MiniGUI圖形界面開發、CAN匯流排設備驅動設計、DM9000網路驅動設計、SD卡驅動設計和嵌入式B超系統設計。

本書語言通俗易懂,內容豐富,注重理解與實例,知識涵蓋面廣。非常適合從事嵌入式Linux系統開發的初級工程師、高校學生、Linux程式開發人員閱讀和學習。

前言

你想知道手中的MP4由什麼組成嗎?

你想親手製作一個電子相框嗎?

你想深入研究作業系統核心,學習編寫驅動程式嗎?

你想為嵌入式系統設計功能強大的圖形界面嗎?

你想知道一個真實的嵌入式系統是如何從無到有建立起來的嗎?

本書將從作者親身開發的經驗帶給你詳細實用的解答!

嵌入式Linux開發的前景

嵌入式產業發展迅猛,已成為計算機體系的重要組成部分。嵌入式系統產品正不斷滲透各個行業,其產業增幅也不斷加大。在計算機後PC技術時代,嵌入式系統將擁有最大的市場。任何一個普通人都可以擁有從小到大的各種使用嵌入式技術的電子產品,小到手機、MP3等,大到智慧型家電、車載電子設備等。在工業和服務領域中,使用了嵌入式技術的數字工具機、工業機器人、安全系統等也在逐漸改變傳統工業和服務方式。正是因為有如此大的需求,所以促使筆者結合多年的開發經驗,編寫了本書。

本書特點

1.注重讀者的學習與接受情況:在嵌入式Linux系統下進行開發,一個很大的困難就是各種工具紛繁複雜,不知從何入手。本書在每個部分都安排了一章,引導讀者一步一步熟悉各種開發工具和環境,使讀者首先建立起感性認識,為進一步深入學習打下基礎。

2.代碼注釋規範細緻:為了便於讀者學習,在實例代碼中,進行了非常詳細的注釋。這些注釋可以引導讀者理解和掌握編寫程式的關鍵過程。例如下面的代碼,是C語言標準庫章節中的實例。在實例中,對代碼的檔案名稱、代碼的作用和重要函式的功能提示,都體現在了代碼注釋中。

/**********************************************************************************/

/*檔案:program_16_3.c */

/*簡介:將字元串a,b,c分別採用10,2,16進制轉換成數字 */

/**********************************************************************************/

#include <stdio.h>

#include <stdlib.h>

int main()

{

char *a="1000000000";

char *b="1000000000";

char *c="ffff";

/*將字元串a採用10進制轉換成數字*/

printf("a=%d\n",strtol(a,NULL,0));

/*將字元串b採用2進制轉換成數字*/

printf("b=%d\n",strtol(b,NULL,2));

/*將字元串c採用16進制轉換成數字*/

printf("c=%d\n",strtol(c,NULL,16));

return 0;

}

3.Eclipse集成開發環境:長期以來Linux開發沒有統一的開發平台,大多數的開發者都直接使用VI、GCC等命令行工具,這樣其實不利於大型項目的開發,這也是很多開發者感到遺憾的地方。筆者經過多年的比較,引入了Eclipse作為進行嵌入式Linux開發的集成開發環境,取得了很好的效果(如下圖所示),因此把它介紹給讀者。

4.起點高、內容新:市場上大多介紹嵌入式Linux開發的同類書籍都是基於Linux 2.4核心的,2.6版本的核心已經十分成熟了,取代2.4版本的核心指日可待。而且,與之配套的還需要基於2.6核心的Linux開發平台。因此筆者選擇了基於2.6核心的Ubuntu系統、arm-linux-gcc 3.4作為開發平台(如下圖所示),介紹給讀者,幫助讀者搶占嵌入式Linux開發領域的制高點。

5.內容深入:本書在注重基礎和實際的同時,注重知識的擴充。設備驅動開發、網路程式設計和圖形界面編程是在實際中套用極為廣泛的內容,本書中對這些知識的講述可以使讀者對嵌入式Linux系統的開發有一個從書本到實踐的本質上的提高。

本書適合的讀者

嵌入式Linux開發入門者;

高校計算機、電子專業學生;

高校畢業設計的學生;

嵌入式Linux愛好者;

嵌入式Linux相關學習和研究的研究生;

嵌入式Linux程式設計師。

致謝

感謝吳偉的通力合作,精心撰寫了第11章、第15章和第19章。

感謝我們的家人(唐穎、俞秋華),是你們的支持使我們堅持寫完本書。

感謝所有開放源碼軟體和開發文檔的作者們。

目錄

第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 10

2.2.4 ADS的簡單使用 12

2.2.5 使用Telnet和ftp 15

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 AC97音頻解碼器接口 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 ARM10微處理器 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指令集詳解 37

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 CodeWarrior集成開發環境 55

5.1.7 ADS調試器 56

5.1.8 實用程式 57

5.1.9 支持的軟體 57

5.2 使用ADS創建工程 57

5.2.1 建立一個工程 58

5.2.2 編譯和連結工程 60

5.2.3 target設定選項 60

5.2.4 Language Settings 61

5.2.5 Linker設定 62

5.2.6 ARM fromELF工具 63

5.2.7 命令行下編譯工程 64

5.3 使用AXD調試代碼 65

5.3.1 打開調試檔案 65

5.3.2 查看存儲器內容 65

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接口 70

6.2 底板電路 73

6.2.1 電源電路 73

6.2.2 串口電路 74

6.2.3 USB接口 74

6.2.4 乙太網接口 76

6.2.5 JTAG調試接口 76

6.2.6 音頻接口 76

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

本章主要介紹了嵌入式開發環境的構建過程,首先對交叉開發的概念進行了介紹,說明了在嵌入式系統的開發中採用交叉開發的原因。然後分別介紹了主機環境和目標板系統環境的構建過程,同時對這兩個環境的連線方式也做了簡要的介紹。

最後介紹了目標板系統的三個主要方面: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章 Boot Loader 140

本章介紹了Boot Loader的概念、基本結構,並對Boot Loader的一般工作原理進行了介紹,重點介紹了vivi和U-Boot的開發調試及使用。通過學習這兩種常見的Boot Loader,可以使讀者實際接觸到Boot Loader的工作原理和代碼實現。

10.1 Boot Loader的概念 140

10.1.1 Boot Loader所支持的嵌入式體系 141

10.1.2 Boot Loader的安裝位置 141

10.1.3 Boot Loader的啟動過程 142

10.1.4 Boot Loader與主機的通信 142

10.1.5 Boot Loader的操作模式 142

10.2 Boot Loader的基本結構 143

10.2.1 Boot Loader的stage1 143

10.2.2 Boot Loader的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命令 162

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檔案系統的工作原理 211

12.2.4 CramFS檔案系統的初始化過程 212

12.2.5 CramFS檔案系統的製作 213

12.2.6 CramFS檔案系統的掛載流程 216

12.3 YAFFS檔案系統 216

12.3.1 YAFFS檔案系統的數據存儲方式 217

12.3.2 YAFFS檔案系統的工作原理 218

12.3.3 YAFFS檔案系統對MTD的依賴性 219

12.3.4 YAFFS檔案系統驅動的安裝流程 221

12.3.5 YAFFS檔案系統的製作 222

12.4 JFFS檔案系統 223

12.4.1 JFFS1檔案系統簡介 224

12.4.2 JFFS2檔案系統簡介 225

12.4.3 JFFS3檔案系統簡介 227

12.4.4 JFFS2檔案系統的工作原理 227

12.4.5 JFFS2檔案系統的製作 230

12.5 基於RAM的檔案系統 231

12.5.1 Ramdisk檔案系統 231

12.5.2 RamFS/TmpFS檔案系統 232

12.6 嵌入式檔案系統的設計 233

12.6.1檔案系統格式選擇的基本策略 233

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 管道 398

18.2.1 管道的相關概念 398

18.2.2 管道的創建 398

18.2.3 多進程中的管道通信 400

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_

18.9.5 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 塊設備驅動編寫 457

19.3.1 塊設備的I/O操作特點 457

19.3.2 block_device_operations結構體 457

19.3.3 gendisk結構體 458

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函式 469

19.3.11 I/O請求處理 469

19.4 本章小結 472

第20章 嵌入式Linux的網路編程 473

本章介紹了開發嵌入式Linux網路程式的基本流程,先後分析了TCP Sever程式、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() 504

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,對這個例程的三個主要視窗的設計與編寫做了詳細的介紹。

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 讀寫配置檔案 548

21.8.2 定點數運算 548

21.9 MiniQQ界面設計 549

21.9.1 登錄視窗 551

21.9.2 好友列表視窗 554

21.9.3 聊天視窗 558

21.9.4 其他 559

21.10 本章小結 560

第22章 CAN匯流排驅動設計 561

隨著需求的發展,許多工業控制場合需要嵌入式設備,需要提供CAN匯流排接口,來連線CAN設備,以滿足套用的需要。本章詳細介紹了CAN匯流排的基礎知識,對Linux系統下的CAN驅動程式進行了詳細的分析。最後結合本書使用的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卡驅動程式設計 585

23.3 本章小結 588

第24章 網路驅動設計 589

進入21世紀,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 604

25.2.2 嵌入式Linux移植 605

25.2.3 MiniGUI移植 605

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 多執行緒編程 615

25.7 操作界面設計 616

25.7.1 區域分配 616

25.7.2 鍵盤回響 616

25.7.3 控制項設計 617

25.8 測量模組設計 618

25.8.1 橢圓的畫法 619

25.8.2 橢圓測量周長和面積 620

25.8.3 軌跡法測量面積 620

25.9 本章小結 620

相關詞條

相關搜尋

熱門詞條

聯絡我們