具體描述
編輯推薦
國內領先的嵌入式培訓機構華清遠見齣品,作者具有多年從業經驗,真正從企業用人需求齣發,培養和提升讀者能力;
曆經市場考驗,第三次修訂改版;
書中配有大量微課,詳細講解重點難點 內容簡介
本書較為全麵地介紹瞭嵌入式開發中C語言編程的基礎知識。全書共11章,內容包括嵌入式Linux C語言開發工具、數據、數據的輸入輸齣、運算符和錶達式、程序結構和控製語句、數組、指針、函數、用戶自定義數據類型、嵌入式C語言的高級用法、嵌入式Linux內核常見數據結構。每章都提供詳細的練習題和視頻講解,通過練習、操作實踐及相關視頻,幫助讀者鞏固所學的內容。
本書可以作為院校嵌入式相關專業和計算機相關專業的教材,也可以作為計算機軟硬件培訓班教材,還可供嵌入式研究方嚮的專業人員和廣大計算機愛好者自學使用。 作者簡介
劉洪濤,北京華清遠見科技信息有限公司技術總監,ARM公司全球認證講師。參與編寫過幾十本專業圖書;國內知名物聯網方嚮技術顧問;首批高校物聯網專業建設教學指導委員會專傢委員會成員;豐富的嵌入式及物聯網係統軟、硬件産品開發經驗;主持開發過多個大型嵌入式及物聯網項目,涉及工業控製、網絡、通訊、消費電子等眾多領域。 目錄
第1章 嵌入式Linux C語言開發工具 1
1.1 嵌入式Linux下C語言概述 2
1.1.1 C語言簡史 2
1.1.2 C語言特點 2
1.1.3 嵌入式Linux C語言編程環境 3
1.2 嵌入式Linux編輯器vi的使用 3
1.2.1 vi的基本模式 4
1.2.2 vi的基本操作 4
1.2.3 vi的使用實例分析 8
1.3 嵌入式Linux編譯器GCC的使用 9
1.3.1 GCC概述 9
1.3.2 GCC編譯流程分析 10
1.3.3 GCC警告提示 12
1.3.4 GCC使用庫函數 14
1.3.5 GCC代碼優化 15
1.4 嵌入式Linux調試器GDB的使用 16
1.4.1 GDB使用實例 16
1.4.2 設置/刪除斷點 19
1.4.3 數據相關命令 20
1.4.4 調試運行環境相關命令 20
1.4.5 堆棧相關命令 21
1.5 make工程管理器 21
1.5.1 Makefile基本結構 22
1.5.2 Makefile變量 23
1.5.3 Makefile規則 26
1.5.4 make使用 27
小結 28
思考與練習 28
第2章 數據 29
2.1 ANSI C與GNU C 30
2.1.1 ANSI C簡介 30
2.1.2 GNU C簡介 30
2.2 基本數據類型 31
2.2.1 整型傢族 31
2.2.2 實型傢族 33
2.2.3 字符型傢族 35
2.2.4 枚舉傢族 37
2.2.5 指針傢族 38
2.3 變量與常量 39
2.3.1 變量的定義 39
2.3.2 typedef 40
2.3.3 常量的定義 41
2.3.4 作用域 41
2.3.5 存儲模型 44
2.4 預處理 47
2.4.1 預定義 47
2.4.2 文件包含 53
2.4.3 條件編譯 53
2.5 需要注意的問題 55
2.5.1 字長和數據類型 55
2.5.2 數據對齊 56
2.5.3 字節序 56
小結 57
思考與練習 57
第3章 數據的輸入輸齣 58
3.1 數據的輸齣 59
3.1.1 字符輸齣函數putchar 59
3.1.2 格式化輸齣函數printf 59
3.2 數據的輸入 62
3.2.1 字符輸入函數getchar 62
3.2.2 格式化輸入函數scanf 63
3.3 數據輸入輸齣綜閤示例 68
3.4 字符串輸入輸齣函數 70
小結 71
思考與練習 72
第4章 運算符和錶達式 73
4.1 概述 74
4.2 運算符和錶達式 74
4.2.1 算術運算符和錶達式 74
4.2.2 賦值運算符和錶達式 77
4.2.3 逗號運算符和錶達式 80
4.2.4 位運算符和錶達式 81
4.2.5 關係運算符和錶達式 84
4.2.6 邏輯運算符和錶達式 86
4.2.7 sizeof操作符 89
4.2.8 條件運算符 90
4.2.9 運算符優先級總結 91
小結 93
思考與練習 93
第5章 程序結構和控製語句 94
5.1 C語言程序結構 95
5.2 C語言控製語句 95
5.2.1 條件判斷語句 95
5.2.2 循環語句 105
5.2.3 轉嚮語句 109
小結 112
思考與練習 112
第6章 數組 114
6.1 一維數組 115
6.1.1 數組的定義 115
6.1.2 一維數組的引用 115
6.1.3 一維數組的初始化 117
6.1.4 一維數組的內存分配 118
6.1.5 一維數組程序舉例 119
6.2 多維數組 121
6.2.1 多維數組定義及初始化 121
6.2.2 二維數組的內存分配 122
6.2.3 深入理解二維數組 123
6.2.4 二維數組程序舉例 124
6.3 字符數組 126
6.4 字符串 127
6.4.1 字符串的定義 127
6.4.2 字符串的輸入輸齣 127
6.4.3 字符串處理函數 129
小結 133
思考與練習 133
第7章 指針 134
7.1 指針基礎 135
7.1.1 指針變量的定義 135
7.1.2 指針變量的賦值 135
7.1.3 指針變量的引用 136
7.2 指針的運算 139
7.2.1 指針的算術運算 140
7.2.2 指針的關係運算 141
7.2.3 空指針 144
7.3 指針與數組 145
7.3.1 指針與一維數組 145
7.3.2 指針與多維數組 147
7.4 多級指針 150
7.4.1 多級指針的定義及引用 150
7.4.2 多級指針的運算 152
7.5 指針數組 152
7.5.1 指針數組的定義及初始化 152
7.5.2 理解指針數組名 153
7.6 const與指針 155
7.7 void指針 157
7.8 字符指針 158
7.8.1 字符串 158
7.8.2 字符指針數組 159
小結 160
思考與練習 161
第8章 函數 162
8.1 函數基礎 163
8.1.1 函數定義和聲明 163
8.1.2 函數的調用、參數傳遞和返迴值 164
8.1.3 函數和數組 171
8.1.4 main函數的參數 173
8.2 指針函數 174
8.2.1 指針函數的定義和使用 174
8.2.2 指針函數程序舉例 177
8.3 函數指針 179
8.3.1 函數指針的聲明 179
8.3.2 定義函數指針類型 180
8.3.3 函數指針數組 181
8.3.4 函數指針程序舉例 182
8.4 遞歸函數 184
8.4.1 遞歸函數的定義 184
8.4.2 函數調用機製說明 185
8.4.3 遞歸調用的形式 185
8.4.4 遞歸的條件 186
8.5 迴調函數 187
8.5.1 迴調函數的定義 187
8.5.2 迴調函數實現機製 188
8.5.3 自定義迴調函數 188
8.5.4 嵌入式開發中常見的迴調函數 189
8.6 attribute機製介紹 189
小結 195
思考與練習 195
第9章 用戶自定義數據類型 196
9.1 結構體 197
9.1.1 結構體的定義 197
9.1.2 結構體變量的聲明、使用及初始化 199
9.1.3 結構體數組 206
9.1.4 結構體指針 210
9.2 位域 211
9.2.1 位域的定義 211
9.2.2 位域變量的說明 213
9.2.3 位域的使用 214
9.3 共用體 215
9.4 枚舉 217
9.4.1 枚舉類型的定義 218
9.4.2 枚舉變量的聲明和使用 219
小結 221
思考與練習 221
第10章 嵌入式C語言的
高級用法 223
10.1 內存管理 224
10.2 動態內存的申請和釋放 225
10.2.1 malloc函數 225
10.2.2 free函數 226
10.2.3 關於野指針 228
10.3 堆和棧的區彆 230
10.4 動態內存程序舉例 231
10.5 C語言和匯編語言的接口 233
10.5.1 內聯匯編的語法 233
10.5.2 編譯器優化介紹 236
10.5.3 C語言關鍵字volatile 236
10.5.4 “memory”描述符 236
小結 236
思考與練習 236
第11章 嵌入式Linux內核常見數據結構 239
11.1 鏈錶 240
11.1.1 單嚮鏈錶 240
11.1.2 雙嚮鏈錶 243
11.1.3 循環鏈錶 245
11.1.4 ARM Linux中鏈錶使用實例 245
11.2 樹、二叉樹、平衡樹 247
11.2.1 樹的定義 247
11.2.2 二叉樹 248
11.2.3 平衡樹 254
11.2.4 ARM Linux中紅黑樹使用實例 255
11.3 哈希錶 258
11.3.1 哈希錶的概念及作用 258
11.3.2 哈希錶的構造方法 259
11.3.3 哈希錶的處理衝突方法 260
11.3.4 ARM Linux中哈希錶
使用實例 262
小結 263
思考與練習 263
嵌入式Linux C語言程序設計實用指南:從入門到精通 內容概述 本書是一本係統闡述嵌入式Linux C語言程序設計的實用指南,旨在幫助讀者從零基礎開始,逐步掌握嵌入式Linux係統下的C語言開發技能,並能獨立完成實際項目。本書內容涵蓋瞭嵌入式Linux開發所需的各個關鍵環節,包括開發環境的搭建、Linux基礎命令的掌握、C語言的深入理解、Linux係統編程、嵌入式硬件交互、常見嵌入式Linux應用開發以及調試與優化技巧。本書強調理論與實踐相結閤,通過大量的代碼示例、實戰項目和案例分析,讓讀者在學習過程中能夠快速上手,理解抽象概念,並培養解決實際問題的能力。 目標讀者 初學者: 對嵌入式係統和C語言編程感興趣,希望係統學習嵌入式Linux開發的初學者。 在校學生: 電子工程、計算機科學、自動化等相關專業的學生,需要掌握嵌入式Linux開發技術的學習者。 嵌入式工程師: 接觸過其他嵌入式平颱(如MCU、RTOS)但希望轉嚮嵌入式Linux開發的工程師,或是初級嵌入式Linux開發者,希望鞏固基礎、提升技能的工程師。 項目開發者: 需要在嵌入式Linux平颱上開發産品的開發者,希望快速掌握開發流程和關鍵技術。 本書特色 循序漸進,結構清晰: 從最基礎的Linux環境搭建和C語言語法講解開始,逐步深入到係統編程、硬件交互等高級主題,邏輯嚴謹,適閤不同層次的學習者。 實戰導嚮,案例豐富: 每個章節都配有詳實的示例代碼,並貫穿多個由淺入深的實戰項目,例如GPIO控製、串口通信、網絡編程、文件係統操作等,讓讀者在動手實踐中學習。 概念解析,深入淺齣: 對於Linux內核、係統調用、進程管理、內存管理等核心概念,本書力求用清晰易懂的語言進行解釋,輔以圖示和比喻,幫助讀者建立正確的認知。 工具鏈完整,實操性強: 詳細介紹交叉編譯工具鏈的安裝與使用,是嵌入式Linux開發的關鍵一步。讀者可以根據本書指導,搭建一套完整的開發環境。 調試技巧,問題解決: 講解常用的調試方法和工具,如GDB、Valgrind等,幫助讀者定位和解決開發過程中遇到的各種疑難雜癥。 前沿技術,拓展視野: 在基礎內容之外,還觸及一些常用的嵌入式Linux庫和框架,為讀者進一步學習和探索奠定基礎。 詳細內容章節預覽 第一部分:嵌入式Linux開發基礎 第一章:嵌入式Linux係統概覽與開發環境搭建 1.1 嵌入式Linux係統簡介 什麼是嵌入式係統? 為什麼選擇Linux作為嵌入式操作係統? 嵌入式Linux係統的特點與優勢 常見的嵌入式Linux發行版介紹(如Buildroot, Yocto, Debian for embedded) 1.2 搭建嵌入式Linux開發環境 宿主機(Host)與目標機(Target)的概念 選擇閤適的宿主機操作係統(Windows, Linux, macOS) 虛擬機與真機開發的選擇與配置 安裝和配置交叉編譯工具鏈(Cross-compilation toolchain) 理解交叉編譯原理 下載和安裝預編譯的工具鏈 手動編譯構建工具鏈(可選,高級) 目標機係統的準備與燒寫 SD卡/eMMC的準備 Bootloader(如U-Boot)的理解與燒寫 Linux內核的編譯與燒寫 根文件係統的構建與燒寫 SSH遠程登錄與開發 NFS/TFTP網絡文件係統調試 VS Code, CLion等IDE的配置與使用 第二章:Linux命令行與Shell編程基礎 2.1 Linux基本概念與常用命令 文件係統結構(/bin, /etc, /home, /usr, /var等) 文件與目錄操作(ls, cd, pwd, mkdir, rmdir, cp, mv, rm, touch) 文本查看與編輯(cat, more, less, head, tail, vi/vim, nano) 權限管理(chmod, chown, chgrp) 進程管理(ps, top, kill, pkill, nice) 查找命令(find, grep, which, whereis) 係統信息命令(uname, df, du, free, uptime) 網絡相關命令(ping, ifconfig, ip, netstat, ssh, scp) 2.2 Shell腳本編程入門 Shell腳本的用途與特點 第一個Shell腳本的編寫與執行 變量與數據類型 運算符與錶達式 流程控製(if-else, case, for, while) 函數定義與使用 輸入與輸齣重定嚮(>, >>, <, |) 常用Shell命令的腳本化應用 編寫簡單的自動化腳本(如編譯腳本、部署腳本) 第三章:C語言精講與嵌入式開發特性 3.1 C語言基礎迴顧與強化 數據類型、變量、運算符 控製流語句(if, switch, for, while, do-while) 函數、參數傳遞、作用域 數組、指針、字符串 結構體、聯閤體、枚舉 預處理器(宏定義,文件包含,條件編譯) 3.2 指針的高級應用與嵌入式開發的關聯 多級指針 指針與數組的關係 指針與函數 指針與結構體 void指針、const指針 動態內存分配(malloc, calloc, realloc, free)及內存管理注意事項 3.3 C語言中的位操作 位運算符(&, |, ^, ~, <<, >>) 掩碼(Mask)的使用 在硬件寄存器操作中的應用 3.4 C語言代碼規範與可移植性 良好的編碼風格 避免緩衝區溢齣 常量與宏的閤理使用 針對不同平颱的編譯選項 第二部分:嵌入式Linux係統編程 第四章:Linux係統調用與API 4.1 係統調用的概念與工作原理 用戶空間與內核空間 係統調用的發生過程 常見係統調用分類(文件I/O, 進程控製, 內存管理, IPC等) 4.2 文件I/O編程(POSIX API) 文件描述符(File Descriptor) open, read, write, close 函數 lseek, stat, access 函數 緩衝I/O與非緩衝I/O的區彆 高級文件操作:fcntl, ioctl 4.3 進程管理 進程與綫程的概念 fork, exec係列函數創建新進程 getpid, getppid, getuid, getgid wait, waitpid 迴收子進程 exit, _exit 終止進程 kill 信號發送 4.4 綫程編程(POSIX Threads - pthreads) 綫程與進程的區彆 創建和管理綫程:pthread_create, pthread_join, pthread_exit 綫程同步與互斥:互斥鎖(mutex)、條件變量(condition variable) 綫程局部存儲(Thread-Local Storage - TLS) 4.5 內存管理 mmap, munmap 內存映射 brk, sbrk (瞭解) 理解Linux內存分配模型 第五章:進程間通信(IPC) 5.1 IPC的重要性與分類 為什麼需要IPC? 常見的IPC機製 5.2 管道(Pipes) 匿名管道(pipe()) 命名管道(mkfifo()) 管道的讀寫模型與局限性 5.3 消息隊列(Message Queues) System V消息隊列(msgget, msgsnd, msgrcv, msgctl) POSIX消息隊列(mq_open, mq_send, mq_receive, mq_close, mq_unlink) 5.4 共享內存(Shared Memory) System V共享內存(shmget, shmat, shmdt, shmctl) POSIX共享內存(shm_open, mmap, munmap, shm_unlink) 共享內存的同步問題 5.5 信號量(Semaphores) System V信號量(semget, semop, semctl) POSIX信號量(sem_open, sem_wait, sem_post, sem_close, sem_unlink) 信號量的應用:資源控製,同步 5.6 套接字(Sockets) 文件描述符的擴展 網絡編程基礎(後續章節詳述) 第六章:嵌入式設備驅動接口編程 6.1 Linux設備模型與設備文件 字符設備、塊設備、網絡設備 `/dev` 目錄下的設備文件 設備驅動的基本原理 6.2 GPIO(通用輸入輸齣)控製 GPIO原理與硬件接口 Linux GPIO子係統:`sysfs`接口 (/sys/class/gpio) 使用C語言控製GPIO(導齣、設置方嚮、讀寫值) 實戰項目:LED閃爍與按鍵檢測 6.3 串口(UART)通信 UART原理與通信協議 Linux串口設備節點(/dev/ttyS 或 /dev/ttyAMA) 使用C語言進行串口配置與數據收發(open, read, write, ioctl - termios) 實戰項目:PC與嵌入式設備通過串口進行數據交互 6.4 I2C/SPI通信 I2C/SPI總綫原理與應用 Linux I2C/SPI子係統接口(`/dev/i2c-`, `/dev/spidev`) 使用C語言進行I2C/SPI設備通信 實戰項目:讀取傳感器數據(如溫度、濕度傳感器) 6.5 內存映射(Memory-Mapped I/O) 理解硬件寄存器與內存地址的映射 使用`mmap`直接訪問硬件寄存器(需要root權限或特定驅動支持) 實戰項目:直接操作特定硬件寄存器 第三部分:嵌入式Linux應用開發 第七章:嵌入式Linux網絡編程 7.1 網絡編程基礎 TCP/IP協議棧概述 Socket API詳解 socket, bind, listen, accept, connect 函數 send, recv, write, read 函數 close, shutdown 函數 7.2 TCP客戶端與服務器開發 實戰項目:一個簡單的TCP聊天室 7.3 UDP客戶端與服務器開發 sendto, recvfrom 函數 UDP的特點與應用場景 實戰項目:簡單的UDP文件傳輸 7.4 DNS解析與域名訪問 gethostbyname, getaddrinfo 7.5 嵌入式網絡應用實例 HTTP客戶端/服務器(瞭解,可使用庫如libcurl) MQTT客戶端(用於物聯網通信) 第八章:文件係統操作與管理 8.1 Linux文件係統概述 常見嵌入式Linux文件係統(ext4, JFFS2, UBIFS, SquashFS) 文件係統掛載與卸載 8.2 C語言文件操作函數迴顧 fopen, fclose, fread, fwrite, fseek, ftell, rewind fprintf, fscanf, fgets, fputs 文件狀態獲取:stat, access 8.3 嵌入式文件係統的特殊操作 固態存儲(NAND/NOR Flash)的文件係統特性 日誌文件係統(JFFS2, UBIFS)的理解 寫時復製(Copy-on-Write) SquashFS(隻讀壓縮文件係統)的應用 8.4 內存文件係統(tmpfs/ramfs) 在內存中創建臨時文件 應用場景:臨時數據存儲,性能優化 8.5 實戰項目:嵌入式設備日誌記錄與管理 第九章:嵌入式Linux的內存與性能優化 9.1 內存分析與調試 top, free 命令分析內存使用 valgrind 工具的內存檢測與分析 AddressSanitizer (ASan) 內存泄漏的定位與解決 9.2 CPU性能分析 top, htop 命令分析CPU占用 perf 工具的使用 函數調用圖與性能瓶頸分析 9.3 代碼優化技巧 算法優化 循環優化 數據結構選擇 編譯器優化選項(-O2, -Os等) 利用CPU特性(SIMD指令 - 瞭解) 9.4 嵌入式係統功耗優化 瞭解CPU的低功耗模式 閤理管理外設電源 軟件層麵的功耗控製策略 第十章:調試與故障排除 10.1 嵌入式Linux開發中的常見問題 編譯錯誤、鏈接錯誤 運行時崩潰(Segmentation fault) 死鎖、競態條件 內存訪問越界 設備驅動問題 10.2 強大的調試工具 GDB (GNU Debugger) 的使用 遠程調試(gdbserver) 斷點設置、單步執行、變量查看 內存查看、匯編代碼查看 Printf 調試法的妙用 何時使用 printf 調試? 如何讓 printf 調試更有效? 10.3 日誌係統與錯誤報告 syslog, klog 自定義日誌記錄 10.4 邏輯分析儀與示波器的配閤使用 硬件層麵的問題排查 理解信號時序 第四部分:項目實戰與進階 第十一章:綜閤實戰項目——智能傢居網關原型開發 11.1 項目需求分析 硬件平颱選擇 係統架構設計 功能模塊劃分(設備接入、數據采集、遠程控製、本地存儲) 11.2 關鍵技術實現 設備接入: 使用MQTT協議連接雲平颱或本地服務器。 數據采集: 通過GPIO讀取傳感器狀態,通過串口/I2C/SPI讀取溫濕度等傳感器數據。 本地存儲: 將采集到的數據存儲到SQLite數據庫或文件中。 遠程控製: 接收來自雲平颱的指令,通過GPIO控製繼電器開關。 Web UI(可選): 使用簡單的CGI或框架實現基本的Web管理界麵。 11.3 項目開發流程與代碼實現 模塊化設計與編碼 交叉編譯與部署 調試與測試 11.4 項目總結與擴展 第十二章:其他嵌入式Linux開發技術概覽 12.1 嵌入式GUI開發簡介 Qt for Embedded GTK+ for Embedded Framebuffer 和 VNC 12.2 嵌入式係統中的多媒體開發(簡述) GStreamer 12.3 容器技術在嵌入式中的應用(如Docker, LXC) 12.4 嵌入式Linux安全性考量 附錄 常用Linux命令速查 C語言標準庫函數參考 嵌入式Linux開發常用術語錶 通過本書的學習,讀者將能夠熟練掌握嵌入式Linux C語言編程的核心技術,能夠獨立完成嵌入式Linux下的應用程序開發,為從事嵌入式Linux開發工作奠定堅實的基礎。