2021-05-12 14:32:11
Linux下搭建樹莓派交叉編譯環境
本學期選了嵌入式開發課程,所以第一步就是要準備環境。硬體環境自不必說,購買了樹莓派二代、sd卡,讀卡器、路由器、網線這些都是以前就有的。軟體環境的搭建包括如下幾步:
1.搭建虛擬機器Linux環境
2.燒錄樹莓派系統
3.在虛擬機器Linux環境中搭建本地開發與編譯環境
4.在虛擬機器Linux上搭建交叉編譯環境
5.開發一段簡單的程式,通過本地編譯後,再進行交叉編譯。之後將編譯好的程式放到樹莓派上執行進行測試。
具體步驟:
1.搭建虛擬機器Linux
理論上說,在windows環境下如果也能找到滿足要求的交叉編譯工具鏈,那麼也可以不裝Linux。但是考慮到windows環境下的工具比較難找,而且嵌入式系統本身也是基於Linux的特定版本,進行交叉編譯時在相容性上更不容易出現問題,所以還是需要先安裝一個Linux環境。我採用的是virtualbox虛擬機器軟體。virtualbox是一個輕量級的虛擬機器軟體,安裝起來比較方便,使用中也還算穩定。安裝過程很簡單,此處略過。在virtualbox中載入Ubuntu安裝映象檔案*.iso,啟動後安裝,過程略。
2.燒錄樹莓派的映像檔案,使之可以正常啟動。
根據手冊的說明,需要將從樹莓派官網下載的系統映像檔案raspbian-jessie.img 燒錄到sd卡上,以使樹莓派可以正常使用。在這裡我開始犯了一個錯誤。想到燒錄檔案,習慣性的採用了windows下的常用軟體ultraiso,燒錄完成後插到樹莓派上加電。沒有任何輸出,讓我一度不知道哪裡出錯。後來嚴格按照手冊裡說的Linux命令:sudo dd if=raspbian-jessie.img of=/dev/sdb bs=2M 進行燒錄,系統可以正常啟動了。
分析:ultraiso屬於檔案燒錄的性質,但其並不改變卡/磁碟的分割區結構。所以燒錄完的sd卡分割區格式不符合要求。而dd命令屬於塊資料輸出,在燒錄資料的同時也變更了sd卡的分割區格式。
此外,此步驟還發生了一點意外。開始我燒錄了一個不帶桌面的精簡版系統。當使用sudo apt-get install lxde命令新增桌面時,報空間不足,無法安裝。於是重新燒錄標準版,但啟動到一半時系統中斷宕機。在想不出理由的情況下,使用sudo fdisk刪除sd卡上所有分割區,重新燒錄,終於成功了。
系統啟動後,需要考慮的是主機與目標機的連線問題。樹莓派系統預設是開著ssh服務的。所以當用網線連線到路由器,並獲得ip後,用命令ssh pi@192.168.x.x是可以連線目標機的。但考慮到有圖形介面還是要更方便一些。於是安裝vnc服務,方法是命令:sudo apt-get install tightvncserver ,之後執行tightvncserver即開啟了vnc遠端桌面服務。此時用vnc用戶端工具即可進行視覺化操作。
3.在Linux下搭建本地開發環境
通常Linux的大多數發行版預設包含gcc等工具,但為了方便,我們也可以安裝eclipse的Linux版本。使用此類IDE工具可以提高開發效率。
方法是,在Linux下執行 sudo apt-get install eclipse
安裝完成後可以看到eclipse的啟動圖示。正常情況下可以順利啟動eclipse。此時的eclipse預設是Java開發環境,為了開發c程式,我們還需要增加一些外掛。方法是:在eclipse的help-install new software選單中指定網址:http://download.eclipse.org/releases/indigo ,選擇collaboration-Mylyn Context Connector: c/c++ Development,這樣就把開發c/c++專案的外掛安裝上了。之後還需要執行一下sudo apt-get install build-essential,把編譯環境需要用到的檔案裝上。就完成了本地開發環境的搭建。
正常啟動eclipse後,可以在new 選單中看到c/c++專案,如下圖
4.搭建交叉編譯環境
通常網上已有經過驗證的交叉編譯工具鏈,需要下載下來即可。首先安裝git工具:sudo apt-get install git,之後下載:git clone git://github.com/raspberrypi/tools.git
等待下載完成,即可看到包含了若干種類的編譯工具。我的Linux是64位元版本,所以使用gcc-linaro-arm-Linux-gnueabihf-raspbian-x64/bin/arm-Linux-gnueabihf-gcc即可。
加入環境變數,編輯.bashrc檔案,在末尾加入export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708/gcc-linaro-arm-Linux-gnueabihf-raspbian-x64/bin
實驗例子,寫一段c程式碼
本地執行成功,之後進行交叉編譯:
arm-Linux-gnueabihf-gcc tst.c –o tst 生成tst執行檔案,傳輸到目標平台:
sftp pi@192.168.x.x 連線後,用put /home/xx/workspace/rr/tst /home/pi/tst
執行成功
5.直接使用eclipse進行目標平台編譯
使用手工方式(寫c程式碼、寫makefile檔案、手工編譯等)還是比較繁瑣的,另外也容易出錯。既然整合式開發環境可以編譯原生代碼,自然也可以進行交叉編譯。於是經過一番探索,完成了這個步驟。
首先在專案屬性的c/c++ Build的Settings選單中,點Manage Configurations,增加一項新設定(我這裡起名ARM)並啟用,修改GCC C Compiler和GCC C Linker中的命令,採用前面提到過的arm-Linux-gnueabihf-gcc。注意此處用了絕對路徑,因為之前加環境變數PATH是加到了bash.rc中,如果加到.profile中就不用這麼麻煩了。
之後,Project-Build All,成功。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-09/135062.htm
相關文章