嵌入式Linux開發環境搭建-(0)在進行嵌入式Linux開發前,你可能先要知道這些基本概念

嵌入式Linux開發前,你可能需要知道這些基本概念

 

        作者之前編寫了一系列嵌入式Linux的開發文檔:

        當編寫到一定程度的時候,回過頭再看看這些文檔的內容,結合一部分網友的反饋,反思了一下。之前的文檔,更多的是站在技術總結的角度去編寫,而非入門初學的角度。這些文檔似乎更適合有一定經驗的開發者進行查閱,而非入門初學者進行手把手學習。這樣就導致了,當一些入門初學者在閱讀文檔的時候,會遇到一些基本概念,而恰好這些基本概念作者一筆帶過,導致初學者看不下去。於是,現在再補充一篇文章,站在作者理解的角度,儘量去描述一下嵌入式Linux開發過程中可能遇到的基本概念。

        鑑於作者本身的水平有限,同時也是在邊學習邊總結,因此這篇文章不會涉及太深入的技術細節,作者只是站在自己的理解角度去描述這些概念。由於每個人對概念的理解都可能會有所差異,如遇到描述錯誤或有所紕漏的地方,希望提出指正,感謝閱讀。

        本文的目標是:讓初學者快速地在嵌入式Linux開發板運行一個helloworld程序。何謂快速,就是把一些開發過程中共同的東西都抽象出來,不會拘泥於細節,不會拘泥於具體的硬件開發板平臺,也就是俗稱的“開發套路”。而這些開發套路,對任何的嵌入式Linux開發板平臺,基本上都是通用的,當熟悉了這些套路之後,開發者很快就可以上手其他嵌入式Linux開發板。

 

1. 什麼是嵌入式Linux開發平臺

        什麼是嵌入式Linux開發平臺?一句話高度概括:“它是一臺電腦”。

        從宏觀的角度去描述,嵌入式Linux開發平臺跟我們平時用的個人電腦沒有本質上的區別,因爲在嵌入式Linux開發平臺也有個人電腦上所描述的處理器CPU,內存,硬盤,顯示器,網口,USB接口,耳機接口,等等。

        這些硬件在嵌入式Linux開發平臺上,處理器有可能被叫作CPU或MPU;內存有可能被叫作SDRAM或DRAM或DDR;硬盤有可能被叫作NandFlash或NorFlash或eMMC;顯示器有可能被叫作LCD屏幕。所以,本質上來說,嵌入式Linux開發平臺,就是一臺微電腦。但它的性能和功能沒有我們用的個人電腦那麼強大,麻雀雖小,五臟俱全。好了,點到即止,入門初學者暫時知道嵌入式Linux開發板是一臺電腦就行。

 

2. u-boot,內核kernel,文件系統rootfs之間的關係

我們回到公司後,每天都要做的事情就是打開電腦,流程基本上都是:按下開機鍵 --> 屏幕亮起 --> 看見windows系統的引導界面 --> 看見windows系統界面 --> 成功登陸windows系統 --> 打開我們的辦公軟件。

而嵌入式Linux開發平臺的開機過程也是類似:接通電源線,按下開機鍵 --> LCD屏幕亮起 --> u-boot引導內核 --> 內核加載硬件驅動程序和掛載文件系統 --> 進入文件系統 --> 運行應用程序。

整個過程簡單總結如下圖所示:

u-boot:它類似於我們個人電腦裏面的BIOS,有計算機知識的人基本都知道BIOS是什麼,如果不考慮其他強大的功能,入門初學者只需要知道u-boot是用來引導內核的,並傳入合適的啓動參數給內核。u-boot只要能成功引導內核,它就是一個合格的可用的u-boot。

內核kernel:入門初學者,可以把它理解爲我們的windows操作系統,但其實,內核是在整臺電腦背後默默工作的。它的工作很多,如進行進程調度和管理(進程可以理解爲我們平時用的應用程序,如QQ,微信,office辦公軟件,等等),內存管理,驅動管理,等等。我們平時生活裏面操作電腦界面時,看見的“我的電腦”,“C/D/E/F盤”,其實是文件系統,而不是操作系統內核。

文件系統rootfs:這個就可以簡單理解爲我們電腦裏面的“我的電腦”,“C/D/E/F盤”了,在Linux的世界裏面,一切皆文件。我們開發的時候與Linux系統進行交互,都是基於文件系統進行文件操作(如複製,粘貼,刪除,新建,運行,等等)。

        總而言之,一個能成功運行的嵌入式Linux系統,上電後必須經歷的過程是:u-boot引導內核,引導成功後,由內核加載文件系統。由於我們編寫的應用程序是存在於文件系統裏面的,因此,必須加載文件系統成功後才能運行應用程序。應用程序的運行需要內核進行調度。

        看到這裏,是不是覺得這個過程跟我們平時生活中使用的windows系統很相似?

 

