【超詳細】嵌入式軟件學習大綱

目錄

隨便聊聊

  前兩天上傳了我自己在整個大學階段單片機的學習歷程(個人感覺已經非常詳細和真實了,包括自己在某個階段遇到的問題,單片機學習的困難點都有描述),感興趣的朋友們可以去了解一下,從今天開始,打算將自己學到的關於嵌入式方面(不是單片機)的知識和感想來與大家分享,因爲個人正在學習嵌入式的緣故,近期分享的內容以嵌入式學習爲主,單片機方面打算以後有時間再與大家分享。
  今天做的這個文章,主要是先把自己學習嵌入式軟件方面的學習大綱與大家分享一下,有感興趣的朋友或者正在學習嵌入式的朋友可以一起努力,相互討論,往後分享的內容都會是以今天發佈學習大綱的順序來分享,當然其他朋友在學習的過程中遇到什麼問題,可以在評論區評論一下,我懂的地方會單獨做些文章來解釋,或者直接在評論區恢復,希望各路朋友多多支持,非常榮幸與大家共成長同進步!
  好了,下面開始我們正式的內容:

什麼是嵌入式?

我對嵌入式的看法

  如果要了解嵌入式,大家必須要先了解什麼是PC、什麼是單片機。在我最早學習單片機的時候,天真的以爲學單片機就是在學嵌入式,等到自己逐漸去了解嵌入式以後,才發現原來自己曾經那麼可愛(單片機、嵌入式在學習路線、學習難度、學習週期上的差別還是很大的),爲了讓更多的嵌入式小白走出這樣誤區,下面簡單介紹一下他們分別的概念,和學習上的差別。

單片機系統與嵌入式系統的差別

  要了解單片機,就要追溯到上世紀早期在沒有大規模集成電路技術的時代,計算機的設計原理,那時的計算機CPU、隨機存儲器RAM、只讀存儲器ROM、各種外設I/O和中斷系統ROM等這些都是分離在電路板的各個角落裏。直到20世紀70年代左右,隨着科學技術的不斷髮展,利用大規模集成電路技術把CPU和數據存儲器(RAM)、程序存儲器(ROM)及其他I/O通信口集成在一塊芯片上,構成一個最小的計算機系統,這個就是單片機。
  那麼跟單片機先比較嵌入式有哪些不同的地方呢?單片機產品和嵌入式產品都是電子產品,整個SOC都以CPU作爲核心內嵌各種存儲器,都有一些外圍硬件作爲輔助,也都是通過軟件控制硬件。在功能上有很多的相似之處。但是在SOC性能上有非常巨大的差別,例如在內存方面,嵌入式系統的SOC明顯比單片機大很多。現在將單片機與嵌入式系統SOC內存資源進行比較(順便與PC機SOC進行比較):
  1、一般單片機系統中內存需求小,而且希望開發盡肯能的簡單,因單片機SOC內嵌小容量的SRAM加小容量的NorFlash。
  2、嵌入式系統內存需求大,因爲大容量的Norflash相對較貴,因此嵌入式SOC一般採NANDFlash+Dram+Sram+少量Srom。
  3、一般PC機都是:小容量的NorFLash+大容量的硬盤(類似於Nandflash)+大容量的Dram。
  可見在硬件上三者之間就存在較大的差別。
  嵌入式系統和單片機系統在CPU方面也是有一定差異:是否有MMU(分頁內存管理單元,它是一種負責處理CPU的內存訪問請求的計算機硬件),當然操作系統方面兩者也具有一定差異,單片機系統因爲內存資源較少的緣故,因此在操作系統移植方面一般只能跑一些簡單的RTOS,像51單片機這樣的簡單SOC甚至連一些輕量級的RTOS都跑不了,哪怕能跑也沒人會用它去跑操作系統(有朋友跟我說能跑,他跑過,純粹是自己在玩呢,是不是),而嵌入式系統就比較牛了,一般在嵌入式系統中都會跑Linux、Android操作系統。(一般分需不需要比較友好的人機交互界面,不需要的一般都是跑LINUX,像平板、手機一般都是跑的Android,當然Android是基於Linux內核的,這個大家也要了解一下)最後,單片機與嵌入式在應用領域也是有較大差異的,單片機一般應用在操作簡單的智能家電(如智能檯燈),嵌入式一般運用領域較廣(例如工業領域、汽車、航空航天等等都需要嵌入式)。這也是我們學習嵌入式的原因所在。

