姓名:黃楠琳? ? ? ?學(xué)號:19020100011? ? ? ? 學(xué)院:電子工程學(xué)院
轉(zhuǎn)自:https://blog.csdn.net/weixin_41213648/article/details/87895929
【嵌牛導(dǎo)讀】本篇文章簡單介紹了如何學(xué)習(xí)嵌入式Linux操作系統(tǒng)
【嵌牛鼻子】嵌入式Linux
【嵌牛提問】?怎么學(xué)習(xí)嵌入式Linux操作系統(tǒng)?
【嵌牛正文】
1 操作系統(tǒng)介紹
①操作系統(tǒng)具有進(jìn)程管理、存儲管理洪碳、文件管理和設(shè)備管理等功能旅东,這些核心功能非常穩(wěn)定可靠靡狞,基本上不需要我們修改代碼蔬咬。我們只需要針對自己的硬件完善驅(qū)動程序
②學(xué)習(xí)驅(qū)動時必定會涉及其他知識叹放,比如存儲管理、進(jìn)程調(diào)度牲览。當(dāng)你深入理解了驅(qū)動程序后墓陈,也會加深對操作系統(tǒng)其他部分的理解
③Linux內(nèi)核中大部分代碼都是設(shè)備驅(qū)動程序,可以認(rèn)為Linux內(nèi)核由各類驅(qū)動構(gòu)成竭恬。但是跛蛋,要成為該領(lǐng)域的高手,一定要深入理解Linux操作系統(tǒng)本身痊硕,要去研讀它的源代碼赊级。
2 學(xué)習(xí)驅(qū)動程序之前的基礎(chǔ)知識
2.1 C語言
只要是理工科專業(yè)的,似乎都會教C語言岔绸。當(dāng)你掌握基本語法后理逊,就可以在電腦上練習(xí)一些C語言習(xí)題了;
當(dāng)你寫過幾個C程序后盒揉,就可以進(jìn)入下一階段的裸機開發(fā)晋被。
①不需要太深入,作為快速入門刚盈,只要你會編寫“Hello, world!”羡洛,會寫冒泡排序,會一些基礎(chǔ)的語法操作藕漱,暫時就夠了欲侮。
指針操作是重點
不需要去學(xué)習(xí)過多的數(shù)據(jù)結(jié)構(gòu)知識,只需要掌握鏈表操作肋联,其他不用學(xué)習(xí)威蕉,比如:隊列、二叉樹等等都不用學(xué)橄仍;
不需要去學(xué)習(xí)任何的函數(shù)使用牍戚,比如文件操作、多線程編程虑粥、網(wǎng)絡(luò)編程等等如孝;C語言是在寫代碼中精進(jìn)的。
②可以在Visual Studio下學(xué)習(xí)舀奶,也可以在Linux下學(xué)習(xí)暑竟,后者需要掌握一些編譯命令
2.2 PC Linux基本操作:
對于PC Linux,我們推薦使用Ubuntu育勺,在它上面安裝軟件非常簡便但荤。工作模式通常是這樣:在Windows下閱讀、編寫代碼涧至,然后把代碼上傳到PC Linux去編譯腹躁。實際上,Ubuntu的桌面系統(tǒng)已經(jīng)很好用了南蓬,我們拿到各種智能機可以很快上手纺非,相信Ubuntu的桌面系統(tǒng)也可以讓你很快上手。為了提高工作效率赘方,我們通常使用命令行來操作Ubuntu烧颖。
不用擔(dān)心,你前期只需要掌握這幾條命令就可以:
①cd : Change Directory(改變目錄)
cd 目錄名 ? ?// 進(jìn)入某個目錄
cd .. ? ? ? // cd “兩個點”:返回上一級目錄
cd - ? ? ? ?// cd “短橫”:返回上一次所在目錄
②pwd : Print Work Directory(打印當(dāng)前目錄 顯示出當(dāng)前工作目錄的絕對路徑)
③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(列出目錄內(nèi)容)
⑥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目錄及其下所有內(nèi)容跳夭,屬主改為book用戶涂圆,組改為book
⑧chmod : Change mode(改變權(quán)限),下面的例子很簡單粗暴
chmod 777 /work -R ?// 對/work目錄及其下所有內(nèi)容币叹,權(quán)限改為可讀润歉、可寫、可執(zhí)行
⑨vi : Linux下最常用的編輯命令颈抚,使用稍微復(fù)雜踩衩,請自己搜索用法。
要練習(xí)這些命令贩汉,你可以進(jìn)入Ubuntu桌面系統(tǒng)后九妈,打開終端輸入那些命令;或是用SecureCRT雾鬼、putty等工具遠(yuǎn)程登錄Ubuntu后練習(xí)。
2.3 硬件知識
我們學(xué)習(xí)硬件知識的目的在于能看懂原理圖宴树,看懂通信協(xié)議策菜,看懂芯片手冊;不求能設(shè)計原理圖,更不求能設(shè)計電路板又憨。
對于正統(tǒng)的方法翠霍,你應(yīng)該這樣學(xué)習(xí):
①學(xué)習(xí)《微機原理》,理解一個計算機的組成及各個部件的交互原理蠢莺。
②學(xué)習(xí)《數(shù)字電路》寒匙,理解各種門電路的原理及使用,還可以掌握一些邏輯運算(與躏将、或等)锄弱。
2.4 要不要專門學(xué)習(xí)Windows下的單片機開發(fā)
很多學(xué)校都開通了單片機的課程,很多人都是從51單片機祸憋、AVR單片機会宪,現(xiàn)在比較新的STM32單片機開始接觸嵌入式領(lǐng)域,并且使用Windows下的開發(fā)軟件蚯窥,比如keil掸鹅、MDK等。
問題來了拦赠,要不要專門學(xué)習(xí)Windows下的單片機開發(fā)巍沙?
①如果這是你們專業(yè)的必修課,那就學(xué)吧
②如果你的專業(yè)跟單片機密切相關(guān)荷鼠,比如機械控制等句携,那就學(xué)吧
③如果你只是想從單片機入門,然后學(xué)習(xí)更廣闊的嵌入式Linux颊咬,那么放棄在Windows下學(xué)習(xí)單片機吧务甥!
理由如下:
①Windows下的單片機學(xué)習(xí),深度不夠
Windows下有很好的圖形界面單片機開發(fā)軟件喳篇,比如keil敞临、MDK等。它們封裝了很多技術(shù)細(xì)節(jié)麸澜,比如:
你只會從main函數(shù)開始編寫代碼挺尿,卻不知道上電后第1條代碼是怎么執(zhí)行的;你可以編寫中斷處理函數(shù)炊邦,但是卻不知道它是怎么被調(diào)用的编矾;你不知道程序怎么從Flash上被讀入內(nèi)存;也不知道內(nèi)存是怎么劃分使用的馁害,不知道棧在哪窄俏、堆在哪;當(dāng)你想裁剪程序降低對Flash碘菜、內(nèi)存的使用時凹蜈,你無從下手限寞;當(dāng)你新建一個文件時,它被自動加入到工程里仰坦,但是其中的機理你完全不懂等等等履植。
②基于ARM+Linux裸機學(xué)習(xí),可以學(xué)得更深悄晃,并且更貼合后續(xù)的Linux學(xué)習(xí)玫霎。
實際上它就是Linux下的單片機學(xué)習(xí),只是一切更加原始:所有的代碼需要你自己來編寫妈橄;哪些文件加入工程庶近,需要你自己來管理。在工作中眷细,我們當(dāng)然傾向于使用Windows下更便利的工具拦盹,但是在學(xué)習(xí)階段,我們更想學(xué)習(xí)到程序的本質(zhì)溪椎。
一切從零編寫代碼普舆、管理代碼,可以讓我們學(xué)習(xí)到更多知識:
你需要了解芯片的上電啟動過程校读,知道第1條代碼如何運行沼侣;你需要掌握怎么把程序從Flash上讀入內(nèi)存;需要理解內(nèi)存怎么規(guī)劃使用歉秫,比如棧在哪蛾洛,堆在哪;需要理解代碼重定位雁芙;需要知道中斷發(fā)生后轧膘,軟硬件怎么保護(hù)現(xiàn)場、跳到中斷入口兔甘、調(diào)用中斷程序谎碍、恢復(fù)現(xiàn)場;你會知道洞焙,main函數(shù)不是我們編寫的第1個函數(shù)蟆淀;你會知道,芯片從上電開始澡匪,程序是怎么被搬運執(zhí)行的熔任;你會知道,函數(shù)調(diào)用過程中唁情,參數(shù)是如何傳遞的疑苔;你會知道,中斷發(fā)生時甸鸟,每一個寄存器的值都要小心對待等等等夯巷。你掌握了ARM+Linux的裸機開發(fā)赛惩,再回去看Windows下的單片機開發(fā),會驚呼:怎么那么簡單趁餐!并且你會完全明白這些工具沒有向你展示的技術(shù)細(xì)節(jié)。
驅(qū)動程序=Linux驅(qū)動程序軟件框架+ARM開發(fā)板硬件操作篮绰,我們可以從簡單的裸機開發(fā)入手后雷,先掌握硬件操作,并且還可以:
①掌握如何在PC Linux下編譯程序吠各、把程序燒錄到板子上并運行它
②為學(xué)習(xí)bootloader打基礎(chǔ):掌握了各種硬件操作后臀突,后面一組合就是一個bootloader
2.5?為什么選擇ARM9 S3C2440開發(fā)板,而不是其他性能更好的贾漏?
有一個錯誤的概念:S3C2440過時了候学、ARM9過時了。這是不對的纵散,如果你是軟件工程師梳码,無論是ARM9、ARM11伍掀、A8還是A9掰茶,對我們來說是沒有差別的。一款芯片蜜笤,上面有CPU濒蒋,還有眾多的片上設(shè)備(比如UART、USB把兔、LCD控制器)沪伙。我們寫程序時,并不涉及CPU县好,只是去操作那些片上設(shè)備围橡。所以:差別在于片上設(shè)備,不在于CPU核聘惦;差別在于寄存器操作不一樣某饰。因為我們寫驅(qū)動并不涉及CPU的核心,只是操作CPU之外的設(shè)備善绎,只是讀寫這些設(shè)備的寄存器黔漂。之所以推薦S3C2440,是因為它的Linux學(xué)習(xí)資料最豐富禀酱,并有配套的第1炬守、2期視頻。
2.6 怎么學(xué)習(xí)ARM+Linux的裸機開發(fā)
學(xué)習(xí)裸機開發(fā)的目的有兩個:
①掌握裸機程序的結(jié)構(gòu)剂跟,為后續(xù)的u-boot作準(zhǔn)備
②練習(xí)硬件知識减途,即:怎么看原理圖酣藻、芯片手冊,怎么寫代碼來操作硬件
后面的u-boot可以認(rèn)為是裸機程序的集合鳍置,我們在裸機開發(fā)中逐個掌握各個部件辽剧,再集合起來就可以得到一個u-boot了。后續(xù)的驅(qū)動開發(fā)税产,也涉及硬件操作怕轿,你可以在裸機開發(fā)中學(xué)習(xí)硬件知識。
注意:如果你并不關(guān)心裸機的程序結(jié)構(gòu)辟拷,不關(guān)心bootloader的實現(xiàn)撞羽,這部分是可以先略過的。在后面的驅(qū)動視頻中衫冻,我們也會重新講解所涉及的硬件知識诀紊。
2.7 bootloader的學(xué)習(xí)
bootloader有很多種,vivi隅俘、u-boot等等邻奠,最常用的是u-boot。
u-boot功能強大考赛、源碼比較多惕澎,對于編程經(jīng)驗不豐富、閱讀代碼經(jīng)驗不豐富的人颜骤,一開始可能會覺得難以掌握唧喉。但是,u-boot的主要功能就是:啟動內(nèi)核忍抽。它涉及:讀取內(nèi)核到內(nèi)存八孝、設(shè)置啟動參數(shù)、啟動內(nèi)核鸠项。按照這個主線干跛,我們嘗試自己從零編寫一個bootloader,這個程序相對簡單祟绊,可以讓我們快速理解u-boot主要功能的實現(xiàn)楼入。
2.8 Linux內(nèi)核的學(xué)習(xí)
前面說過,內(nèi)核本身不是我們學(xué)習(xí)的重點牧抽,但是了解一下內(nèi)核的啟動過程嘉熊,還是很有必要的:工作中有可能要修改內(nèi)核以適配硬件,掌握了啟動過程才知道去修改哪些文件扬舒。
2.9 根文件系統(tǒng)
在驅(qū)動程序開發(fā)階段阐肤,我們喜歡搭建一個最小根文件系統(tǒng)來調(diào)試驅(qū)動;在開發(fā)應(yīng)用程序時,也需要搭建文件系統(tǒng)孕惜,把各種庫愧薛、配置文件放進(jìn)去;在發(fā)布產(chǎn)品時衫画,你還需要修改配置文件毫炉,使得產(chǎn)品可以自動運行程序;甚至你想實現(xiàn)插上U盤后自動啟動某個程序削罩,這也要要修改配置文件碘箍;這一切,都需要你理解根文件系統(tǒng)的構(gòu)成鲸郊,理解內(nèi)核啟動后是根據(jù)什么配置文件來啟動哪些應(yīng)用程序。
3.1 經(jīng)典字符設(shè)備驅(qū)動程序
視頻中以LED货邓、按鍵驅(qū)動為例秆撮,講解并練習(xí)開發(fā)過程中碰到的機制:查詢、休眠-喚醒换况、中斷职辨、異步通知、poll戈二、同步舒裤、互斥等等。后續(xù)更復(fù)雜的驅(qū)動程序觉吭,就是在這些機制的基礎(chǔ)上腾供,根據(jù)硬件特性設(shè)計出精巧的軟件框架。
3.2 工作中各類驅(qū)動程序
3.3 調(diào)試方法
4 Linux應(yīng)用程序的學(xué)習(xí)
對于大多數(shù)人來說鲜滩,第1個C程序是在Windows的Visual Studio C++(簡稱VC)上寫的伴鳖,所以你們關(guān)心的也許是:嵌入式Linux應(yīng)用程序,跟VC應(yīng)用程序之間的區(qū)別:
①編譯方法不同:
在VC上點點鼠標(biāo)即可編譯徙硅,對于嵌入式Linux應(yīng)用程序榜聂,我們需要“交叉編譯”:程序要在PC Linux上編譯,但是運行時要放到單板上嗓蘑。并且须肆,它的編譯環(huán)境需要你自己搭建:解壓出工具鏈后設(shè)計PATH,還要自己構(gòu)造一套Makefile系統(tǒng)桩皿。
②調(diào)試方法不同:
在VC上點點鼠標(biāo)就可以調(diào)試豌汇,對于嵌入式Linux應(yīng)用程序,你可以更喜歡用打右挡尽瘤礁;或是在PC Linux上通過GDB觀察應(yīng)用程序在單板上的運行狀況。
③可用的資源不同:
對于VC程序梅尤,你可以直接使用微軟公司提供的各種類庫柜思;對于嵌入式Linux應(yīng)用程序岩调,很多時候需要去尋找、下載赡盘、編譯号枕、使用開源庫。
④功能不同:
VC程序運行在PC上陨享,一般是用來解決某些純軟件的問題葱淳,比如整理數(shù)據(jù)、修圖抛姑、聯(lián)網(wǎng)播放音樂之類赞厕。嵌入式Linux應(yīng)用程序一般都要操作若干種硬件,比如監(jiān)控設(shè)備中要操作攝像頭定硝、存儲音視頻皿桑,無人機中要操作GPS、螺旋槳蔬啡,POS機中要操作銀行卡等等诲侮。它跟單板上的硬件聯(lián)系很大,很多時候需要你懂點硬件知識箱蟆,至少是知道怎么通過驅(qū)動程序來操作這些硬件沟绪。
上述4點的不同,花很少的時間就可以掌握空猜。
如果你有志于開發(fā)應(yīng)用程序绽慈,那么一定要有算法、數(shù)據(jù)結(jié)構(gòu)抄肖、網(wǎng)絡(luò)編程等基礎(chǔ)久信,然后再掌握一些設(shè)計模式,最后就是多參加一些實際項目的開發(fā)了漓摩。