3. 開發者怎樣跟嵌入式Linux開發板進行交互?

        我們平時在使用windows操作系統時,比如,想打開一個應用程序,只需要用鼠標雙擊桌面上的應用程序圖標,應用程序就開始運行起來。但在嵌入式Linux開發平臺裏面,開發者用得最多的就是命令行,就是那個看上去黑色的操作界面(某種程度上,使用命令行操作也可以顯得很有x格)。

        如果你想在windows的電腦上新建一個文件夾,你可以使用鼠標“右鍵”--> “新建文件夾”,但在嵌入式Linux上,你需要使用mkdir 命令。如果你想在windows的電腦上查看某個文件夾裏面的內容,可以雙擊打開這個文件夾,但在嵌入式Linux上,你需要使用ls -al命令。

        所以,命令行是開發者與嵌入式Linux板卡交互的橋樑,開發者想讓嵌入式Linux板卡進行某些動作,必須使用命令行。但是,這些基本的命令,我們不需要花太多的時間刻意去學習,只需要大概學習一遍,然後在開發的過程中就會不斷熟悉。在嵌入式Linux開發裏面,通常20%的常用命令就可以滿足大部分的工作內容了。

 

4. 嵌入式Linux開發,需要掌握的基本技能

        不管你的工作崗位是嵌入式Linux系統工程師,還是嵌入式Linux驅動工程師,還是嵌入式Linux應用工程師,有些通用的基本技能(如安裝虛擬機,安裝和配置Linux發行版操作系統,安裝交叉編譯工具,安裝開發IDE,等等),是必須要掌握的,一旦這些技能掌握了以後,在很多開發場合都能得心應手地面對工作。

在描述這些安裝的細節之前,先描述一些基本的概念:

虛擬機:顧名思義,它是一臺虛擬的機器。我們現在有一部分開發者是在windows系統下進行開發工作的,如果完全摒棄掉windows轉爲Linux系統,可能會無所適從。因此,使用虛擬機安裝Linux發行版(如ubuntu,Debian,等)無疑是一種折中的選擇。虛擬機其實就是在現在windows系統上,再虛擬多一臺電腦設備,這臺虛擬出來的電腦,可以安裝ubuntu系統。

交叉編譯工具:可以簡單地理解爲一個編譯器。其實這個工具鏈裏面還包含了彙編器,鏈接器,反彙編工具,調試器,等等。我們在進行MCU開發時所使用的MDK,IAR這類工具,就是編輯器,編譯器,鏈接器,調試器的大集合,所以,這類工具對開發者很友好。而在嵌入式Linux的環境裏,都拆開爲一個個具體的工具,因此在環境搭建的時候,嵌入式Linux通常比單片機要複雜很多。爲什麼要交叉編譯?交叉編譯這個概念不太難理解,簡單地說,就是我們的芯片設備是ARM平臺或者其他平臺,而我們的Linux發行版(如ubuntu)是x86或者x64平臺的,在這些平臺上對程序進行編譯等一系列工作,就需要交叉編譯器,這樣編譯出來的可執行程序才能在我們的ARM平臺上運行。

Linux發行版:可以通俗理解爲我們平時用的臺式電腦或筆記本電腦裏面安裝的Linux系統,這類系統有很多,如ubuntu,Debian,CentOS,RedHat,等等。這類系統都是基於Linux內核的操作系統,跟我們的嵌入式Linux內核都差不多,但功能比嵌入式Linux強大得多。一般在開發過程中,我們可以稱這類系統爲宿主機或Host PC。

        理解完以上概念之後,不管你現在的工作崗位是系統移植,驅動開發,應用開發,都需要進行以下的基本工作。可以根據以下這些博文的步驟,一步步進行開發環境搭建,多操作幾遍就會很容易熟悉。