PC系統與嵌入式系統的差別

  好了分析完單片機與嵌入式的差別,我們再來了解一下什麼是PC機,PC機與嵌入式的差別體現在哪?
  PC是什麼呢?PC指的就是個人計算機,它是指一種大小、價格和性能適用於個人使用的多用途計算機(這是PC機的一大特點即通用性)。臺式機、筆記本電腦到小型筆記本電腦和平板電腦以及超級本等都屬於個人PC機。
  PC與嵌入式在硬件的差異在上面我們分析過了,現在我複製粘貼一下:
  1、嵌入式系統內存需求大,因爲大容量的Norflash相對較貴,因此嵌入式SOC一般採NANDFlash+Dram+Sram+少量Srom。
  2、一般PC機都是:小容量的NorFLash+大容量的硬盤(類似於Nandflash)+大容量的Dram。
  說實話個人PC機在內部資源上是優於嵌入式系統的,但是這不是PC與嵌入式最大的區別,下面我附嵌入式的定義給大家看看:
  嵌入式即嵌入式系統,IEEE(美國電氣和電子工程師協會)對其定義是用於控制、監視或者輔助操作機器和設備的裝置,是一種專用的計算機系統;國內普遍認同的嵌入式系統定義是以應用爲中心,以計算機技術爲基礎,軟硬件可裁剪,適應應用系統對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統;從應用對象上加以定義來說,嵌入式系統是軟件和硬件的綜合體,還可以涵蓋機械等附屬裝置。
  其實很多學弟學妹表示自學比較困難,這是正常的,看到這麼一大串晦澀難懂的文字定義,換誰都很難看下去,下面給大家解釋一下:嵌入式系統與PC在分層上是很相似的:都分爲硬件層、中間層、系統軟件層和應用軟件層組成,那麼他們差別在哪呢,看上面定義有一句話非常關鍵:“軟硬件可裁剪,適應應用系統對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統”,軟硬件可裁剪,這是嵌入式最顯著的特點,嵌入式系統可以根據對系統功能要求的不同在軟件及硬件上做出擴展或裁剪。更大的一個特點在於嵌入式系統是“專用計算機系統”,而PC機是通用的計算機系統,這體現在哪呢?舉個例子:“你是一個嵌入式軟件開發工程師你用的電腦是Thinkpad x1,你朋友可能是個牙醫,他能不能也用Thinkpad x1呢,他當然也可以。”而嵌入性系統就沒有這樣的通用性:“你做的一款在挖掘機裏面的嵌入式系統和他用來給病人拔牙的嵌入式系統是不可能通用的”。

單片機與嵌入式在學習模式上的差別

主流的芯片平臺

  主流的單片機平臺有:51單片機、PIC、STM32、AVR、MSP430等等。
  主流的嵌入式平臺有:ARM、PPC、MIPS等

開發模式的差別

  在開發模式上,兩者有哪些區別呢?
  1、單片機開發多爲裸機開發,程序規模小,多爲單個程序員獨立開發,在做一下比較複雜的產品時,也是會用到一些高端的電片機例如:基於ARM cortex-M3 架構的STM32系列單片機,並可以在單片機中跑一些簡單的RTOS(例如UCos、FreeRTOS等)。
  2、嵌入式開發幾乎全部基於嵌入式操作系統,目前使用Linux與Android系統。

編程語言的差別

  編程語言方面的差異:單片機主要使用C語言(少有彙編),與標準C略有不同,在結構體、指針、共用體及它們與數組的結合等C語言高級特性方面使用較少,而嵌入式則不同,嵌入式軟件開發主要有分爲底層、應用層。底層多使用C及彙編(並且高級特性運用較多)。應用層則多使用C++、JAVA等高級語言,嵌入式針對基於C語言的數據結構、算法運用能力要求較高。

軟硬件組成的差別

  在軟硬件組成方面:單片機學習多涉獵到簡單的外設(如Uart串口、I2C、ADC、LCD、GPIO等)而嵌入式系統則會涉獵到更多複雜的外設(如有線網卡、WIFI、藍牙、TCP、USB、音視頻圖片的編解碼等),這些複雜外設在單片機裸機程序下是很難去寫出來的(不是寫不出,是沒必要寫出),在操作系統下,本身是提供相關基礎架構及庫函數的。

嵌入式到底適不適合你學?

嵌入式學習與編程語言和英語水平的差別

  在編程語言方面嵌入式開發主要使用C語言,有的朋友會問我:我C語言一竅不通能不能學習嵌入式?我認爲是可以的,不過前提是先去學習一下簡單的C語言基礎,不需要你學的特別精深,但是基礎的知識內容還是要懂的。當然嵌入式開發還會用到彙編語言,這個可以在學習嵌入式裸機的時候邊學裸機邊學ARM彙編(沒必要吧彙編學的太精通,當然如果你有的是時間,那當然多多益善),在嵌入式中間層的開發上會用到C++多一些,個人建議用到哪一步學到哪一步,不建議把C\C++\彙編\java都學好再來看嵌入式(那都猴年馬月了),應用層會用到其他各種高級語言(難道你都要挨個學一遍?),其實你能把C學精學好,就OK了,其他語言用到的時候幾天就能學到不錯的程度。
  嵌入式學習與英語的關係(這個還是蠻重要的,因爲很多朋友都反映英語水平不好,是不是不適合學嵌入式):我想說的是英語非常重要,需要你去積累學習,因爲首先一點,我們編程時用英語寫,但是C中關鍵是在於關鍵字,這個在編程的過程中大都就記住了,那麼嵌入式學習英語的重要性體現在哪?在閱讀Datasheet上,那麼有朋友就會覺得自己英語不好就不適合嵌入式學習了,這是不對的,我英語也不怎麼好,前期我們看datasheet可以依賴於桌面詞典嘛,雖然閱讀起來速度會很慢,但不失爲一種辦法,在後期慢慢積累的過程中,我們的英語水平和看文檔的能力就好不斷提高了。so,英語不好不是學不好嵌入式的理由,這個世界上不存在笨人,只存在懶人。
  下面補充一點:嵌入式學習數電模電等等這些專業課的關係,首先嵌入式分爲嵌入式軟件和嵌入式硬件兩部分,嵌入式硬件的學習是離不開十點數電模電、電路這些專業課的,甚至相關的微積分計算、複變函數計算、基本的傅里葉變換、拉式變換和Z變換都是要了解的,當然掌握了基本計算方法以後可以利用MATLAB軟件進行運算。嵌入式軟件學習的話對硬件專業方面的需求不那麼緊張,但是軟件設計也是需要硬件輔助的,總而言之模電數電這些專業課程的學習對嵌入式學習是有影響的,但不是必須去專門學習。可以通過後期的積累慢慢總結學習。

