嵌入式Linux上的C語言編程實踐

嵌入式Linux上的C語言編程實踐

《嵌入式Linux上的C語言編程實踐》是2008年由電子工業出版社出版的圖書,作者是韓超、魏治宇、 廖文江等。

基本信息

內容簡介

目前嵌入式技術和Linux程式開發技術成為計算機界比較流行的兩大技術。作為一種非常基礎

嵌入式Linux上的C語言編程實踐 嵌入式Linux上的C語言編程實踐
和常用的程式語言,C語言在嵌入式系統開發中體現了其強大的軟硬體操控能力。本書重點關注嵌入式Linux中的C語言編程,目的在於幫助讀者在基本掌握C語言的基礎上,逐漸掌握嵌入式Linux中的C語言開發技術。本書包含程式環境搭建、調試技術、庫函式、高級編程、程式最佳化等方面的知識。本書的講解由淺入深,知識點突出,其中的一些示例取自常見技術和項目中的精華,工程套用性強。
本書適合高校學生閱讀,幫助其向具有研發能力的工程技術人員過渡,同樣也適用於嵌入式軟體開發人員補充知識、開闊眼界。

作者簡介

韓超,畢業於北京交通大學電子學院,曾在北京亞嵌教育研究中心擔任嵌入式ARM-Linux系統平台的開發和教學工作,重視完整的知識體系與工程技術相結合。
魏治宇,畢業於北京交通大學電子學院,曾在北京亞嵌教育研究中心及其合作單位負責嵌入式Linux相關平台的教材編寫、軟體開發和實驗教學工作,對嵌入式系統理論知識與產品快速開發之間的關聯性有較深刻的理解。
寥文江,工學碩士,畢業於北京交通大學電子信息學院,目前在北京聯合大學自動化學院從事嵌入式及Linux教學工作。研究方向為嵌入式實時作業系統、FPGA、Soc等,參與完成多項國家級、省部級科研項目並發表多篇學術論文。

前言

《嵌入式Linux上的C語言編程實踐》是一本提高嵌入式開發基本功的圖書。本書的關鍵字為“嵌入式”和“C語言”。C語言是當前嵌入式領域開發中使用的主要語言,也是嵌入式開發最重要的基本功所在。同時,嵌入式領域的發展也為C語言提供了廣闊的套用場景。
本書特點
雖然以介紹C語言為主,但更重要的是體現了C語言、“嵌入式”和“Linux”的關係。
雖然是基於Linux開發環境來介紹C語言編程的知識和技巧,但是書中的開發理念和技巧也適用於其他作業系統。
深入地挖掘了C語言與硬體的關係,突出嵌入式系統中編程的基本理念。
目前單純講解C語言和嵌入式開發的書籍較多,但是將二者相結合的書籍還不多見,本書的目標就是將二者相結合,立志於提高讀者在嵌入式開發中最重要的基本功。
本書結構
本書由五個部分組成,即按照知識的組織結構,分成基礎知識、Linux環境中C語言的開發環境和工具、庫函式、C語言高級編程和在嵌入式環境下的C語言編程。
第一部分(第1~2章):基礎知識,體現本書Linux和嵌入式的特點。
第二部分(第3~6章):Linux環境中C語言的開發環境和工具,介紹最流行的文本編輯、程式開發、工程管理及調試工具。
第三部分(第7~8章):庫函式,分兩章、有重點地介紹C語言庫函式的使用。
第四部分(第9~12章):C語言高級編程,介紹一些C語言常用的語法特性。
第五部分(第13~15章):在嵌入式環境下的C語言編程,主要關注C語言在嵌入式系統中的理念和方法。
通過閱讀本書,讀者可以提高C語言高級編程的能力;學習Linux環境中C語言編程的方法;深入地理解C語言與底層硬體控制的關係;理解C語言在嵌入式領域內的套用。讀者可以在深入學習C語言的精華內容的同時,對嵌入式領域的開發有一個基本的了解。
閱讀前的準備
閱讀本書要求讀者具有C語言編程的基礎知識。在嵌入式開發領域,C語言也是最重要的程式語言之一,本書介紹了工程實踐中嵌入式系統的C語言編程的一些要點。這樣不僅可以使讀者提高嵌入式系統開發的能力,又可以加深對C語言精髓的理解。
在本書的學習過程中,讀者在手邊應該至少準備一套Linux相關的C語言開發環境,推薦使用Ubuntu、Fedora或OpenSuse等Linux發行版,並且至少需要安裝GCC工具。如果不方便使用Linux環境,也可以使用Windows中的Cygwin或DevC++。在文檔方面,除了參考相關書籍之外,最好的方式是使用Linux中的man文檔。推薦採用邊學邊練的方式,對於書中點到為止的知識,應深入學習、舉一反三,以求達到事半功倍的效果。
本書由北京亞嵌教育研究中心組織編寫,嵌入式系統資深工程師韓超結合該領域工程經驗、知識技術傳播經驗、教學經驗以及教材編寫經驗對全書進行規劃,力求全書符合大陸讀者閱讀習慣並且具有實用價值。本書的第1章、第2章、第4至6章、第11至15章由韓超編寫,第3章、第7章、第8章由魏治宇編寫,第9章由廖文江編寫,全書由韓超統稿。全書的審閱和修訂工作由韓超及亞嵌教育研究中心完成。此外參與本書編寫和審校工作的還有何曉龍、孫劍、夏鵬萬等。
本書的編寫結合了亞嵌教育研究中心的多位技術專家思想和教學思路,同時本書出版也是亞嵌多年開發和技術推廣的努力成果。

