1. 程式人生 > >把OpenCV搬到ZedBoard來(2)

把OpenCV搬到ZedBoard來(2)

這一部分的內容是,在linux上安裝交叉編譯環境。

背景簡介: 交叉編譯這個概念的出現和流行是和嵌入式系統的廣泛發展同步的。我們常用的計算機軟體,都需要通過編譯的方式,把使用高階計算機語言編寫的程式碼(比如C程式碼)編譯(compile)成計算機可以識別和執行的二進位制程式碼。比如,我們在Windows平臺上,可使用Visual C++開發環境,編寫程式並編譯成可執行程式。這種方式下,我們使用PC平臺上的Windows工具開發針對Windows本身的可執行程式,這種編譯過程稱為native compilation,中文可理解為本機編譯。然而,在進行嵌入式系統的開發時,執行程式的目標平臺通常具有有限的儲存空間和運算能力,比如常見的 ARM 平臺,其一般的靜態儲存空間大概是16到32MB,而CPU的主頻大概在100MHz到500MHz之間。這種情況下,在ARM平臺上進行本機編譯就不太可能了,這是因為一般的編譯工具鏈(compilation tool chain)需要很大的儲存空間,並需要很強的CPU運算能力。為了解決這個問題,交叉編譯工具就應運而生了。通過交叉編譯工具,我們就可以在CPU能力很強、儲存空間足夠的主機平臺上(比如PC上)編譯出針對其他平臺的可執行程式。

言歸正傳: 在配置完(一)裡面的資訊之後,你是不是有種迫不及待的心情向在windows下編寫一個程式。和windows不同的是在linux中不需要專門在裝一個類似VC之類的應用軟體了。在系統中已經有現成的了。

一、編寫helloworld應用程式

對資料夾進行建立,home/My_Project/zedboard/code,並且cd /home/My_Project/zedboard/code 裡面將自己的程式碼放到裡面,方便管理。

利用vim helloworld.c 編寫檔案,相信大家都比較熟悉吧,裡面的內容如下: 在這裡插入圖片描述

在linux下編譯.c檔案時,採用gcc 檔案.c -o 可執行檔名,使用./可執行檔名

來執行程式,為了與之後的程式相區分,生成的可執行檔案命名為helloworld_pc,程式碼以及執行結果如下 在這裡插入圖片描述

二、交叉編譯環境的建立

在PC機上運行了helloworld之後,肯定想在zedboard板卡上執行程式吧,但pc的可執行程式不能直接在ARM板卡上執行,原因可以大概解釋如下吧:PC機上採用的是X86體系結構,而ARM採用的是ARM結構,兩個可以執行的二進位制程式碼不一樣,所以可執行檔案不能混著用,要是使用還是有辦法的,那就是交叉編譯,交叉編譯的目的就是在主機上生成目標機(zedboard)能執行的檔案。本次實驗的zedboard已經將交叉編譯的檔案給我們了,只需要執行幾個簡單的指令就可以了。

和執行上一小節的helloworld一樣,用 ./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin 安裝檔案,但這個時候會出現一個錯誤資訊。 在這裡插入圖片描述

在終端裡輸入如下命令 dpkg-reconfigure dash,並且在彈出的對話方塊裡選擇 <否>,就可以啦。 (原因大概是:Ubuntu的 shell 預設安裝的是 dash,而不是 bash,dash 比 bash 更輕,更快。但 bash 卻更常用。如果一些命令、指令碼等總不能正常執行,有可能是 dash 的原因。

./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin 安裝檔案,在安裝bin檔案時會再次出現問題,會出現missing 32-bit libraries on 64-bit linux host這樣資訊。提醒需要安裝32位依賴庫。進行如下操作即可: sudo apt-get install lib32ncurses5 lib32z1

可以安裝的時候,就一路預設下去吧,不過這個時候最好注意下檔案安裝到哪個地方了。

本次安裝到了home目錄下。

這個時候,進入安裝目錄,我們就能很容易找到類似於gcc一樣的交叉編譯工具,如下圖: 在這裡插入圖片描述

從圖上可以看出,交叉工具很多,但如果現在,要是直接在終端裡面輸入arm-xilinx-linux-gnueabi-gcc會提示找不到。這個類似於在windows下,需要設定環境變數。在ubuntu中,環境變數的檔案是 /etc/bash.bashrc,我們可以把這個檔案進行修改(命令vim /etc/bash.bashrc),增加的內容是

export ARCH=arm

export CROSS_COMPILE=arm-xilinx-linux-gnueabi-

export PATH=/home/gaohy/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/:$PATH 在這裡插入圖片描述

此時儲存檔案(:wq!),並且關閉終端,重新開啟一個終端 輸入arm-xilinx 按幾下tab鍵是不是顯示出來了可愛的交叉編譯鏈。到此說明交叉編譯鏈安裝已經大功告成 在這裡插入圖片描述

三、交叉編譯helloworld

交叉編譯鏈安裝成功了,就可以交叉編譯c檔案了,進入到/home/gaohy/My_Project/zedboard/code/helloworld資料夾下面,使用arm-xilinx-linux-gnueabi-gcc helloworld.c -o helloworld_zed,來生成在ZedBoard板卡上能執行的檔案,並用file命令驗證一下。 在這裡插入圖片描述

如上圖可以看到helloworld_zed是在arm架構中執行的程式,helloworld_pc是在X86結構下可執行的。此後在板卡上執行下就OK啦。