哪些專業的朋友更適合嵌入式學習

  有的朋友本來是學外語專業的學文學專業的,感覺嵌入式是個未來的大趨勢,就打算跨行學習,我覺得這不是不可但是很難,爲什麼難呢?你想想你跟學外語專業的,對計算機領域可能一竅不通,對一下基本的名次都沒有太多的概念,你說你學起來難不難,固然很難,但不是不能學,也有很多跨行來做軟件開發的一樣可以做到很好。這個還是個人的,那麼接下來分析一下那些專業更適合嵌入式的學習:自動化專業(我就是學這個專業的,想了解我的學習歷程可以去看我的另一篇經驗分享文章,寫的很詳細)、電子信息類專業、計算機類專業、測控類專業、機械電子類專業都可以。
  總的來說,我認爲任何事物的學習最關鍵的都不是專業,你是不是這個專業的與你以後將要學習什麼事物是沒有必然聯繫的,有必然聯繫的是你自己的態度和你是不是對它有特別大的興趣(尤其是技術性很強的學科,你不喜歡他,他就是再好你也不一定能學的進去),當前你能學到什麼程度這取決於你的毅力,你會學的多快這取決於你的學習能力和專注程度,所以朋友們一旦決定要學習它,就請拼勁全力吧!

嵌入式學習路線

  好了現在到了終點了,如果你打算要好好學習嵌入式了,那麼下面的內容也許對你有一定幫助,嵌入式的學習是分階段的,每個階段有不同的學習內容,具體分幾個階段,每個階段需要學習什麼內容,我們可以接着往下看。嵌入式軟件是一個系統非常龐大的學科,嵌入式的學習路線很長,內容很雜很多,學習曲線很陡打算學習的朋友要做好心理準備,俗話說跟什麼樣的老師學習十分重要,在這裏再做一下關於嵌入式軟件學習老師的推薦:朱有鵬老師,一個好的老師對你學習的深淺、學習週期的長短、學習效果的好壞有着非常密切的關係,如果你想學習嵌入式軟件,那麼我推薦你跟朱有鵬老師來學習(本人親身體驗),朱老師講的細緻入微,面面俱到,又通俗易懂,朱老師有免費的體驗課:零基礎教你學習Linux、和基於Linux的C語言學習,兩個體系的課程都是免費的,他講的好不好,我不多說大家自己去體會,我是在淘寶上買的他的課(我不是託哈,是真的學習有不錯的感覺來給大家推薦,以後不再做相關的推薦)1500RMB左右,全套課程800小時左右,外加一套三星S5PV210(基於ARM Cortex-A8架構)的開發板,一站式講解,包含嵌入式學習的各個角落。當然如果預算不夠也可以跟着學習大綱來自學,但是難度一定是不小的。好了不多說,下面介紹一下我的嵌入式軟件學習的大綱:

一、預備知識(基礎學習)

  這部分包括Linux基礎學習和C語言基礎學習,如果你的基礎不錯可以直接跳過(後期我在做相關分享時也會直接跳過這裏,只挑一下晦澀難理解的地方重點分享):

預備知識第一部分-linux基礎學習大綱

1.瞭解當前主流操作系統及其特點					
2.瞭解什麼是雙系統與虛擬機						
3.基於VMware搭建自己的linux開發環境												
4.瞭解什麼是隱藏文件與非隱藏文件(與windows系統做對比學習)								
5.瞭解什麼是相對路徑與絕對路徑(與windows系統做對比學習)									
6.瞭解linux內核&各個發行版的差別									
7.瞭解GUI(圖形用戶界面)和cmdline(命令行)					
8.linux常用命令:例如ls、cd	、pwd&mkdir&mv&touch&cp	、rm&cat&rmdir 、ln(軟連接與硬連接)、man、apt-get、										
9.學習linux中的文件類型標記方法															
10.學習什麼是編輯器&vi和vim的關係
11.瞭解vi的兩種工作模式								
12.學習vi高級應用:查找&快速切換行&設置顯示行號				
13.學習linux命令行中一些符號的含義			
14.學習vi高級應用:行刪除&行復制粘貼		
15.瞭解普通用戶與特權用戶 su命令切換用戶			
16.rwx與linux中權限表示										
17.懂得ubuntu中使用sudo暫時獲取root權限			
18.學習linux高階命令:find、grep&which&whereis、uname&關機重啓命令、tree&mount&df、用戶管理&權限管理及其他可能用到的高階命令

