把linux在arm開發板上進行定制,并在arm開發板上運行起來。
更好地理解linux的構架過程。
驅動開發是在系統運行起來后,在內核中增加一些驅動子功能而已。
一、概述
1、arm裸機程序系統結構圖
硬件層:硬件工程師決定硬件放在哪個資源。如,是在GPA口,GPH口,還是GPG口。
驅動層:驅動工程師根據硬件的架構,把驅動的資源用代碼去指向,比如C語言的指針去指向相應的資源;硬件需要什么樣的高/低電平或組合的數據,讓其工作,是由驅動層封裝的。
應用層:根據傳遞的不同的值,來得到不同的結果。
該架構存在的問題:
耦合性太強,一旦一層發生改變, 其他層都會變。
2、類android等復雜功能系統結構圖
為了解決上述問題,引入一個概念:OS;引入一層:kernel層。
可以讓應用層程序員解放出來,不用關心底層。
同時,也可以進行資源管理、多進程多線程管理等。
驅動控制硬件工作。
驅動與內核:驅動把支持的設備向內核報告,內核根據傳來的信息,會調用不同的驅動程序,來控制相應的硬件。
它們可以認為是一個整體,都屬于底層軟件的范圍。
3、android系統框架圖
通過分層,可以實現軟件復用性、可移植性。而且不同模塊解耦。
不是分層越多越多,分層越多,速度也越慢。
二、系統移植學習內容
1、交叉編譯環境
搭建交叉開發環境
2、bootloader功能子系統
bootloader的選擇和移植
系統一上電會運行一個程序:bootloader(啟動加載),目的是load kernel。
可以做很多種方案的選擇。
很多大型項目中,更多是選擇適合項目的啟動加載代碼,然后再改改(移植)。
很多時候,買芯片的時候,芯片廠商就已經提供好了。
3、內核核心子系統
kernel的配置、編譯、移植和調試
4、文件系統子系統
根文件系統的制作
給用戶用,還得提供文件系統。
這4個就是整個系統移植的精髓。
三、學習思路和方法
先整體后局部,層層推進。
每個子系統是如何編譯的 ---> 在基本功能下,如何添加命令或功能 ---> 如何自定義自己的開發板,與自己的開發板具體硬件相聯系
每個子系統都具有一個復雜的層次關系。
所以要先掌握整體,需要首先掌握相關子系統的藏寶圖,有了這個地圖,去探索它就有了方向。
四、系統移植的基本步驟
拿到一塊板子,如何讓整個系統跑起來呢?
1、確定目標機(開發板,客戶端)和主機(PC,開發機器,服務端)的連接方式
主機性能會比目標機好太多,因此一般在主機開發,把主機編譯好的內容數據傳輸給目標機。
數據就是高低電平。
傳輸方式:
(1)UART異步串行通信接口 (串口)
它是非常經典的與PC機通信的接口。
優點:
- 功能很強大,既可以輸入,也可以輸出,比較萬能。
- 實用性強(90%的板子都支持)
缺點:速度比較低,效率比較差。
大文件一般不用串口傳輸,小文件可以。
(2)USB串行通信接口
現在已經發展到USB 3.0
優點:速度快
缺點:USB的驅動要移植修改。
板子剛剛上電,就讓串口工作,是不現實的。
(3)TCP/IP網絡通信接口
優點:速度快(10/100Mbps)
缺點:驅動需要移植
TCP/IP已經很成熟了。開發板與PC可以以C/S模式進行數據的傳輸和下載。比較通用。而且網卡的速率也比較快,最少10M,100M網卡也很多。
通過網絡接口去下載數據的情況很多。
(4)Debug Jtag調試接口
方便快捷,但價格很高,很少使用。
2、安裝交叉編譯器
PC的cpu架構是X86,X86程序和arm程序不兼容,因此需要交叉編譯器。
2種方法:
(1)安裝芯片廠商已經編譯好的工具鏈
一般有如下前綴名:
arm-none-linux-gnueabi-
簡稱:arm-linux-
(把arm-linux-
軟鏈接為上述前綴名)
arm-none-eabi-
這個不支持操作系統。
arm-elf-
這個非常老了。很少見到了。
第一列:目標體系結構
gcc:默認編譯x86
有arm,就會編譯arm
第二列:廠商名。開源的話,一般是none
第三列:該編譯器默認編譯出來的功能是針對linux操作系統去用的。
這個編譯器內部有些標準C庫,是與linux系統相關的。
在windows下運行不了。
第四列:
gnu:開源
eabi:嵌入式的標準調用接口。針對嵌入式精簡的相關庫。
(2)自己動手編譯交叉工具鏈
《The GNU Toolchain for ARM Target HOWTO》這本書會介紹。
自動動手編譯非常耗時,而且會報很多不兼容的問題。調試需要功力,對編譯原理要理解的很清楚。很多公司都不會去做。不建議使用該方法。
思路其實比較單一,唯一的不好是版本間的依賴關系比較大。
3、搭建主機-目標機數據傳輸通道
比如用網絡,則需要網絡相關服務器的配置。
一般嵌入式中,用的比較多的服務:
- TFTP :基于UDP協議傳輸的,是FTP的簡版。UDP比FTP簡單。
- NFS:網絡文件系統。目的是linux與linux之間掛載用的。
文件系統的調試,很多時候用NFS作為調試的工具。
4、編譯三大子系統:
bootloader功能子系統
內核核心子系統
文件系統子系統
該步驟難度最大。
5、燒寫測試
整個進行集成,然后放到工廠進行集成化生產就可以了。
五、環境搭建需求分析
需求分析:
主機中的數據 如何傳遞 到開發板?
目的1:普通數據的傳遞:比如,uboot,kernel。
主要目的就是為了傳遞。
UART很少使用,更多使用的是網絡接口。最主要的使用方式是TFTP服務。
TFTP主要傳輸的是kernel的文件。
uboot會通過其他方式燒寫(當然網絡接口也可以傳輸。看開發環境來決定。)
目的2:調試:主機的一塊內存空間,直接掛載在板子上。
在x86上調好,再放到板子上。
但是,有可能調試不是很順利,因此需要開發板與PC間建立更合理、方便的解決方案。
不能在板子上直接調試,就是因為板子容量太小。
要想辦法擴大板子空間,但是flash太貴。
板子可以外掛很大空間的存儲器,比如U盤。
但是U盤很麻煩,插開發板上,完了還得拔下來插PC上。
思路:調試時,不一定非要進行網絡傳輸。只需要把數據掛到板子上就可以了。
辦法:通過網線把共享的數據塊(當作USB),通過TCP/IP來傳。
共享的數據庫就在PC上。
調試起來更加方便,PC上的修改板子上就可以直接看到了,不需要進行更多的數據傳輸了。
調試內核驅動、應用程序,很多時候是借助這種方式,在PC上進行軟件開發,然后直接在板子上進行驗證。
六、筆記本移植環境搭建
串口:連接方式方便,驅動簡單。
少數據量的東西,會用串口。
標準輸入/輸出,會定位到串口驅動上。
筆記本都是USB接口,而開發板要用串口,因此要買USB轉串口。
如何排查目標機與主機的各層是否通了?
- 應用層:調試程序
- 傳輸層:主要是端口port沒有開放。要不就是服務器開放端口不對或未開放端口,或者客戶端訪問的端口不對。
- 網絡層:通過ping看看在不在一個局域網段。
- 物理層:查看插上的網卡燈有沒有亮。