以下是這些博文的閱讀順序:

        嵌入式Linux開發環境搭建-(1)安裝VMware Workstation虛擬機

        之所以安裝虛擬機,是爲了方便以前使用windows的開發者。如果電腦硬件性能足夠,使用虛擬機是有好處的,它不會對我們原有的操作系統進行破壞,初學者可以方便地在虛擬機裏面學習,備份也很方便。如果已經熟悉了虛擬機軟件的安裝,跟我們平時windows安裝軟件一樣,比較簡單。

        嵌入式Linux開發環境搭建-(2)VMware虛擬機下安裝Ubuntu16.04.2 LTS

        虛擬機安裝完之後,就相當於有一臺電腦給我們使用了。我們可以在這臺電腦上面安裝ubuntu系統作爲開發時的Host PC。如果有多臺物理電腦的開發者,可以不使用虛擬機,直接在物理電腦上安裝ubuntu系統,安裝方法跟博客裏面的差不多,大同小異,多摸索幾遍就知道了。

        嵌入式Linux開發環境搭建-(3)配置Ubuntu16.04.2 LTS 系統

        ubuntu系統安裝完後,是不能直接就進行開發的。需要對系統進行一定的配置,才能進行嵌入式Linux開發。這些通用的配置包括,配置網絡環境,便於我們的windows,ubuntu,開發板三者可以相互ping通。安裝FTP服務,NFS服務,我們使用這些服務進行三者之間的文件傳輸。作者本人用得比較多的文件傳輸方式是:windows與ubuntu之間,使用Filezilla工具基於FTP協議傳輸文件。而開發板跟ubuntu之間,使用NFS網絡文件系統,讓開發板掛載ubuntu系統指定的文件夾(相當於開發板跟ubuntu之間的共享文件夾)進行文件傳輸。

        嵌入式Linux開發環境搭建-(4)安裝交叉編譯工具鏈

        配置完ubuntu系統後,因爲我們的Host PC是x86或x64平臺的,要在這種平臺上編譯程序並運行於開發板的ARM平臺,那麼就要進行交叉編譯工作。交叉編譯是使用交叉編譯工具鏈進行的。這些交叉編譯工具鏈,不需要自己去網上查找,開發板的廠家一般會提供他們優化好的交叉編譯工具鏈,初學者一開始不需要糾結交叉編譯工具鏈是如何製作的,只需要先學會使用,先完成自己的入門學習,有時間再回頭深入研究交叉編譯工具鏈的製作過程。

        嵌入式Linux開發環境搭建-(5)安裝和配置Qt Creator開發工具

        當以上工作都準備就緒以後,基本上已經能夠進行嵌入式Linux開發工作了。在Linux的開發環境裏面,也有一些好用的開發IDE,類似於單片機開發的MDK,IAR這類編譯器。作者本人在開發嵌入式Linux應用程序的時候,主要使用Qt Creator這個IDE。網上有很多關於Qt Creator的安裝介紹,在這裏就不再詳細描述了。如果初學者的工作是進行驅動開發或者系統移植,可以使用Notepad++這類編輯器,修改完代碼後,再進行交叉編譯。

        嵌入式Linux應用程序開發-(1)第一個嵌入式QT應用程序

        完成以上環節搭建工作後,就可以開始進行應用程序開發了,以上搭建的環境,已經適合驅動程序開發,應用程序開發,系統移植等等。當然了,在實際的開發過程中,肯定會根據實際的開發情況再進行環境的改變,但套路都是一樣的,都是安裝某些工具包,然後修改ubuntu的配置文件,使ubuntu系統適合我們進行嵌入式Linux開發。

 

5.  如何把應用程序放到開發板運行?

        在進行單片機開發或調試的時候,我們通常使用仿真器(如J-link)連接單片機和電腦,使用MDK或IAR這類軟件編輯完代碼後,點擊編譯按鈕就可以編譯生成 .hex 或 .bin 文件。然後通過下載按鈕,下載到單片機運行,單片機每次重新上電,都會運行我們之前下載到單片機的程序。

         而嵌入式Linux的應用程序開發,跟單片機的開發有很大區別。嵌入式Linux應用程序開發,可以使用已經配置好交叉編譯工具鏈的Qt Creator工具,進行編輯,交叉編譯等工作,同樣也可以很方便地編譯出應用程序的可執行文件。這個可執行文件因爲是交叉編譯生成的,因此只能運行在嵌入式Linux開發板。

        前面提到,嵌入式Linux開發板跟ubuntu系統是通過NFS網絡文件系統的方式進行文件傳輸的,相當於ubuntu系統中有一個共享文件夾,用來跟Linux開發板共同進行文件傳輸。那麼,如何創建這個共享文件夾呢?

        假設,我們要把應用程序的可執行文件,從ubuntu複製到開發板的指定目錄,我們使用ubuntu的目錄 /opt/share 和開發板的 /mnt 目錄進行文件共享。就可以使用mount命令,直接把開發板的 /mnt 目錄和 ubuntu的 /opt/share目錄共享起來。以後我們要在ubuntu和開發板之間傳文件,ubuntu系統只要把文件複製到 /opt/share 目錄,我們的Linux開發板的/mnt目錄就會出現這個文件,同理,我們把開發板裏面的文件放到Linux開發板的/mnt目錄,在ubuntu系統的/opt/share目錄也會出現這個文件。

 

                                                    歡迎關注公衆號 【微聯智控】

 

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