預備知識第一部分-C基礎學習大綱

1.C語言基本概念
2.C語言程序開發的一般步驟
3.使用printf進行格式化輸出	
4.VMware中共享文件夾功能的使用	
5.C語言數據類型之整形	
6.數據類型之整形回顧	
7.數據類型之浮點型
8.數據類型之字符型
9.有符號數和無符號數	
10.C語言運算符之算術運算符
11.複合算術運算符	
12.++與--運算符和代碼風格問題
13.運算符總結和順序結構
14.第一種選擇結構if else
15.for循環	
16.第二種選擇結構switch case結構
17.循環結構while和do while
18.C語言之函數
19.函數三要素:定義聲明和調用
20.函數的形參和實參
21.函數的返回值、函數名
22.C語言之數組
23.數組的初始化
24.不同數據類型的數組
25.sizeof運算符
26.字符數組和字符串
27.C語言之指針
28.C語言之結構體
29.C語言之共用體(Union)	
30.C語言之宏定義
31.宏定義和枚舉
32.C語言進階篇

二、ARM裸機學習

  這裏的ARM裸機學習與STM32的裸機學習是完全不同的,這裏的裸機學習基於嵌入式系統硬件的,不再是基於windows下的IDE進行開發,而是在Linux中擁有ARM-linux交叉編譯鏈進行開發,通過usb、SD卡多種方式進行燒寫。當然ARM裸機的學習不單單是學習ARM裸機,他同樣是的針對Linux的基本操作的訓練,及學習makefile的製作重定位連接文件的製作等等,對下一步學習Uboot及Linux內核有着至關重要的作用,好了廢話不多說,直接上大綱:

ARM瑣碎知識的學習(至關重要)

  這部分主要是針對ARM的背景知識和零散雜碎知識的學習,目的是爲之後的正式學習做鋪墊。這些內容對於初學者來說非常重要。

1.瞭解ARM的成長史
2.瞭解ARM的商業模式和生態系統
4.瞭解開發板的各個版本號學習
5.學習SoC和CPU的區別&外設概念的引入
6.瞭解主流學習型主芯片
7.詳細瞭解開發板
8.瞭解嵌入式和單片機的區別
9.學習嵌入式系統的構成特點和演進方向
10.學習什麼是交叉編譯
11.瞭解CPU的設計原理、數據總線和地址總線
12.學習Jlink、SD卡等輔助設備的使用及使用原因

ARM裸機第二部分-ARM體系結構與彙編指令

  這部分是ARM裸機學習的第二部分,主要內容是ARM體系結構(指令集和CPU的關係、RISC與CISC、馮諾依曼結構與哈佛結構等)、S5PV210的地址映射、內存外存的連接方式,S5PV210的啓動過程詳解,S5PV210的編程模式與內部通用寄存器、異常向量表,ARM常用匯編指令等。

1.學習可編程器件的編程原理
2.學習指令集對CPU的意義
3.瞭解RISC和CISC的區別
4.瞭解統一編址&獨立編址&哈佛結構&馮諾依曼結構
5.深入瞭解軟件編程控制硬件的關鍵-寄存器
6.學習ARM體系結構要點
7.瞭解S5PV210的內存映射詳解
8.學習CPU和外部存儲器的接口
9.學習S5PV210的啓動過程詳解
11.學習如何在開發板上選擇不同啓動方式
12.瞭解ARM的編程模式和7種模式
13.瞭解ARM的37個寄存器詳解
14.學習ARM的異常處理方式
15.學習ARM彙編指令集(簡單學習即可))

ARM裸機第三部分-開發板、原理圖和數據手冊

1.開發板硬件手冊帶讀
2.開發板刷系統(USB\SD兩種方式)
3.X210核心板、底板原理圖導讀
4.S5PV210數據手冊導讀	
5.x210的dnw刷機
6.linux下使用dd命令刷寫uboot

ARM裸機第四部分-GPIO和LED

1.裸機實驗體驗之usb啓動配合dnw工具下載
2.裸機實驗體驗之SD卡下載
3.自己動手安裝交叉編譯工具鏈
4.Makefile大俠隆重登場
5.mkv210_image.c文件詳解
6.一步步點亮LED1_硬件工作原理及原理圖查閱
7.一步步點亮LED2_數據手冊查閱及相關寄存器瀏覽
8.一步步點亮LED3_從零開始手寫彙編點亮LED
9.一步步點亮LED4_使用位運算實現複雜點亮要求
10.一步步點亮LED5_彙編編寫延時函數並實現LED閃爍效果
11.一步步點亮LED6_再難一點的流水燈效果
12.反彙編工具objdump的使用簡介	

ARM裸機第五部分-SDRAM和重定位relocate

1.彙編寫啓動代碼之關看門狗
2.彙編寫啓動代碼之設置棧和調用C語言
3.彙編寫啓動代碼之開iCache
4.重定位引入和鏈接腳本
5.代碼重定位實戰
6.SDRAM引入
7.SDRAM初始化
8.彙編初始化SDRAM詳解

ARM裸機第六部分-S5PV210的時鐘系統

