姓名:黃楠琳? ? ? ?學號:19020100011? ? ? ? 學院:電子工程學院
轉自:https://blog.csdn.net/weixin_41213648/article/details/87895929
【嵌牛導讀】本篇文章簡單介紹了如何學習嵌入式Linux操作系統(tǒng)
【嵌牛鼻子】嵌入式Linux
【嵌牛提問】?怎么學習嵌入式Linux操作系統(tǒng)?
【嵌牛正文】
1 操作系統(tǒng)介紹
①操作系統(tǒng)具有進程管理、存儲管理、文件管理和設備管理等功能,這些核心功能非常穩(wěn)定可靠,基本上不需要我們修改代碼。我們只需要針對自己的硬件完善驅動程序
②學習驅動時必定會涉及其他知識,比如存儲管理、進程調度。當你深入理解了驅動程序后,也會加深對操作系統(tǒng)其他部分的理解
③Linux內核中大部分代碼都是設備驅動程序,可以認為Linux內核由各類驅動構成。但是,要成為該領域的高手,一定要深入理解Linux操作系統(tǒng)本身,要去研讀它的源代碼。
2 學習驅動程序之前的基礎知識
2.1 C語言
只要是理工科專業(yè)的,似乎都會教C語言。當你掌握基本語法后,就可以在電腦上練習一些C語言習題了;
當你寫過幾個C程序后,就可以進入下一階段的裸機開發(fā)。
①不需要太深入,作為快速入門,只要你會編寫“Hello, world!”,會寫冒泡排序,會一些基礎的語法操作,暫時就夠了。
指針操作是重點
不需要去學習過多的數據結構知識,只需要掌握鏈表操作,其他不用學習,比如:隊列、二叉樹等等都不用學;
不需要去學習任何的函數使用,比如文件操作、多線程編程、網絡編程等等;C語言是在寫代碼中精進的。
②可以在Visual Studio下學習,也可以在Linux下學習,后者需要掌握一些編譯命令
2.2 PC Linux基本操作:
對于PC Linux,我們推薦使用Ubuntu,在它上面安裝軟件非常簡便。工作模式通常是這樣:在Windows下閱讀、編寫代碼,然后把代碼上傳到PC Linux去編譯。實際上,Ubuntu的桌面系統(tǒng)已經很好用了,我們拿到各種智能機可以很快上手,相信Ubuntu的桌面系統(tǒng)也可以讓你很快上手。為了提高工作效率,我們通常使用命令行來操作Ubuntu。
不用擔心,你前期只需要掌握這幾條命令就可以:
①cd : Change Directory(改變目錄)
cd 目錄名 ? ?// 進入某個目錄
cd .. ? ? ? // cd “兩個點”:返回上一級目錄
cd - ? ? ? ?// cd “短橫”:返回上一次所在目錄
②pwd : Print Work Directory(打印當前目錄 顯示出當前工作目錄的絕對路徑)
③mkdir : Make Directory(創(chuàng)建目錄)
mkdir abc ? ? ? ? // 創(chuàng)建文件夾abc
mkdir -p a/b/c ? // 創(chuàng)建文件夾a,再a下創(chuàng)建文件夾b,再在b下創(chuàng)建文件夾c
④rm : Remove(刪除目錄或文件)
rm ?file ? ? // 刪除名為file的文件
rm -rf dir ?// 刪除名為dir的目錄
⑤ls : List(列出目錄內容)
⑥mount : 掛載
mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mnt
mount -t yaffs /dev/mtdblock3 /mnt
⑦chown : Change owner(改變文件的屬主,即擁有者)
chown book:book /work -R ?// 對/work目錄及其下所有內容,屬主改為book用戶,組改為book
⑧chmod : Change mode(改變權限),下面的例子很簡單粗暴
chmod 777 /work -R ?// 對/work目錄及其下所有內容,權限改為可讀、可寫、可執(zhí)行
⑨vi : Linux下最常用的編輯命令,使用稍微復雜,請自己搜索用法。
要練習這些命令,你可以進入Ubuntu桌面系統(tǒng)后,打開終端輸入那些命令;或是用SecureCRT、putty等工具遠程登錄Ubuntu后練習。
2.3 硬件知識
我們學習硬件知識的目的在于能看懂原理圖,看懂通信協(xié)議,看懂芯片手冊;不求能設計原理圖,更不求能設計電路板。
對于正統(tǒng)的方法,你應該這樣學習:
①學習《微機原理》,理解一個計算機的組成及各個部件的交互原理。
②學習《數字電路》,理解各種門電路的原理及使用,還可以掌握一些邏輯運算(與、或等)。
2.4 要不要專門學習Windows下的單片機開發(fā)
很多學校都開通了單片機的課程,很多人都是從51單片機、AVR單片機,現在比較新的STM32單片機開始接觸嵌入式領域,并且使用Windows下的開發(fā)軟件,比如keil、MDK等。
問題來了,要不要專門學習Windows下的單片機開發(fā)?
①如果這是你們專業(yè)的必修課,那就學吧
②如果你的專業(yè)跟單片機密切相關,比如機械控制等,那就學吧
③如果你只是想從單片機入門,然后學習更廣闊的嵌入式Linux,那么放棄在Windows下學習單片機吧!
理由如下:
①Windows下的單片機學習,深度不夠
Windows下有很好的圖形界面單片機開發(fā)軟件,比如keil、MDK等。它們封裝了很多技術細節(jié),比如:
你只會從main函數開始編寫代碼,卻不知道上電后第1條代碼是怎么執(zhí)行的;你可以編寫中斷處理函數,但是卻不知道它是怎么被調用的;你不知道程序怎么從Flash上被讀入內存;也不知道內存是怎么劃分使用的,不知道棧在哪、堆在哪;當你想裁剪程序降低對Flash、內存的使用時,你無從下手;當你新建一個文件時,它被自動加入到工程里,但是其中的機理你完全不懂等等等。
②基于ARM+Linux裸機學習,可以學得更深,并且更貼合后續(xù)的Linux學習。
實際上它就是Linux下的單片機學習,只是一切更加原始:所有的代碼需要你自己來編寫;哪些文件加入工程,需要你自己來管理。在工作中,我們當然傾向于使用Windows下更便利的工具,但是在學習階段,我們更想學習到程序的本質。
一切從零編寫代碼、管理代碼,可以讓我們學習到更多知識:
你需要了解芯片的上電啟動過程,知道第1條代碼如何運行;你需要掌握怎么把程序從Flash上讀入內存;需要理解內存怎么規(guī)劃使用,比如棧在哪,堆在哪;需要理解代碼重定位;需要知道中斷發(fā)生后,軟硬件怎么保護現場、跳到中斷入口、調用中斷程序、恢復現場;你會知道,main函數不是我們編寫的第1個函數;你會知道,芯片從上電開始,程序是怎么被搬運執(zhí)行的;你會知道,函數調用過程中,參數是如何傳遞的;你會知道,中斷發(fā)生時,每一個寄存器的值都要小心對待等等等。你掌握了ARM+Linux的裸機開發(fā),再回去看Windows下的單片機開發(fā),會驚呼:怎么那么簡單!并且你會完全明白這些工具沒有向你展示的技術細節(jié)。
驅動程序=Linux驅動程序軟件框架+ARM開發(fā)板硬件操作,我們可以從簡單的裸機開發(fā)入手,先掌握硬件操作,并且還可以:
①掌握如何在PC Linux下編譯程序、把程序燒錄到板子上并運行它
②為學習bootloader打基礎:掌握了各種硬件操作后,后面一組合就是一個bootloader
2.5?為什么選擇ARM9 S3C2440開發(fā)板,而不是其他性能更好的?
有一個錯誤的概念:S3C2440過時了、ARM9過時了。這是不對的,如果你是軟件工程師,無論是ARM9、ARM11、A8還是A9,對我們來說是沒有差別的。一款芯片,上面有CPU,還有眾多的片上設備(比如UART、USB、LCD控制器)。我們寫程序時,并不涉及CPU,只是去操作那些片上設備。所以:差別在于片上設備,不在于CPU核;差別在于寄存器操作不一樣。因為我們寫驅動并不涉及CPU的核心,只是操作CPU之外的設備,只是讀寫這些設備的寄存器。之所以推薦S3C2440,是因為它的Linux學習資料最豐富,并有配套的第1、2期視頻。
2.6 怎么學習ARM+Linux的裸機開發(fā)
學習裸機開發(fā)的目的有兩個:
①掌握裸機程序的結構,為后續(xù)的u-boot作準備
②練習硬件知識,即:怎么看原理圖、芯片手冊,怎么寫代碼來操作硬件
后面的u-boot可以認為是裸機程序的集合,我們在裸機開發(fā)中逐個掌握各個部件,再集合起來就可以得到一個u-boot了。后續(xù)的驅動開發(fā),也涉及硬件操作,你可以在裸機開發(fā)中學習硬件知識。
注意:如果你并不關心裸機的程序結構,不關心bootloader的實現,這部分是可以先略過的。在后面的驅動視頻中,我們也會重新講解所涉及的硬件知識。
2.7 bootloader的學習
bootloader有很多種,vivi、u-boot等等,最常用的是u-boot。
u-boot功能強大、源碼比較多,對于編程經驗不豐富、閱讀代碼經驗不豐富的人,一開始可能會覺得難以掌握。但是,u-boot的主要功能就是:啟動內核。它涉及:讀取內核到內存、設置啟動參數、啟動內核。按照這個主線,我們嘗試自己從零編寫一個bootloader,這個程序相對簡單,可以讓我們快速理解u-boot主要功能的實現。
2.8 Linux內核的學習
前面說過,內核本身不是我們學習的重點,但是了解一下內核的啟動過程,還是很有必要的:工作中有可能要修改內核以適配硬件,掌握了啟動過程才知道去修改哪些文件。
2.9 根文件系統(tǒng)
在驅動程序開發(fā)階段,我們喜歡搭建一個最小根文件系統(tǒng)來調試驅動;在開發(fā)應用程序時,也需要搭建文件系統(tǒng),把各種庫、配置文件放進去;在發(fā)布產品時,你還需要修改配置文件,使得產品可以自動運行程序;甚至你想實現插上U盤后自動啟動某個程序,這也要要修改配置文件;這一切,都需要你理解根文件系統(tǒng)的構成,理解內核啟動后是根據什么配置文件來啟動哪些應用程序。
3.1 經典字符設備驅動程序
視頻中以LED、按鍵驅動為例,講解并練習開發(fā)過程中碰到的機制:查詢、休眠-喚醒、中斷、異步通知、poll、同步、互斥等等。后續(xù)更復雜的驅動程序,就是在這些機制的基礎上,根據硬件特性設計出精巧的軟件框架。
3.2 工作中各類驅動程序
3.3 調試方法
4 Linux應用程序的學習
對于大多數人來說,第1個C程序是在Windows的Visual Studio C++(簡稱VC)上寫的,所以你們關心的也許是:嵌入式Linux應用程序,跟VC應用程序之間的區(qū)別:
①編譯方法不同:
在VC上點點鼠標即可編譯,對于嵌入式Linux應用程序,我們需要“交叉編譯”:程序要在PC Linux上編譯,但是運行時要放到單板上。并且,它的編譯環(huán)境需要你自己搭建:解壓出工具鏈后設計PATH,還要自己構造一套Makefile系統(tǒng)。
②調試方法不同:
在VC上點點鼠標就可以調試,對于嵌入式Linux應用程序,你可以更喜歡用打??;或是在PC Linux上通過GDB觀察應用程序在單板上的運行狀況。
③可用的資源不同:
對于VC程序,你可以直接使用微軟公司提供的各種類庫;對于嵌入式Linux應用程序,很多時候需要去尋找、下載、編譯、使用開源庫。
④功能不同:
VC程序運行在PC上,一般是用來解決某些純軟件的問題,比如整理數據、修圖、聯網播放音樂之類。嵌入式Linux應用程序一般都要操作若干種硬件,比如監(jiān)控設備中要操作攝像頭、存儲音視頻,無人機中要操作GPS、螺旋槳,POS機中要操作銀行卡等等。它跟單板上的硬件聯系很大,很多時候需要你懂點硬件知識,至少是知道怎么通過驅動程序來操作這些硬件。
上述4點的不同,花很少的時間就可以掌握。
如果你有志于開發(fā)應用程序,那么一定要有算法、數據結構、網絡編程等基礎,然后再掌握一些設計模式,最后就是多參加一些實際項目的開發(fā)了。