描述
內容簡介
☆★☆★【為嵌入式讀者打造的C語言進階學習圖書】★☆★☆ C語言可說是近代程式語言的始祖,但也從未被時代的洪流淘汰。
在人工智慧盛行的今天,很多人學程式語言想到的就是Python,找工作要求的是Java,大家都覺得這兩個語言較為流行,是主流語言。然而靜下心來想想,我們現在的生活,其實是用大大小小的硬體堆疊起來的。這些硬體要能正常運作,一定有一個軟體在上面運作,你可能沒想到,這些大大小小硬體的靈魂,大部分都是C語言寫出來的。C語言可說是近代程式語言的始祖,但也沒有被時代的洪流淘汰。在不斷更新標準及改版,C語言與時俱進,不斷以其輕巧快速簡單的特點在一個又一個新出現的硬體上穩定提供服務,從手機、感測器、VR/AR設備、車載系統、家電、衛星、望遠鏡,全部看得到C語言的身影。這些被歸類於「嵌入式」的系統,其資源有限,又有即時反應的要求,時至今日,C語言仍然遙遙領先其它號稱新世代的程式語言。本書雖然歸類於C語言,但充分展現出嵌入式系統設計的精華,在和強調演算法的其它語言相比,更在乎的是資源分配、記憶體管理、小輕快穩的編譯,在最不佔系統資源的情況下,完成控制硬體的工作。是難得嵌入式系統C語言的好書,讓你寫出強大穩健的硬體控制系統。
本書看點 ✪Linux下的基本環境安裝 ✪完整說明電腦架構、CPU工作原理,晶片製作原理 ✪ARM系統結構及組合語言 ✪C程式的編輯、連結、安裝、運行 ✪記憶體堆疊、堆積的管理 ✪GNU C編譯器及擴充語法說明 ✪C的資料結構及最完整的指標說明,範例 ✪C和物件導向、C語言的程式模組化 ✪C語言的多工設計及作業系統設計 |
作者簡介
王利濤
嵌入式工程師,培訓講師,多年嵌入式開發經驗,包括晶片測試、BSP、驅動開發、USB子系統等,目前在開發“嵌入式工程師自我修養”系列線上影片教學,以及在個人部落格“宅學部落”分享更多的嵌入式、Linux、AIoT技術。 |
目錄
第1章 工欲善其事,必先利其器
1.1 程式編輯工具:Vim 1.2 程式編譯工具:make 1.3 程式管理工具:Git
第2章 電腦系統結構與CPU工作原理 2.1 一顆晶片是怎樣誕生的 2.2 一顆CPU是怎麼設計出來的 2.3 電腦系統結構 2.4 CPU性能提升:Cache機制 2.5 CPU性能提升:管線 2.6 多核心CPU 2.7 後莫爾時代:異質計算的崛起 2.8 匯流排與地址 2.9 指令集與微架構
第3章 ARM系統結構與組合語言 3.1 ARM系統結構 3.2 ARM組合語言指令 3.3 ARM定址方式 3.4 ARM虛擬指令 3.5 ARM組合語言程式設計 3.6 C語言和組合語言混合程式設計 3.7 GNU ARM組合語言
第4章 程式的編譯、連結、安裝和運行 4.1 從來源程式到二進位檔案 4.2 前置處理過程 4.3 程式的編譯 4.4 連結過程 4.5 程式的安裝 4.6 程式的運行 4.7 連結靜態程式庫 4.8 動態連結 4.9 外掛程式的工作原理 4.10 Linux核心模組運行機制 4.11 Linux核心編譯和啟動分析 4.12 U-boot重定位分析 4.13 常用的binutils工具集
第5章 記憶體堆疊管理 5.1 程式運行的“馬甲”:處理程序 5.2 Linux環境下的記憶體管理 5.3 堆疊的管理 5.4 堆積記憶體管理 5.5 mmap映射區域探秘 5.6 記憶體洩漏與防範 5.7 常見的記憶體錯誤及檢測
第6章 GNU C編譯器擴充語法精講 6.1 C語言標準和編譯器 6.2 指定初始化 6.3 巨集構造“利器”:敘述運算式 6.4 typeof與container_of巨集 6.5 零長度陣列 6.6 屬性宣告:section 6.7 屬性宣告:aligned 6.8 屬性宣告:format 6.9 屬性宣告:weak 6.10 內聯函數 6.11 內建函數 6.12 可變參數巨集
第7章 資料儲存與指標 7.1 資料型態與儲存 7.2 資料對齊 7.3 資料的可攜性 7.4 Linux核心中的size_t類型 7.5 為什麼很多人程式設計時喜歡用typedef 7.6 列舉類型 7.7 常數和變數 7.8 從變數到指標 7.9 指標與陣列的“曖昧”關係 7.10 指標與結構 7.11 二級指標 7.12 函數指標 7.13 重新認識void
第8章 C語言的物件導向程式設計思想 8.1 程式重複使用與分層思想 8.2 物件導向程式設計基礎 8.3 Linux核心中的OOP思想:封裝 8.4 Linux核心中的OOP思想:繼承 8.5 Linux核心中的OOP思想:多形
第9章 C語言的模組化程式設計思想 9.1 模組的編譯和連結 9.2 系統模組劃分 9.3 一個模組的封 9.4 標頭檔深度剖析 9.5 模組設計原則 9.6 被誤解的關鍵字:goto 9.7 模組間通訊 9.8 模組設計進階 9.9 AIoT時代的模組化程式設計
第10章 C語言的多工程式設計思想和作業系統入門 10.1 多工的裸機實現 10.2 作業系統基本原理 10.3 中斷 10.4 系統呼叫 10.5 揭開檔案系統的神秘面紗 10.6 記憶體介面與映射 10.7 記憶體與外部設備 10.8 暫存器操作 10.9 記憶體管理單元MMU 10.10 處理程序、執行緒和程式碼協同
參考文獻 |
序
C語言是很多人學習程式設計的第一門語言。很多初學者在學習過程中,往往會產生各種各樣的疑惑:C語言黑底白字,視窗介面看起來甚至還有點醜陋,現在學這個還有用嗎?能撰寫一個好玩的App嗎?能寫爬蟲嗎?能架設一個電子商務網站嗎?光靠C語言能找到一份月薪過五萬的工作嗎?現在網際網路和人工智慧這麼紅,大家都在學習Java、Python、Ruby……都2021年了,C語言是不是已經過時了?
C 語言已經過時了嗎 C語言並沒有過時。自C語言問世幾十年來,其實一直都是使用最廣泛的程式設計語言之一,多年來一直低調地霸佔著程式設計語言的排行榜前幾名,目前還沒有看到衰退和被替代的跡象。只不過在Android、行動網際網路紅了之後,Java暫時搶了風頭而已,把C語言從程式設計語言排行榜上擠到了第二的位置。滄海桑田,時過境遷,很多程式設計語言如過江之鯽,風雲變幻,但C語言依然寶刀未老,在程式設計語言排行榜上從未跌出過前三,這也說明了C語言一直都是被廣泛使用的程式設計語言。既然C語言被廣泛使用,那麼主要應用在哪些領域呢?可以這麼說,基本上在每個領域都可以看到C語言的身影。 l 應用軟體:Linux/UNIX環境下的工具、應用程式。 l 系統軟體:作業系統、編譯器、資料庫、圖形處理、虛擬機器、多媒體庫等。 l 嵌入式開發:各種RTOS、BSP、軔體、驅動、API庫。 l 嵌入式、工業控制、物聯網、消費電子、科學研究領域、數值計算。 l 實現其他程式設計/指令碼語言:Lua、Python、Shell。 l 網站伺服器底層、遊戲、各種應用框架。 C語言是一門高階語言。C語言有高階語言的各種語法和特性,我們使用C語言可以建構大型的軟體工程。有人說,C語言上不了大檯面,撰寫不了大型的專案,這個說法其實也是站不住腳的:很多大型的GNU開放原始碼專案,其實都是使用C語言開發的,如Lua指令碼語言、SQLite、Nginx、UNIX等。現在市面上幾乎所有的作業系統都是使用C語言開發的,如 Linux核心、uC/OS、VxWorks、FreeRTOS。目前最新的Linux-5.x 核心程式已多達2000萬行,3萬多個原始檔案,這個專案應該不算小了吧! C語言也是一門低階語言。透過指標和位元運算,我們可以修改記憶體和暫存器,從而直接控制CPU 和硬體電路的運行。正是由於這種低階特性,很多作業系統核心、驅動都選擇使用C語言進行開發。尤其在嵌入式開發領域,C語言被廣泛使用,C語言是嵌入式工程師必須熟練掌握,甚至需要精通的一門程式設計語言。 C語言到底要學到什麼程度 學習C語言到底要學到什麼程度,才能達到面試的要求,才能勝任一份嵌入式開發的工作呢?這是很多嵌入式初學者很關心的問題。 一般來講,不同的行業領域、不同的C語言開發職位、不同的學習目的,對C語言的要求也不一樣。如圖0-1所示,如果你是在校學生,學習C語言僅僅是為了應付期末考試、通過電腦考試、考取證照,那麼你只要把C語言的基本語法掌握好,基本上就可以輕鬆過關,稍微用心點,說不定還能拿個高分。如果你想做C語言桌面軟體、網站伺服器開發,那麼你不僅要學習C語言的基本語法,還要對特定行業領域的專業知識、軟體工程、專案管理等有所涉獵。這可不像通過電腦考試那麼簡單。電腦考試其實壓根就不是為程式設計師準備的,它是非電腦專業學生的終極目標,而對於一個立志從事軟體開發的工程師來說,它僅僅是一個起點。如果你想以後從事嵌入式開發、Linux核心驅動開發等工作,那麼對C語言的要求就更高了:你不僅要掌握C語言的基本語法、專案管理、軟體工程,還要對硬體電路、CPU、作業系統、編譯原理等底層機制有完整的了解,需要對C語言進行進一步的強化學習和程式設計訓練。 使用C語言程式設計就像寫小說一樣:為什麼你掌握了3000個常用的英文單字、八大時態、各種從句語法,還是寫不出《哈姆雷特》《冰與火之歌》呢?道理其實很簡單,單字和語法只是基礎中的基礎,只是工具而已。要想寫出優秀的小說,還需要對一門語言背後的社會背景、歷史文化、思維邏輯、風土人情等有深入的理解和把握才行。 你要學習的,不僅僅是C語言…… 要想從事嵌入式開發工作,尤其是嵌入式Linux核心驅動開發工作,你要精通的不僅僅是C語言,最好還要掌握和C語言相關的一系列基礎理論和偵錯技能。筆者也是過來人,從最初學習嵌入式到從事嵌入式開發工作,這一路走來坎坷崎嶇,什麼都不說了,說多了都是淚。從一開始連指標都不會用、不敢用,看核心驅動程式一頭霧水,越看越沒信心、越看越沒自信,到現在不再擔心害怕,有自信和能力看懂核心中的程式細節和系統框架,這種進步不是天上掉下來的,也不是一不小心跌入山洞,撿到武功秘笈練出來的,而是不斷地學習和實踐、反覆迭代、不斷完善自己的知識系統和技能樹,才慢慢達到的。學習沒有捷徑可走,要想真正學好嵌入式、精通嵌入式,個人覺得除了精通C語言,最好還要具備以下完整的知識系統和程式設計技能。 l 半導體基礎、CPU工作原理、硬體電路、電腦系統結構。 l ARM系統結構與組合語言指令、組合語言程式設計、ARM反組譯分析。 l 程式的編譯、連結、安裝、運行和重定位分析。 l 熟悉C語言標準、ARM、GNU編譯器的特性和擴充語法。 l C語言的模組化程式設計思想,學會使用模組化思想去分析複雜的系統。 l C語言的物件導向程式設計(簡稱OOP)思想,學會使用OOP思想去分析Linux核心驅動。 l 對指標的深刻理解,對複雜指標的宣告和靈活應用。 l 對記憶體堆疊管理、記憶體洩漏、堆疊溢位、段錯誤的深刻理解。 l 多工併發程式設計思想,CPU和作業系統基礎理論。 本書內容及寫作初衷 本書從C語言的角度出發,分10章,在預設讀者已經掌握C語言基本語法的基礎上,和大家一起探討、學習C語言背後的CPU工作原理、電腦系統結構、ARM平臺下程式的編譯/連結、程式執行時期的記憶體堆疊管理等底層知識。同時,針對嵌入式開發領域,用3章分別探討了C語言的物件導向程式設計思想、模組化程式設計思想和多工程式設計思想,這些底層知識和程式設計思想組成了嵌入式開發所需要的通用理論基礎和核心技能。尤其是對於很多從不同專業轉行到嵌入式開發的朋友,由於專業背景的差異,導致每個人的知識儲備和程式設計技能樹參差不齊,在學習嵌入式開發的過程中會經常遇到各種各樣的問題,陷入學習的困境。 本書的寫作初衷就是為不同專業背景的讀者架設嵌入式開發所需要的完整知識系統和認知框架。掌握了這些基礎理論和程式設計技能,也就補齊了缺陷,可為後續的嵌入式開發進階學習打下堅實的基礎。 本書特色 l 直白寫作風格,通俗易懂,不怕學不會,就怕你不學。 l 大量的配圖、原理圖,圖文並茂,更加有利於學習和理解。 l 在ARM平臺下講解程式的編譯、連結和運行原理(獨創)。 l 現場“手刻”ARM組合語言程式碼,從反組譯角度剖析C函式呼叫、傳參過程。 l 多角度剖析C語言:CPU、電腦系統結構、編譯器、作業系統、軟體工程。 l GNU C編譯器擴充語法精講(在GNU開放原始碼軟體、Linux核心中大量使用)。 l 記憶體堆疊管理機制的底層剖析,從根源上理解記憶體錯誤。 l 從零開始一步一步架設和迭代嵌入式軟體框架。 l 教你用OOP思想分析Linux核心中複雜的驅動和子系統。 l C語言的多工併發程式設計思想,CPU和作業系統零基礎入門。 讀者定位 本書針對的是嵌入式開發,尤其是嵌入式Linux開發背景下的C語言進階學習,比較適合在校學生、嵌入式學員、工作1~3年的職場新兵閱讀和學習。為了達到更好的學習效果,在閱讀本書之前,首先要確保你已經掌握了C語言的基本語法,並且至少使用過一款C語言整合式開發環境(VC++ 6.0、Visual Studio、C-Free、GCC都可以),開發過一個完整的C語言專案(課程設計也算)。有了這些基礎和程式設計經驗之後,學習效果會更好。 致謝及意見回饋 本書在寫作過程中參考了很多經典圖書、論文期刊、開原始程式碼,包括網際網路上的很多電子資料,由於時間和精力的關係,無法對這些資料的最初出處一一溯本求源,對各種資料的創建者和分享者不能一一列舉。這裡對他們的貢獻表示真誠的感謝。 感謝電子工業出版社的董英和李秀梅編輯,本書從選題的論證到書稿的格式審核、文字編輯,她們都付出了辛苦的工作並提出了很多專業意見。鑒於作者水準、時間和精力有限,書中難免出現一些錯誤。如果你在閱讀過程中發現了錯誤或者需要改進的地方,歡迎和我聯繫(E-mail:3284757626@qq.com),或者在我的個人部落格(www.zhaixue.cc)上留言。
|