1.SoC時鐘系統簡介
2.S5PV210的時鐘系統簡介
3.S5PV210時鐘域詳解
4.S5PV210時鐘體系框圖詳解
5.時鐘設置的關鍵性寄存器
6.彙編實現時鐘設置代碼詳解
7.C語言實現時鐘設置代碼詳解

ARM裸機第七部分-串口通信詳解

1.通信涉及的幾個基礎概念
2.串口通信的基本概念
3.串口通信的基本原理
4.S5PV210串行通信接口詳解
5.S5PV210串行通信編程實戰
6.uart stdio的移植
7.串口實驗燒錄問題總結

ARM裸機第八部分-按鍵和CPU的中斷系統

1.什麼是按
2.輪詢方式處理按鍵
3.串口輸出和按鍵消抖
4.S5PV210的中斷體系介紹
5.異常向量表的編程處理
6.S5PV210的向量中斷控制器
7.S5PV210中斷處理的主要寄存器
8.S5PV210中斷處理的編程實踐
9.外部中斷
10.中斷方式處理按鍵編程實踐

ARM裸機第九部分-定時器、看門狗和RTC

1.什麼是定時器
2.S5PV210中的定時器
3.S5PV210的PWM定時器1
4.S5PV210的PWM定時器2
5.S5PV210的PWM定時器3
6.蜂鳴器和PWM定時器編程實踐1
7.蜂鳴器和PWM定時器編程實踐2
8.看門狗定時器
9.看門狗定時器的編程實踐
10.實時時鐘RTC
11.RTC編程實戰

ARM裸機第十部分-SD卡啓動詳解

1.主流的外存設備介紹
2.SD卡的特點和背景知識
3.SD卡的編程接口
.4.S5PV210的SD卡啓動詳解1
5.S5PV210的SD卡啓動詳解2
6.S5PV210的SD卡啓動實戰1
7.S5PV210的SD卡啓動實戰2
8.解決X210開發板的軟開關按鍵問題

ARM裸機第十一部分-NandFlash和iNand

1.NandFlash的接口
2.NandFlash的結構
3.NandFlash的常見操作及流程分析
4.S5PV210的NandFlash控制器
5.Nand操作代碼解析
6.iNand介紹
7.SD卡/iNand操作
8.SD/iNand代碼實戰分析1
9.SD/iNand代碼實戰分析2
10.SD/iNand代碼實戰分析3

ARM裸機第十二部分-I2C通信詳解

1.什麼是I2C通信
2.由I2C學通信時序
3.S5PV210的I2C控制器
4.X210板載gsensor介紹
5.I2C總線的通信流程
6.I2C通信代碼分析1
7.I2C通信代碼分析2

ARM裸機第十三部分-ADC

1.ADC的引入
2.ADC的主要相關概念
3.S5PV210的ADC控制器
4.AD轉換的編程實踐1
5.AD轉換的編程實踐2

ARM裸機第十四部分-LCD顯示器

1.LCD簡介
2.LCD的接口技術
3.LCD如何顯示圖像1
4.LCD如何顯示圖像2
5.LCD的六個主要時序參數1
.6.LCD的六個主要時序參數2
7.LCD顯示的主要相關概念
8.顏色在計算機中的表示
9.S5PV210的LCD控制器
10.LCD編程實戰1-LCD控制器初始化
11.LCD編程實戰2-顯示像素&刷背景
12.LCD編程實戰3-橫線豎線斜線&畫圓
13.LCD編程實戰4-寫英文中文字符
14.LCD編程實戰5-畫圖
15.LCD編程實戰6-畫圖測試及調試
16.未完成事項展望	

ARM裸機第十五部分-觸摸屏TouchScreen

1.輸入類設備簡介
2.電阻式觸摸屏的原理
3.S5PV210的電阻觸摸屏控制器
4.電容觸摸屏的原理
5.ft5x06電容觸摸IC簡介

ARM裸機第十六部分-shell原理和問答機制引入

1.shell是什麼鬼
2.shell實戰1-從零寫最簡單shell
3.shell實戰2-將簡易shell移植到開發板中
4.shell實戰3-定義標準命令集及解析
5.shell實戰4-添加第一個命令
6.shell實戰5-添加其他命令1
7.shell實戰6-添加其他命令2
8.shell實戰7-實現開機倒計時自動執行命令1
9.shell實戰7-實現開機倒計時自動執行命令2
10.shell實戰8-初步實現環境變量			

二、C語言進階

內存這個大話題

1.程序運行爲什麼需要內存1
2.程序運行爲什麼需要內存2
3.位、字節、半字、字的概念和內存位寬
4.內存編址和尋址、內存對齊
5.C語言如何操作內存
6.內存管理之結構體
7、內存管理之棧
8、內存管理之堆
9、複雜數據結構

C語言位操作

1.常用位操作符
2.位與位或位異或在操作寄存器時的特殊作用
3.如何用位運算構建特定二進制數
4.位運算實戰演練1
5.位運算實戰演練2
6.技術升級:用宏定義來完成位運算

指針纔是C的精髓

1.指針到底是什麼?
2.指針帶來的一些符號的理解
3.野指針問題
4.const關鍵字與指針
5.深入學習一下數組
6.指針與數組的天生姻緣
7.指針與強制類型轉換
8.指針、數組與sizeof運算符
9.指針與函數傳參
10.輸入型參數與輸出型參數	

