"本書以嵌入式軟件開發(fā)中用到的C語言為主線,帶領(lǐng)讀者進(jìn)入嵌入式世界的技術(shù)海洋。本書研究了從計算機(jī)的硬件架構(gòu)到C語言對硬件的操作,從C語言的設(shè)計思想,到硬件對C語言的兼容、競爭和妥協(xié)設(shè)計等問題,這些問題是理解嵌入式技術(shù)的關(guān)鍵,本書是一本嘗試通過C語言講透嵌入式底層世界的書。
本書分5篇共24章。掃盲篇(第1~3章)和上手篇(第4~10章)講解基礎(chǔ)內(nèi)容且通用的C語言知識,并針對嵌入式開發(fā)做了少量的內(nèi)容優(yōu)化;提高篇(第11~17章)和高級篇(第18~22章)專為嵌入式軟件從業(yè)者打造,具有很強的針對性;職場篇(第23章和第24章)為職業(yè)方向和代碼管理等內(nèi)容,以便于讀者快速尋找并融入團(tuán)隊。
本書適合初學(xué)者入門,部分高級內(nèi)容對于工作多年的開發(fā)者也有一定參考價值,并配有示例代碼和視頻教程,可作為高等院校學(xué)生、相關(guān)從業(yè)者作為學(xué)習(xí)參考用書。
"
第1章計算機(jī)體系概述(60min)
1.1CPU原理
1.1.1CPU在計算機(jī)中的位置
1.1.2運算器和控制器
1.1.3CPU架構(gòu)
1.2內(nèi)存和總線
1.2.1內(nèi)存和緩存
1.2.2CPU寄存器和總線
1.3指令集分類
1.3.1指令集的意義
1.3.2兩種指令集的特點
1.4內(nèi)存和I/O設(shè)備統(tǒng)一編址
1.4.1非總線型設(shè)備的形態(tài)
1.4.2I/O設(shè)備和驅(qū)動
第2章從匯編語言到C語言(60min)
2.1匯編語言和C語言簡介
2.1.1第1代編程語言
2.1.2第2代編程語言
2.1.3匯編語言組成
2.2匯編操作的寄存器
2.2.1數(shù)據(jù)寄存器
2.2.2指令寄存器
2.2.3程序計數(shù)寄存器
2.2.4地址寄存器
2.2.5累加寄存器
2.2.6程序狀態(tài)寄存器
2.3CPU的尋址方式
2.3.1立即尋址
2.3.2直接尋址
2.3.3間接尋址
2.4C語言簡介
2.4.1C語言發(fā)展歷史
2.4.2C語言的特點
2.4.3C語言的缺點
2.5C語言構(gòu)成
2.5.1基本構(gòu)成
2.5.2關(guān)鍵字
2.5.3程序結(jié)構(gòu)
2.5.4函數(shù)
2.5.5開發(fā)環(huán)境
第3章Ubuntu18x64GCC開發(fā)環(huán)境搭建
3.1使用虛擬機(jī)安裝Ubuntu18x64
3.1.1Ubuntu簡介
3.1.2什么是虛擬機(jī)
3.1.3安裝VMwareWorkstation17
3.1.4安裝Ubuntu18.4x64
3.1.5設(shè)置共享目錄
3.2Linux常用命令
3.2.1文件和目錄
3.2.2用戶及用戶組管理命令
3.3vim編輯器使用
3.3.1使用vi新建并編輯文本文件
3.3.2文本的刪除、撤銷、復(fù)制和查找
3.4壓縮和查找
3.4.1tar壓縮解壓命令
3.4.2文件及文件內(nèi)容查找
3.5使用GCC編譯一個C語言程序
3.5.1GCC發(fā)展歷史
3.5.2GCC常用命令
3.5.3寫出第1個C語言程序
上手篇初學(xué)C語言
第4章C語言概覽(70min)
4.1C語言程序結(jié)構(gòu)
4.1.1順序結(jié)構(gòu)
4.1.2分支結(jié)構(gòu)
4.1.3循環(huán)結(jié)構(gòu)
4.2變量、常量和聲明
4.2.1變量
4.2.2常量
4.2.3C語言聲明
4.3標(biāo)準(zhǔn)輸入/輸出
4.3.1標(biāo)準(zhǔn)輸入scanf函數(shù)
4.3.2標(biāo)準(zhǔn)輸出printf函數(shù)
4.4簡單函數(shù)
4.4.1庫函數(shù)
4.4.2形參和實參
4.4.3局部變量和全局變量
第5章運算符和表達(dá)式(37min)
5.1優(yōu)先級和結(jié)合性
5.1.1優(yōu)先級表
5.1.2左結(jié)合和右結(jié)合
5.1.3表達(dá)式的值
5.2表達(dá)式中的隱式規(guī)則
5.2.1整型提升
5.2.2隱式轉(zhuǎn)換
第6章數(shù)組和字符串(122min)
6.1數(shù)據(jù)類型和長度
6.1.1數(shù)據(jù)類型
6.1.2不同平臺的類型長度
6.2一維數(shù)組
6.2.1初識數(shù)組
6.2.2數(shù)組的定義和使用
6.3多維數(shù)組
6.3.1一維數(shù)組作為數(shù)組元素
6.3.2多維數(shù)組
6.4字符串
6.4.1定義一個字符串
6.4.2把字符串當(dāng)成數(shù)組
6.5strlen、strcmp和strcpy函數(shù)
6.5.1strlen函數(shù)
6.5.2strcmp函數(shù)
6.5.3strcpy函數(shù)
6.6sizeof、memset和memcpy函數(shù)
6.6.1取長度運算符sizeof()
6.6.2memset函數(shù)
6.6.3memcpy函數(shù)
第7章數(shù)制轉(zhuǎn)換和位操作(153min)
7.1二進(jìn)制、十進(jìn)制和十六進(jìn)制之間的轉(zhuǎn)換
7.1.1二進(jìn)制和十六進(jìn)制
7.1.2各種進(jìn)制到十進(jìn)制的轉(zhuǎn)換
7.2位操作
7.2.1左移和右移操作的意義
7.2.2給指定位送1或者0
7.2.3指定位取反
7.3計算機(jī)中整數(shù)的表示
7.3.1負(fù)整數(shù)面臨的困境
7.3.2用加法表示減法
7.3.3符號位的由來
第8章控制流(92min)
8.1switchcase、break和continue
8.1.1switchcase
8.1.2break語句
8.1.3continue語句
8.2goto語句和標(biāo)號
8.2.1標(biāo)號
8.2.2使用標(biāo)號進(jìn)行跳轉(zhuǎn)
8.3while、dowhile和for
8.3.1while和dowhile語句
8.3.2for循環(huán)
8.4嵌套循環(huán)
8.4.1多重for循環(huán)
8.4.2多重while循環(huán)
8.5if和elseif深入
8.5.1ifelse語句的聯(lián)動
8.5.2上升沿下降沿檢測
第9章程序調(diào)試(62min)
9.1給main函數(shù)傳參
9.1.1main函數(shù)的參數(shù)
9.1.2*argv[]的本質(zhì)
9.2常見的編譯報錯
9.2.1未定義錯誤
9.2.2頭文件錯誤
9.2.3函數(shù)隱式聲明警告
9.2.4未聲明錯誤
9.3打印調(diào)試
9.3.1編譯階段打印
9.3.2使用goto處理出錯
9.4main函數(shù)返回
9.4.1main函數(shù)是否特殊
9.4.2main函數(shù)為何需要返回
第10章簡單排序算法(93min)
10.1冒泡排序
10.1.1冒泡排序基本思想
10.1.2冒泡排序?qū)崿F(xiàn)邏輯
10.2選擇排序
10.2.1選擇排序基本思想
10.2.2選擇排序?qū)崿F(xiàn)邏輯
10.3插入排序
10.3.1插入排序基本思想
10.3.2插入排序?qū)崿F(xiàn)邏輯
提高篇C代碼在運行中
第11章構(gòu)造類型和指針(109min)
11.1C語言結(jié)構(gòu)體
11.2共用體和枚舉
11.2.1共用體
11.2.2枚舉
11.3指針類型
11.3.1什么是指針
11.3.2指針的定義和野指針
11.3.3指針的解引用
11.3.4指針類型和數(shù)據(jù)類型
11.4void空類型
11.4.1空類型的意義
11.4.2空類型的使用
11.5typedef重定義類型
11.5.1typedef重定義基本數(shù)據(jù)類型
11.5.2typedef重定義結(jié)構(gòu)體類型
11.5.3typedef重定義函數(shù)指針類型
第12章C語言對內(nèi)存的使用(154min)
12.1強制類型轉(zhuǎn)換和大小端
12.1.1強制類型轉(zhuǎn)換
12.1.2大端和小端格式
12.2結(jié)構(gòu)體的對齊訪問
12.2.1結(jié)構(gòu)體中成員的偏移
12.2.2結(jié)構(gòu)體為何要對齊訪問
12.2.3在GCC中對齊訪問的方法
12.3變量的作用域和生命周期
12.3.1變量的作用域
12.3.2變量的生命周期
12.4運算中的臨時變量
12.4.1臨時變量現(xiàn)象
12.4.2臨時變量的內(nèi)因
第13章指針初探(102min)
13.1數(shù)組和指針
13.1.1數(shù)組在內(nèi)存中的存在
13.1.2數(shù)組下標(biāo)本質(zhì)
13.2指針越界訪問
13.2.1指針越界讀取
13.2.2指針越界寫入
13.3指針類型的作用
13.3.1指針類型和解引用
13.3.2指針類型和內(nèi)存讀取
13.3.3指針類型和偏移量
13.4函數(shù)指針
13.4.1函數(shù)指針初探
13.4.2使用地址調(diào)用函數(shù)
第14章棧和堆(58min)
14.1變量的內(nèi)存分配
14.1.1變量的地址
14.1.2函數(shù)參數(shù)的地址
14.1.3函數(shù)返回值的傳遞
14.2棧內(nèi)存簡介
14.2.1棧內(nèi)存
14.2.2棧內(nèi)存的注意事項
14.3堆內(nèi)存
14.3.1堆內(nèi)存的申請和釋放
14.3.2堆內(nèi)存和棧內(nèi)存的區(qū)別
第15章函數(shù)深入(325min)
15.1函數(shù)在內(nèi)存中的體現(xiàn)
15.1.1函數(shù)所在的內(nèi)存
15.1.2函數(shù)運行時的問題
15.2函數(shù)的參數(shù)
15.2.1函數(shù)形參在內(nèi)存中
15.2.2函數(shù)形參的編程誤區(qū)
15.3函數(shù)的返回和遞歸
15.3.1函數(shù)的運行和返回原理
15.3.2函數(shù)返回類型和一般規(guī)則
15.3.3函數(shù)的遞歸調(diào)用
15.4遞歸函數(shù)的分析
15.4.1遞歸函數(shù)的參數(shù)
15.4.2單遞歸函數(shù)返回邏輯
15.4.3二次遞歸的分析
15.4.4二次遞歸函數(shù)分析總結(jié)
15.5遞歸實例之歸并排序
15.5.1歸并排序?qū)崿F(xiàn)邏輯
15.5.2合并算法分析
15.5.3二次遞歸算法分析
第16章編譯和鏈接(127min)
16.1程序的編譯
16.1.1預(yù)處理
16.1.2編譯和鏈接過程
16.2C程序在內(nèi)存中的分布
16.2.1代碼段和數(shù)據(jù)段
16.2.2棧和堆
16.2.3各個段的內(nèi)存分布
16.3動態(tài)鏈接和靜態(tài)鏈接
16.3.1庫文件的意義
16.3.2靜態(tài)庫文件的制作和使用
16.3.3程序運行中加載動態(tài)庫
16.3.4靜態(tài)庫和動態(tài)庫對程序運行的意義
16.4編譯調(diào)試方法
16.4.1反匯編
16.4.2格式轉(zhuǎn)換
16.4.3手動鏈接
第17章狀態(tài)機(jī)和多線程(135min)
17.1有限狀態(tài)
17.1.1什么是有限狀態(tài)機(jī)
17.1.2使用C語言編寫一個簡單狀態(tài)機(jī)
17.1.3狀態(tài)機(jī)解決了什么問題
17.2多線程簡介
17.2.1進(jìn)程和線程
17.2.2線程安全
17.2.3函數(shù)的可重入性
17.3多線程編程入門
17.3.1Linux常用多線程庫
17.3.2多線程編程實戰(zhàn)
17.4線程同步簡介
17.4.1線程不同步問題
17.4.2互斥鎖
17.4.3自旋鎖
高級篇C代碼在操作系統(tǒng)層
第18章C語言指針高級部分(113min)
18.1結(jié)構(gòu)體指針
18.1.1結(jié)構(gòu)體指針的定義和使用
18.1.2使用結(jié)構(gòu)體指針作為函數(shù)參數(shù)
18.2二重指針
18.2.1char**argv或char*argv[]
18.2.2定義二重指針并使用
18.3指針數(shù)組和數(shù)組指針,函數(shù)指針和指針函數(shù)
18.3.1指針數(shù)組和數(shù)組指針
18.3.2函數(shù)指針和指針函數(shù)
18.4offsetof和container_of宏
18.4.1offsetof宏
18.4.2container_of宏
第19章C語言函數(shù)高級部分(152min)
19.1函數(shù)的輸入型參數(shù)和輸出型參數(shù)
19.1.1形參中的const關(guān)鍵字
19.1.2形參的輸入/輸出接口形式
19.2函數(shù)類型和函數(shù)指針類型
19.2.1函數(shù)指針和函數(shù)類型匹配
19.2.2函數(shù)指針和函數(shù)類型不匹配
19.3回調(diào)函數(shù)
19.3.1使用回調(diào)函數(shù)進(jìn)行方法綁定
19.3.2回調(diào)函數(shù)注冊
19.4函數(shù)的調(diào)用策略
19.4.1C語言函數(shù)調(diào)用的流程
19.4.2C語言函數(shù)效率
19.5再論可重入函數(shù)
19.5.1設(shè)計可重入函數(shù)
19.5.2可重入函數(shù)的設(shè)計規(guī)范
第20章C語言底層特性(395min)
20.1const和volatile修飾指針
20.1.1const*p和*constp
20.1.2volatile修飾
20.2指針和作為指針的數(shù)據(jù)
20.2.1再論指針
20.2.2設(shè)備寄存器的讀寫
20.2.3指定地址跳轉(zhuǎn)
20.3二重指針在底層
20.3.1字符串指針集合
20.3.2異常/中斷向量表
20.4函數(shù)指針在底層
20.4.1函數(shù)指針數(shù)組在底層
20.4.2結(jié)構(gòu)體包含函數(shù)指針
20.5論函數(shù)地址
20.5.1鏈接地址和運行地址
20.5.2位置有關(guān)碼和位置無關(guān)碼
20.6attribute關(guān)鍵字
20.6.1段聲明
20.6.2對齊聲明
20.6.3弱符號聲明
20.6.4inline內(nèi)聯(lián)聲明
第21章C語言鏈表(223min)
21.1單鏈表數(shù)據(jù)結(jié)構(gòu)
21.1.1單鏈表的構(gòu)成
21.1.2單鏈表節(jié)點創(chuàng)建
21.2單鏈表的操作
21.2.1單鏈表的尾插
21.2.2單鏈表的頭插
21.2.3單鏈表的遍歷
21.2.4單鏈表節(jié)點的刪除
21.2.5單鏈表的逆序
21.3雙鏈表數(shù)據(jù)結(jié)構(gòu)
21.3.1雙鏈表的構(gòu)成
21.3.2雙鏈表節(jié)點創(chuàng)建
21.4雙鏈表的操作
21.4.1雙鏈表的尾插
21.4.2雙鏈表的頭插
21.4.3雙鏈表的遍歷
21.4.4雙鏈表節(jié)點的刪除
21.4.5雙鏈表的逆序
21.5循環(huán)鏈表淺析
21.5.1循環(huán)單鏈表的數(shù)據(jù)結(jié)構(gòu)
21.5.2循環(huán)單鏈表的建立和遍歷
21.5.3循環(huán)雙鏈表的數(shù)據(jù)結(jié)構(gòu)
21.5.4循環(huán)雙鏈表的建立和遍歷
第22章二叉樹和哈希表(294min)
22.1二叉樹簡介
22.1.1樹的概念及結(jié)構(gòu)
22.1.2二叉樹
22.2二叉樹的實現(xiàn)
22.2.1二叉樹節(jié)點創(chuàng)建
22.2.2二叉樹的創(chuàng)建
22.3二叉樹的遍歷
22.3.1先序遍歷
22.3.2中序遍歷
22.3.3后序遍歷
22.3.4層序遍歷
22.4哈希表簡介
22.4.1哈希表基本概念
22.4.2哈希沖突的解決
22.5實現(xiàn)簡單的哈希表
22.5.1開放定址法
22.5.2鏈地址法
實戰(zhàn)篇C語言在職場
第23章嵌入式軟件開發(fā)
23.1單片機(jī)和嵌入式軟件開發(fā)
23.1.1單片機(jī)開發(fā)崗
23.1.2嵌入式Linux開發(fā)崗
23.2嵌入式操作系統(tǒng)簡介
23.2.1單片機(jī)操作系統(tǒng)
23.2.2嵌入式操作系統(tǒng)
23.3職業(yè)方向
23.3.1應(yīng)用層開發(fā)
23.3.2驅(qū)動層開發(fā)
23.3.3物聯(lián)網(wǎng)開發(fā)簡介
第24章編譯管理方法(143min)
24.1C代碼的頭文件
24.1.1頭文件的意義
24.1.2頭文件的一般規(guī)則
24.2多個C代碼文件編譯
24.2.1多個C文件編譯體系
24.2.2多文件編譯的管理問題
24.2.3使用腳本管理工程
24.3代碼的層次管理
24.3.1H文件和C文件的分離
24.3.2代碼的分層管理腳本
24.4開始寫Makefile
24.4.1寫一個最簡單的Makefile
24.4.2Makefile最小系統(tǒng)
24.5Makefile進(jìn)階
24.5.1Makefile的變量和自動推導(dǎo)
24.5.2Makefile實踐
參考文獻(xiàn)