目錄

第一部分基礎知識
第1章Linux環境下C語言的開發2
1.1Linux下的C語言開發環境2
1.2在Linux中使用C語言開發3
1.2.1開發流程和開發工具3
1.2.2Linux中程式的運行原理4
第2章嵌入式環境中的C語言開發7
2.1嵌入式C語言的開發環境7
2.2嵌入式開發中C語言編程要點9
第二部分Linux環境中
C語言的開發環境和工具
第3章Linux的文本編輯工具VI12
3.1VI編輯器概述12
3.1.1VI簡介12
3.1.2VI的工作模式和使用
3.1.2之前的準備12
3.1.3進入和退出VI13
3.2VI的增強版VIM16
3.3VI編輯器的基本使用方法17
3.3.1在螢幕上移動游標17
3.3.2插入文本20
3.3.3刪除文本22
3.3.4修改文本內容25
3.3.5替換文本內容27
3.3.6合併文本內容30
3.3.7移動文本內容30
3.4VI編輯器的命令和高級操作32
3.4.1VI常用命令的列表32
3.4.2VI的一些高級的操作和
3.1.2使用技巧35
第4章GCC程式開發工具39
4.1GNU工具綜述39
4.2GCC的編譯和連線43
4.2.1工程示例43
4.2.2編譯、彙編和連線46
4.2.3動態庫48
4.3GCC的二進制工具49
4.3.1ar(歸檔工具)49
4.3.2readelf(讀取ELF格式
3.1.2檔案信息)51
4.3.3strings(查看字元串)54
4.3.4nm(顯示符號信息)55
4.3.5strip(刪除符號)57
4.3.6Objdump(顯示目標
3.1.2檔案信息)58
4.3.7objcopy(複製目標檔案)63
第5章make工程管理工具67
5.1make和Makefile67
5.1.1make機制概述67
5.1.2make和Makefile的使用68
5.2Makefile使用示例69
5.2.1簡單的Makefile69
5.2.2Makefile中的依賴關係71
5.2.3Makefile中使用隱含規則
3.1.2來編譯程式73
5.2.4Makefile中指定依賴關係的
3.1.2編譯76
5.3自動生成Makefile78
5.3.1自動生成Makefile的意義和
3.1.2相關工具78
5.3.2自動生成Makefile的流程79
第6章GDB調試工具85
6.1GDB簡介85
6.2使用GDB調試程式86
6.2.1基本操作88
6.2.2查看命令90
6.2.3高級命令92
6.2.4attach命令的使用94
6.3遠程GDB調試95
6.3.1本地GDB調試和遠程GDB
3.1.2調試的比較95
6.3.2遠程GDB調試流程97
6.3.3遠程GDB調試示例98
第三部分庫函式
第7章C語言標準庫函式106
7.1ISO的C語言標準庫函式
7.1分類106
7.2標準格式化輸入/輸出類函式107
7.2.1scanf函式:格式化輸入
3.1.2字元串107
7.2.2printf函式:格式化輸出
3.1.2字元串109
7.2.3putchar函式:輸出字元到
3.1.2標準輸出111
7.2.4getchar函式:從標準輸入
3.1.2獲取字元111
7.2.5putc函式:向檔案輸出字元112
7.2.6getc函式:從檔案輸入字元112
7.2.7gets函式:獲得字元串112
7.2.8puts函式:輸出指定字元串113
7.2.9ungetc函式:把字元
3.1.2寫回流中113
7.3字元處理類函式114
7.4字元串處理及轉換函式116
7.4.1sprintf函式:格式化輸出
3.1.2字元串到一個緩衝區116
7.4.2strcat和strncat函式:
3.1.2字元串連線119
7.4.3strcpy和strncpy函式:
3.1.2字元串複製120
7.4.4strcmp和strncmp函式:
3.1.2字元串比較121
7.4.5strlen函式:獲取字元串
3.1.2長度122
7.4.6strchr和strrchr函式:字元/
3.1.2字元串定位122
7.4.7strstr函式:字元串查找123
7.4.8strrev函式:字元串逆序124
7.4.9strupr和strlwr函式:字母
3.1.2形式轉換125
7.4.10strdup和strndup函式:
3.1.2字元串複製125
7.4.11memset函式:記憶體設定126
7.4.12memmove函式:記憶體移動126
7.4.13memcmp函式:記憶體比較127
7.4.14memcpy函式:記憶體複製128
7.5數學計算類函式128
7.6數據結構和算法類函式133
7.6.1bsearch函式:二元搜尋133
7.6.2lfind函式:線性搜尋134
7.6.3lsearch函式:線性搜尋135
7.6.4qsort函式:利用快速排序法
3.1.2排列數組136
7.6.5rand函式:產生隨機數136
7.6.6srand函式:設定隨機
3.1.2數種子137
7.7檔案I/O操作類相關函式137
7.7.1fopen函式:打開檔案138
7.7.2fclose函式:關閉檔案139
7.7.3fgetc函式:從檔案中讀取
3.1.2一個字元139
7.7.4fputc函式:將一指定字元
3.1.2寫入檔案流中139
7.7.5fgets函式:從檔案中讀取
3.1.2一字元串140
7.7.6fputs函式:將一指定的
3.1.2字元串寫入檔案內140
7.7.7rewind函式:重設檔案流的
3.1.2讀寫位置為檔案開頭141
7.7.8ftell函式:取得檔案流的
3.1.2讀取位置141
7.7.9fseek函式:移動檔案流的
3.1.2讀寫位置141
7.7.10fwrite函式:將數據寫至
7.7.10檔案流142
7.7.11fread函式:從檔案流讀取
7.7.10數據142
7.7.12remove函式:刪除檔案143
7.7.13rename函式:更改檔案
7.7.10名稱或位置143
7.7.14freopen函式:重新打開
7.7.10檔案144
7.7.15fflush函式:同步緩衝區144
7.7.16fgetpos函式:獲得檔案
7.7.10位置145
7.7.17fsetpos函式:設定檔案
7.7.10位置145
7.7.18mktemp函式:建立臨時
7.7.10檔案146
7.7.19tmpfile函式:臨時檔案146
7.7.20tmpnam:得到臨時檔案名稱147
7.8日期時間類函式147
7.8.1clock函式:獲得CPU時間148
7.8.2time函式:獲得當前日曆
7.8.2時間148
7.8.3difftime函式:獲得時間
7.8.2差值148
7.8.4gmtime函式:將日曆時間
7.8.2轉換成UTC時間149
7.8.5mktime函式:將UTC時間
7.8.2轉換成日曆時間149
7.8.6asctime函式:將UTC時間
7.8.2轉換成字元串149
7.8.7ctime函式:將日曆時間轉換
7.8.2成當地時間的字元串150
7.8.8localtime函式:將日曆時間
7.8.2轉換成本地時間150
7.8.9strftime函式:轉換日期和
7.8.2時間格式151
7.9國際化和本地化函式152
7.9.1Setlocale函式:本地化控制
7.8.2函式153
7.9.2localeconv函式:本地化
7.8.2轉換154
7.10錯誤處理類函式155
7.10.1clearerr函式:清除流中的
7.10.1結束指示符和錯誤指示符155
7.10.2feof函式:指示檔案結束155
7.10.3ferror函式:指示檔案出錯156
7.10.4perror函式:輸出出錯信息156
7.10.5errno函式:錯誤編號記錄156
7.11其他一些工具函式157
7.11.1assert函式:程式診斷157
7.11.2長跳轉函式157
7.11.3可變長的參數控制函式160
7.11.4獲取結構體成員函式
7.10.1(宏)161
7.12一些標準庫中有用的宏161
第8章Linux中C語言的擴展庫
函式163
8.1檔案I/O操作函式163
8.1.1open函式:打開檔案163
8.1.2close函式:關閉檔案164
8.1.3read函式:讀檔案165
8.1.4write函式:寫檔案165
8.1.5lseek函式:檔案定位167
8.1.6ioctl函式:檔案控制167
8.1.7flock函式:鎖定檔案167
8.1.8mmap函式和munmap函式:
8.1.8記憶體映射168
8.1.9create函式:創建新檔案170
8.1.10dup函式和dup2函式:
8.1.10複製檔案描述符171
8.1.11fcntl函式:改變已打開的
8.1.10檔案的屬性171
8.2檔案許可權相關的操作函式172
8.2.1access函式:判斷是否
8.2.1具有存取檔案的許可權172
8.2.2chown函式和fchown函式:
8.2.1改變檔案的所有者173
8.2.3chmod函式和fchmod函式:
8.2.1改變許可權173
8.2.4unlink函式:刪除檔案173
8.2.5utime函式和utimes函式:
8.2.1改變檔案時間174
8.2.6umask函式:設定建立
8.2.1新檔案時的許可權掩碼175
8.2.7link函式:建立檔案連線175
8.2.8stat函式、fstat函式和lstat
8.2.1函式:獲取檔案信息175
8.3用戶組操作函式176
8.3.1getgid函式和setgid函式:
8.2.1獲得/設定組識別碼176
8.3.2getegid函式和setegid函式:
8.2.1獲得/設定有效的組識別碼177
8.3.3getuid函式和setuid函式:
8.2.1獲得/設定真實的用戶識別碼177
8.3.4geteuid函式和seteuid函式:
8.2.1獲得/設定有效的用戶識別碼178
8.3.5getgroups函式和setgroups
8.2.1函式:獲得/設定組代碼178
8.4信號類函式179
8.4.1kill函式:傳送信號給指定的
8.2.1進程181
8.4.2raise函式:信號傳送函式181
8.4.3alarm函式:設定逾時函式182
8.4.4signal函式:信號安裝函式182
8.5進程處理函式183
8.5.1getpid函式和getppid函式:
8.2.1獲得進程ID和父進程ID183
8.5.2fork函式:建立子進程183
8.5.3sleep函式和usleep函式:
8.2.1讓進程暫停執行一段時間185
8.5.4exec函式族:找到可執行
8.2.1檔案185
8.5.5_exit函式和_Exit函式:
8.2.1結束進程執行188
第四部分C語言高級編程
第9章動態記憶體的堆與棧190
9.1程式記憶體區域的使用190
9.1.1靜態記憶體與動態記憶體190
9.1.2C語言中的動態記憶體191
9.2C程式中棧空間的使用196
9.2.1參數使用棧空間196
9.2.2自動變數使用棧空間199
9.2.3程式中較大的棧201
9.2.4棧空間的特性202
9.3C程式中的堆空間使用203
9.3.1分配和釋放堆記憶體的庫函式203
9.3.2庫函式使用204
9.3.3堆記憶體的特性218
9.4堆記憶體和棧記憶體使用的比較222
9.4.1利用返回值傳遞信息222
9.4.2利用參數傳遞信息226
9.4.3堆與棧記憶體管理的區別231
第10章函式指針的使用232
10.1函式指針的概念232
10.1.1C語言函式的本質232
10.1.2函式指針在C語言中的
10.1.2意義234
10.2函式指針的使用237
10.2.1函式指針使用初步237
10.2.2函式指針的類型定義240
10.2.3函式指針作為結構體成員242
10.2.4函式指針作為函式的參數243
10.2.5函式指針作為函式的
10.2.5返回值244
10.2.6函式指針數組246
10.3函式指針使用示例248
第11章回調函式的使用252
11.1回調函式的概念與作用252
11.1.1程式調用的方式252
11.1.2回調函式的作用254
11.2回調函式的語法254
11.2.1簡單的回調函式254
11.2.2完全形式的回調函式256
11.3回調函式的使用259
11.3.1qsort中的回調函式259
11.3.2atexit和on_exit函式的
10.2.5註冊退出函式263
第12章C語言實現對象編程268
12.1C語言實現基於對象編程的
12.1概念與作用268
12.2C語言基於對象編程實現
12.1封裝269
12.2.1簡單的程式示例269
12.2.2C語言基於對象編程的
10.2.5詳解272
12.2.3C語言基於對象編程與
10.2.5C++面向對象編程的對比275
12.3C語言基於對象編程實現
12.3部分繼承功能278
12.3.1利用數據結構的包含實現
10.2.5繼承功能279
12.3.2利用私有指針實現繼承
10.2.5功能282
12.3.3C語言實現繼承的總結287
12.4C語言基於對象編程實現
12.4部分多態功能288
12.4.1利用操作指針組的包含
10.2.5實現多態功能288
12.4.2C語言實現多態功能的總結292
12.5對C語言實現基於對象
12.5編程的思考292
12.5.1C語言基於對象編程的
10.2.5特性292
12.5.2C語言基於對象編程中接口、
10.2.5實現和調用者的關係293
第五部分在嵌入式
環境下的C語言編程
第13章C語言程式的記憶體布局295
13.1C語言程式的存儲區域295
13.2C語言程式的段297
13.2.1段的分類297
13.2.2程式中段的使用298
13.3可執行程式的連線301
13.3.1可執行程式的組成301
13.3.2各個目標檔案的關係303
13.3.3連線錯誤示例304
13.4C語言程式的運行309
13.4.1RAM調試運行311
13.4.2固化程式的XIP運行312
13.4.3固化程式的載入運行313
13.4.4C語言程式的運行總結315
第14章嵌入式C語言常用語法317
14.1記憶體指針操作317
14.1.1記憶體操作的意義317
14.1.2使用指針操作記憶體319
14.1.3volatile的使用324
14.1.4嵌入式系統指針的實際
10.2.5套用325
14.2位操作327
14.2.1位操作的意義327
14.2.2位操作的語法328
14.3大小端與對齊問題330
14.3.1大小端問題331
14.3.2記憶體對齊問題335
14.3.3結構體成員的對齊問題338
14.4程式的跳轉344
14.4.1嵌入式系統程式跳轉的
10.2.5類型344
14.4.2C語言中實現程式的跳轉345
第15章嵌入式C語言編程的技巧348
15.1程式的最佳化技巧348
15.1.1循環緩衝區348
15.1.2查表法350
15.1.3針對循環執行效率的
10.2.5最佳化353
15.2關於小數運算355
15.3函式參數和返回值的傳遞357
15.4變數的初始化技巧360
15.4.1數組的初始化360
15.4.2結構體的初始化362
15.4.3變數的初始化總結362
15.5程式的調試和宏使用的技巧363
15.5.1列印檔案、函式和程式行363
15.5.2#:字元串化操作符364
15.5.3##:連線操作符366
15.5.4調試宏的第一種定義方式367
15.5.5調試宏的第二種定義方式368
15.5.6對調試語句進行分級審查369
15.5.7條件編譯調試語句370
15.5.8使用do…while的宏定義372
15.6代碼剖析373
參考文獻378

相關詞條

相關搜尋

熱門詞條

聯絡我們