C語言複雜表達式與指針高級應用

1.指針數組與數組指針
2.函數指針與typedef
3.函數指針實戰1
4.函數指針實戰2
5.再論typedef
6.二重指針
7.二維數組
8.二維數組的運算和指針

數組&字符串&結構體&共用體&枚舉

1.程序中內存從哪裏來1
2.程序中內存從哪裏來2
3.程序中內存從哪裏來2
4.程序中內存從哪裏來4
5.C語言的字符串類型
6.字符串和字符數組的細節
7.C語言之結構體概述
8.結構體的對齊訪問1
9.結構體的對齊訪問2
10.結構體的對齊訪問3
11.offsetof宏與container_of宏
12.共用體union
13.大小端模式1
14.大小端模式2
15.枚舉

C語言宏定義與預處理、函數和函數庫

1.C語言預處理理論
2.C語言預處理代碼實戰
3.宏定義1
4.宏定義2
5.函數的本質
6.函數的基本使用
7.遞歸函數
8.函數庫
9.字符串函數
10.數學庫函數
11.自己製作靜態鏈接庫並使用
12.自己製作動態鏈接庫並使用

三、uboot與linux內核移植

uboot學習前傳

1.爲什麼要有uboot
2.爲什麼是uboot
3.uboot必須解決哪些問題
4.uboot的工作方式
5.uboot的常用命令1
6.uboot的常用命令2
7.開發板和主機的ping通
8.uboot的常用命令3
9.uboot的常用命令4
10.uboot的常用環境變量1
11.uboot的常用環境變量2

補基礎之shell和Makefile

1.shell介紹
2.動手寫第一個shell
3.shell編程學習1
4.shell編程學習2
5.shell中的循環結構
6.shell中其他值得關注的知識點
7.Makefile基礎回顧
8.Mafile補充學習1
9.Makefile補充學習2

零距離初體驗uboot

1.X210官方uboot配置編譯實踐1
2.X210官方uboot配置編譯實踐2
3.uboot的源碼目錄分析1
4.uboot的源碼目錄分析2
5.uboot的源碼目錄分析3
6.SourceInsight的基本使用

uboot配置和編譯過程詳解

1.uboot主Makefile分析1
2.uboot主Makefile分析2
3.uboot主Makefile分析3
4.uboot主Makefile分析4
5.uboot主Makefile分析5
6.uboot主Makefile分析6
7.uboot配置過程詳解1
8.uboot配置過程詳解2
9.uboot的鏈接腳本

uboot源碼分析1-啓動第一階段

1.start.S引入
2.start.S解析1
3.start.S解析2
4.start.S解析3
5.start.S解析4
6.start.S解析5
7.start.S解析6
8.start.S解析7
9.uboot重定位詳解
10.start.S解析8
11.start.S解析9
12.start.S解析10
13.start.S解析11

uboot源碼分析2-啓動第二階段

1.start_armboot函數簡介
2.start_armboot解析1
3.內存使用排布
4.start_armboot解析2
5.start_armboot解析3
6.start_armboot解析4
7.start_armboot解析5
8.start_armboot解析6
9.start_armboot解析7
10.start_armboot解析8
11.start_armboot解析9
12.start_armboot解析10
13.start_armboot解析11
14.start_armboot解析12
15.start_armboot解析13
16.start_armboot解析14
17.uboot啓動2階段總結

uboot源碼分析3-uboot如何啓動內核

1.uboot和內核到底是什麼
2.啓動內核第一步:加載內核到DDR中
3.zImage和uImage的區別聯繫
4.zImage啓動細節
5.uImage啓動
6.do_bootm_linux函數
7.傳參詳解
8.uboot啓動內核的總結

uboot源碼分析4-uboot的命令體系

1.uboot命令體系基礎
2.uboot命令解析和執行過程分析
3.uboot如何處理命令集1
4.uboot如何處理命令集2	
5.uboot中增加自定義命令

uboot源碼分析5-uboot的環境變量

1.uboot的環境變量基礎
2.環境變量相關命令源碼解析1
3.環境變量相關命令源碼解析2
4.環境變量相關命令源碼解析3
5.uboot內部獲取環境變量

uboot源碼分析6-uboot的硬件驅動部分

1.uboot與linux驅動
2.iNand/SD驅動解析1
3.iNand/SD驅動解析2
4.iNand/SD驅動解析3

uboot的移植1-從三星官方uboot開始移植

1.移植前的準備工作
2.ubuntu14.04上網及安裝openssh
3.移植初體驗
4.時鐘和DDR的配置移植
5.DDR地址另外配置
6.DDR地址另外配置2
7.inand驅動問題的解決
8.一些小問題的修補
9.網卡驅動移植1
10.網卡驅動移植2
11.網卡驅動如何工作
12.使用自己移植的uboot啓動內核

uboot的移植2-從uboot官方標準uboot開始移植

