把linux在arm開發(fā)板上進行定制,并在arm開發(fā)板上運行起來粱甫。
更好地理解linux的構(gòu)架過程。
驅(qū)動開發(fā)是在系統(tǒng)運行起來后冗美,在內(nèi)核中增加一些驅(qū)動子功能而已魔种。
一、概述
1粉洼、arm裸機程序系統(tǒng)結(jié)構(gòu)圖
硬件層:硬件工程師決定硬件放在哪個資源节预。如,是在GPA口属韧,GPH口安拟,還是GPG口。
驅(qū)動層:驅(qū)動工程師根據(jù)硬件的架構(gòu)宵喂,把驅(qū)動的資源用代碼去指向糠赦,比如C語言的指針去指向相應(yīng)的資源;硬件需要什么樣的高/低電平或組合的數(shù)據(jù)锅棕,讓其工作拙泽,是由驅(qū)動層封裝的。
應(yīng)用層:根據(jù)傳遞的不同的值裸燎,來得到不同的結(jié)果顾瞻。
該架構(gòu)存在的問題:
耦合性太強,一旦一層發(fā)生改變德绿, 其他層都會變荷荤。
2、類android等復(fù)雜功能系統(tǒng)結(jié)構(gòu)圖
為了解決上述問題移稳,引入一個概念:OS蕴纳;引入一層:kernel層。
可以讓應(yīng)用層程序員解放出來个粱,不用關(guān)心底層古毛。
同時,也可以進行資源管理都许、多進程多線程管理等稻薇。
驅(qū)動控制硬件工作。
驅(qū)動與內(nèi)核:驅(qū)動把支持的設(shè)備向內(nèi)核報告梭稚,內(nèi)核根據(jù)傳來的信息颖低,會調(diào)用不同的驅(qū)動程序,來控制相應(yīng)的硬件弧烤。
它們可以認(rèn)為是一個整體忱屑,都屬于底層軟件的范圍。
3暇昂、android系統(tǒng)框架圖
通過分層,可以實現(xiàn)軟件復(fù)用性急波、可移植性从铲。而且不同模塊解耦。
不是分層越多越多澄暮,分層越多名段,速度也越慢阱扬。
二、系統(tǒng)移植學(xué)習(xí)內(nèi)容
1伸辟、交叉編譯環(huán)境
搭建交叉開發(fā)環(huán)境
2麻惶、bootloader功能子系統(tǒng)
bootloader的選擇和移植
系統(tǒng)一上電會運行一個程序:bootloader(啟動加載),目的是load kernel信夫。
可以做很多種方案的選擇窃蹋。
很多大型項目中,更多是選擇適合項目的啟動加載代碼静稻,然后再改改(移植)警没。
很多時候,買芯片的時候振湾,芯片廠商就已經(jīng)提供好了杀迹。
3、內(nèi)核核心子系統(tǒng)
kernel的配置恰梢、編譯佛南、移植和調(diào)試
4、文件系統(tǒng)子系統(tǒng)
根文件系統(tǒng)的制作
給用戶用嵌言,還得提供文件系統(tǒng)嗅回。
這4個就是整個系統(tǒng)移植的精髓。
三摧茴、學(xué)習(xí)思路和方法
先整體后局部绵载,層層推進。
每個子系統(tǒng)是如何編譯的 ---> 在基本功能下苛白,如何添加命令或功能 ---> 如何自定義自己的開發(fā)板娃豹,與自己的開發(fā)板具體硬件相聯(lián)系
每個子系統(tǒng)都具有一個復(fù)雜的層次關(guān)系。
所以要先掌握整體购裙,需要首先掌握相關(guān)子系統(tǒng)的藏寶圖懂版,有了這個地圖,去探索它就有了方向躏率。
四躯畴、系統(tǒng)移植的基本步驟
拿到一塊板子,如何讓整個系統(tǒng)跑起來呢薇芝?
1蓬抄、確定目標(biāo)機(開發(fā)板,客戶端)和主機(PC夯到,開發(fā)機器嚷缭,服務(wù)端)的連接方式
主機性能會比目標(biāo)機好太多,因此一般在主機開發(fā),把主機編譯好的內(nèi)容數(shù)據(jù)傳輸給目標(biāo)機阅爽。
數(shù)據(jù)就是高低電平路幸。
傳輸方式:
(1)UART異步串行通信接口 (串口)
它是非常經(jīng)典的與PC機通信的接口。
優(yōu)點:
- 功能很強大优床,既可以輸入劝赔,也可以輸出誓焦,比較萬能胆敞。
- 實用性強(90%的板子都支持)
缺點:速度比較低,效率比較差杂伟。
大文件一般不用串口傳輸移层,小文件可以。
(2)USB串行通信接口
現(xiàn)在已經(jīng)發(fā)展到USB 3.0
優(yōu)點:速度快
缺點:USB的驅(qū)動要移植修改赫粥。
板子剛剛上電观话,就讓串口工作,是不現(xiàn)實的越平。
(3)TCP/IP網(wǎng)絡(luò)通信接口
優(yōu)點:速度快(10/100Mbps)
缺點:驅(qū)動需要移植
TCP/IP已經(jīng)很成熟了频蛔。開發(fā)板與PC可以以C/S模式進行數(shù)據(jù)的傳輸和下載。比較通用秦叛。而且網(wǎng)卡的速率也比較快晦溪,最少10M,100M網(wǎng)卡也很多挣跋。
通過網(wǎng)絡(luò)接口去下載數(shù)據(jù)的情況很多三圆。
(4)Debug Jtag調(diào)試接口
方便快捷,但價格很高避咆,很少使用舟肉。
2、安裝交叉編譯器
PC的cpu架構(gòu)是X86查库,X86程序和arm程序不兼容路媚,因此需要交叉編譯器。
2種方法:
(1)安裝芯片廠商已經(jīng)編譯好的工具鏈
一般有如下前綴名:
arm-none-linux-gnueabi-
簡稱:arm-linux-
(把arm-linux-
軟鏈接為上述前綴名)
arm-none-eabi-
這個不支持操作系統(tǒng)樊销。
arm-elf-
這個非常老了整慎。很少見到了。
第一列:目標(biāo)體系結(jié)構(gòu)
gcc:默認(rèn)編譯x86
有arm现柠,就會編譯arm
第二列:廠商名院领。開源的話,一般是none
第三列:該編譯器默認(rèn)編譯出來的功能是針對linux操作系統(tǒng)去用的够吩。
這個編譯器內(nèi)部有些標(biāo)準(zhǔn)C庫比然,是與linux系統(tǒng)相關(guān)的。
在windows下運行不了周循。
第四列:
gnu:開源
eabi:嵌入式的標(biāo)準(zhǔn)調(diào)用接口强法。針對嵌入式精簡的相關(guān)庫万俗。
(2)自己動手編譯交叉工具鏈
《The GNU Toolchain for ARM Target HOWTO》這本書會介紹。
自動動手編譯非常耗時饮怯,而且會報很多不兼容的問題闰歪。調(diào)試需要功力,對編譯原理要理解的很清楚蓖墅。很多公司都不會去做库倘。不建議使用該方法。
思路其實比較單一论矾,唯一的不好是版本間的依賴關(guān)系比較大教翩。
3、搭建主機-目標(biāo)機數(shù)據(jù)傳輸通道
比如用網(wǎng)絡(luò)贪壳,則需要網(wǎng)絡(luò)相關(guān)服務(wù)器的配置饱亿。
一般嵌入式中,用的比較多的服務(wù):
- TFTP :基于UDP協(xié)議傳輸?shù)娜蜓ィ荈TP的簡版彪笼。UDP比FTP簡單。
- NFS:網(wǎng)絡(luò)文件系統(tǒng)蚂且。目的是linux與linux之間掛載用的配猫。
文件系統(tǒng)的調(diào)試,很多時候用NFS作為調(diào)試的工具膘掰。
4章姓、編譯三大子系統(tǒng):
bootloader功能子系統(tǒng)
內(nèi)核核心子系統(tǒng)
文件系統(tǒng)子系統(tǒng)
該步驟難度最大。
5识埋、燒寫測試
整個進行集成凡伊,然后放到工廠進行集成化生產(chǎn)就可以了。
五窒舟、環(huán)境搭建需求分析
需求分析:
主機中的數(shù)據(jù) 如何傳遞 到開發(fā)板系忙?
目的1:普通數(shù)據(jù)的傳遞:比如,uboot惠豺,kernel银还。
主要目的就是為了傳遞。
UART很少使用洁墙,更多使用的是網(wǎng)絡(luò)接口蛹疯。最主要的使用方式是TFTP服務(wù)。
TFTP主要傳輸?shù)氖莐ernel的文件热监。
uboot會通過其他方式燒寫(當(dāng)然網(wǎng)絡(luò)接口也可以傳輸捺弦。看開發(fā)環(huán)境來決定。)
目的2:調(diào)試:主機的一塊內(nèi)存空間列吼,直接掛載在板子上幽崩。
在x86上調(diào)好,再放到板子上寞钥。
但是慌申,有可能調(diào)試不是很順利,因此需要開發(fā)板與PC間建立更合理理郑、方便的解決方案蹄溉。
不能在板子上直接調(diào)試,就是因為板子容量太小香浩。
要想辦法擴大板子空間类缤,但是flash太貴。
板子可以外掛很大空間的存儲器邻吭,比如U盤。
但是U盤很麻煩宴霸,插開發(fā)板上囱晴,完了還得拔下來插PC上。
思路:調(diào)試時瓢谢,不一定非要進行網(wǎng)絡(luò)傳輸畸写。只需要把數(shù)據(jù)掛到板子上就可以了。
辦法:通過網(wǎng)線把共享的數(shù)據(jù)塊(當(dāng)作USB)氓扛,通過TCP/IP來傳枯芬。
共享的數(shù)據(jù)庫就在PC上。
調(diào)試起來更加方便采郎,PC上的修改板子上就可以直接看到了千所,不需要進行更多的數(shù)據(jù)傳輸了。
調(diào)試內(nèi)核驅(qū)動蒜埋、應(yīng)用程序淫痰,很多時候是借助這種方式,在PC上進行軟件開發(fā)整份,然后直接在板子上進行驗證待错。
六、筆記本移植環(huán)境搭建
串口:連接方式方便烈评,驅(qū)動簡單火俄。
少數(shù)據(jù)量的東西,會用串口讲冠。
標(biāo)準(zhǔn)輸入/輸出瓜客,會定位到串口驅(qū)動上。
筆記本都是USB接口,而開發(fā)板要用串口忆家,因此要買USB轉(zhuǎn)串口犹菇。
如何排查目標(biāo)機與主機的各層是否通了?
- 應(yīng)用層:調(diào)試程序
- 傳輸層:主要是端口port沒有開放芽卿。要不就是服務(wù)器開放端口不對或未開放端口揭芍,或者客戶端訪問的端口不對。
- 網(wǎng)絡(luò)層:通過ping看看在不在一個局域網(wǎng)段卸例。
- 物理層:查看插上的網(wǎng)卡燈有沒有亮称杨。