1.選擇合適的官方原版uboot
2.先初步瀏覽官方原版uboot
3.mkconfig腳本分析
4.先解決官方版本uboot的燒錄運行
5.start.S文件分析與移植1
6.start.S文件分析與移植2
7.添加DDR初始化1
8.添加DDR初始化2
9.添加uboot第二階段重定位1
10.添加uboot第二階段重定位2
11.CPU時鐘信息顯示移植1
12.CPU時鐘信息顯示移植2
13.CPU時鐘信息顯示移植3
14.board和DDR配置顯示移植
15.board_init_r移植
16.uboot2013.10中SD/MMC驅動瀏覽
17.SD卡驅動移植1
18.SD卡驅動移植2
19.SD卡驅動移植3
20.環境變量的移植
21.環境變量的測試和配置移植
22.網卡驅動的移植1
23.網卡驅動的移植2

uboot雜記-logo顯示和fastboot原理等

1.X210的uboot中LCD操作分析
2.logo顯示和LCD屏幕分辨率適配
3.fastboot的基本分析
4.uboot的fastboot代碼分析1
5.uboot的fastboot代碼分析2

話說linux內核

1.內核和發行版的區別
2.內核和驅動的關聯
3.內核和應用程序、根文件系統的關聯
4.linux內核的模塊化設計
5.選擇合適版本的內核

內核的配置和編譯原理

1.linux內核源碼目錄結構1
2.linux內核源碼目錄結構2
3.內核配置和編譯體驗
4.內核的配置原理1
5.menuconfig的使用和演示
6.menuconfig的工作原理
7.Kconfig文件詳解1
8.Kconfig文件詳解2
9.menuconfig的實驗學習思路

內核的啓動過程分析

1.做好內核分析的準備工作
2.head.S文件分析1
3.內核啓動的彙編階段
4.內核啓動的C語言階段1
5.內核啓動的C語言階段2
6.內核啓動的C語言階段3
7.內核啓動的C語言階段4
8.內核啓動的C語言階段5
9.內核啓動的C語言階段6
10.init進程詳解1
11.init進程詳解2
12.cmdline常用參數
13.內核中架構相關代碼簡介

內核的移植1-從三星官方內核開始移植

1.內核移植初體驗
2.初步移植以看到啓動信息
3.內核中機器碼的確定
4.解決內核啓動中的錯誤
5.iNand的問題和安排
6.網卡驅動的移植和添加實驗
7.內核啓動第一階段的調試方法

根文件系統的原理

1.根文件系統概述
2.根文件系統的形式
3.自己製作ext3格式的根文件系統
4.nfs方式啓動自制簡易文件夾形式的rootfs
5.到底什麼是linuxrc
6.rootfs中還應該有什麼
7.VFS簡介

根文件系統構建實驗及過程詳解

1.根文件系統的構建路線
2.busybox的移植實戰
3.inittab詳解
4.busybox源碼分析1
5.busybox源碼分析2
6.rcS文件介紹1
7.rcS文件實戰1
8.rcS文件介紹2
9.profile文件和用戶登錄理論
10.用戶登錄實戰
11.動態鏈接庫的拷貝
12.開機自啓動與主流rcS格式介紹
13.製作ext2格式的鏡像並燒錄啓動

buildroot的引入和介紹

1.X210的bsp介紹
2.mk文件分析
3.buildroot引入

四、linux應用編程和網絡編程

linux中的文件IO

1.應用編程框架介紹
2.文件操作的主要接口API
3.一個簡單的文件讀寫實例
4.open函數的flag詳解1
5.open函數的flag詳解2
6.文件讀寫的一些細節
7.linux系統如何管理文件
8.lseek詳解
9.多次打開同一文件與O_APPEND
10.文件共享的實現方式
11.文件描述符的複製1
12.文件描述符的複製2
13.fcntl函數介紹
14.標準IO庫介紹

文件屬性

1.linux中各種文件類型
2.常用文件屬性獲取
3.stat函數的應用案例
4.文件權限管理1
5.文件權限管理2
6.讀取目錄文件

獲取系統信息(系統時間、隨機數、proc中的文件)

1.關於時間的概念
2.linux系統中的時間
3.時間相關API實戰1
4.時間相關API實戰2
5.linux中使用隨機數
6.proc文件系統介紹
7.proc文件系統的使用

進程(進程環境、進程控制、進程關係、守護進程、進程間通信)

1.程序的開始和結束
2.進程環境
3.進程的正式引入
4.fork創建子進程
5.父子進程對文件的操作
6.進程的誕生和消亡
7.父進程wait回收子進程
8.waitpid介紹
9.exec族函數及實戰1
10.exec族函數及實戰2
11.進程狀態和system函數
12.進程關係
13.守護進程的引入
14.編寫簡單守護進程
15.使用syslog來記錄調試信息
16.讓程序不能被多次運行
17.linux的進程間通信概述
18.linux的IPC機制1-管道
19.SystemV IPC介紹

信號

1.什麼是信號
2.常見信號介紹
3.進程對信號的處理
4.alarm和pause函數

高級IO

1.非阻塞IO
2.阻塞式IO的困境
3.併發式IO的解決方案
4.IO多路複用原理
5.IO多路複用實踐
6.異步IO
7.存儲映射IO

線程

1.再論進程
2.線程的引入
3.線程常見函數
4.線程同步之信號量1
5.線程同步之信號量2
6.線程同步之互斥鎖 
7.線程同步之條件變量

網絡基礎

1.網絡通信概述
2.網絡通信基礎知識1
3.網絡通信基礎知識2
4.網絡通信基礎知識3
5.網絡通信基礎知識4
6.網絡通信基礎知識5

linux網絡編程

1.linux網絡編程框架
2.TCP協議的學習1
3.TCP協議的學習2
4.socket編程接口介紹
5.IP地址格式轉換函數實踐
6.soekct實踐編程1
7.soekct實踐編程2
8.socket實踐編程3
9.socket編程實踐4

五、linux驅動開發

驅動怎麼學

1.什麼是驅動1
2.什麼是驅動2
3.模塊化設計
4.linux設備驅動分類
5.驅動程序的安全性要求
6.驅動應該這麼學

字節設備驅動基礎

1.開啓驅動開發之路
2.最簡單的模塊源碼分析1
3.最簡單的模塊源碼分析2
4.最簡單的模塊源碼分析3

字符設備驅動高級

1.註冊字符設備驅動新接口1
2.註冊字符設備驅動新接口2
3.註冊字符設備驅動新接口3
4.註冊字符設備驅動新接口4
5.字符設備驅動註冊代碼分析1
6.字符設備驅動註冊代碼分析2
7.自動創建字符設備驅動的設備文件
8.設備類相關代碼分析1
9.設備類相關代碼分析2
10.靜態映射表建立過程分析
11.動態映射結構體方式操作寄存器
12.內核提供的讀寫寄存器接口

驅動框架入門之LED

1.何謂驅動框架
2.內核驅動框架中LED的基本情況
3.初步分析led驅動框架源碼
4.在內核中添加或去除某個驅動
5.基於驅動框架寫led驅動1
6.linux內核的gpiolib學習1
7.使用gpiolib完成led驅動
8.將驅動添加到內核中

linux設備驅動模型

1.linux設備驅動模型簡介
2.設備驅動模型的底層架構
3.總線式設備驅動組織方式
4.platform平臺總線簡介

misc類設備與蜂鳴器驅動

1.板載蜂鳴器驅動測試
2.misc類設備介紹
3.misc驅動框架源碼分析1
4.misc驅動框架源碼分析2
5.蜂鳴器驅動源碼分析1
6.蜂鳴器驅動源碼分析2

framebuffer驅動詳解

1.framebuffer介紹
2.framebuffer應用編程實踐1
3.framebuffer應用編程實踐2
4.framebuffer應用編程實踐3
5.framebuffer驅動框架總覽
6.framebuffer驅動框架分析1
7.framebuffer驅動框架分析2
8.framebuffer驅動框架分析3
9.framebuffer驅動分析1
10.framebuffer驅動分析2
11.framebuffer驅動分析3
12.framebuffer驅動分析4
13.framebuffer驅動分析5
14.應用層爲何不能設置分辨率
15.折騰內核的啓動logo

input子系統基礎之按鍵

1.什麼是input子系統
2.input設備應用層編程實踐1
3.input設備應用層編程實踐2
4.input子系統架構總覽1
5.input子系統架構總覽2
6.輸入核心層源碼分析1
7.輸入核心層源碼分析2
8.輸入事件驅動層源碼分析
9.輸入設備驅動層源碼分析1
10.輸入設備驅動層源碼分析2
11.中斷方式按鍵驅動實戰1
12.中斷方式按鍵驅動實戰2

觸摸屏驅動移植實戰

1.觸摸屏驅動概覽
2.內核中的競爭狀態和互斥1
3.內核中的競爭狀態和互斥2
4.中斷的上下半部1
5.中斷的上下半部2
6.linux內核的I2C子系統詳解1
7.linux內核的I2C子系統詳解2
8.linux內核的I2C子系統詳解3
9.linux內核的I2C子系統詳解4
10.linux內核的I2C子系統詳解5
11.linux內核的I2C子系統詳解6
12.linux內核的I2C子系統詳解7
13.gslX680驅動的移植實踐
14.gslX680驅動源碼分析2
15.gslX680驅動源碼分析2
16.老版本觸摸屏的驅動

5.10.塊設備驅動介紹

1.正確理解塊設備驅動的概念
2.塊設備驅動框架簡介
3.塊設備驅動案例分析1
4塊設備驅動案例分析2
5.塊設備驅動案例分析3

網絡設備驅動介紹

1.網絡設備驅動概述
2.虛擬網卡驅動分析1
3.虛擬網卡驅動分析2
4.DM9000驅動源碼分析1
5.DM9000驅動源碼分析2

結束語

  以上就是我在從朱老師物聯網大講堂整理到的嵌入式軟件學習的全部大綱,往後的分享,我會按照大綱的順序,以我自己的個人理解爲主進行分享。在這裏非常感謝朱有鵬老師搭建的這個龐大的嵌入式學習體系和平臺如此繁雜的內容,如果自學誰都不敢保證要耗時多長時間,朱老師的課總時長共800個小時,按照我自己的學習速度每天7-8小時嵌入式學習時間(3-4小時視頻播放時間),完全學完需要6-7個月的時間,可見嵌入式學習的路線之長。
  好了最後,再好的老師也帶不出懶惰的學生,學習還是要依靠自己的個人努力去尋找更加美好的明天。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章