最近剛剛接觸XILINX的ZYNQ板,剛接觸沒有十天。XILINX定位它為SOC,我也很認(rèn)同,起碼比TI定位MPU為SOC強(qiáng)很多。據(jù)說今年TI的最新產(chǎn)品也加入了ZYNQ板。
之前的MIPS處理器設(shè)計(jì)與實(shí)現(xiàn)的項(xiàng)目就算做告一段落,搞了將近7個(gè)月,成果顯著,收獲頗多,最近打算搞搞ZYNQ。
之前MIPS也有一套交叉編譯工具,不過是老師提供的,自己也嘗試搞了搞,太辛苦了,而且也沒什么成果,因?yàn)槲覀冃枰狶ITE版的MIPS指令集。
這次不一樣,ZYNQ集成了兩個(gè)ARM cortex-A9處理器,可以支持thumb指令集以及arm指令集,所以這方面的交叉編譯我本以為會(huì)很容易,誰知道依舊搞了很久。
主機(jī)平臺(tái):Ubuntu12.04LTS x86-32bit(我裝的是雙系統(tǒng),沒有在虛擬機(jī)下運(yùn)行,真心不推薦在虛擬機(jī)下運(yùn)行,太慢了)
目標(biāo)平臺(tái):linaro(Ubuntu11.04貌似) ARM(Xilinx Zedboard)
由于OpenCV默認(rèn)下只支持AVI標(biāo)準(zhǔn)格式的打開與寫入,因此需要添加很多解碼與編碼庫(kù)的交叉編譯庫(kù)等文件,包括jpeg、png等等。因此,大體流程是先對(duì)需要支持的庫(kù)進(jìn)行交叉編譯,再對(duì)OpenCV進(jìn)行交叉編譯并添加相應(yīng)的庫(kù)支持。依賴關(guān)系如下:
OpenCV
|--------zlib
|--------jpeg
|--------libpng
|--------zlib
|--------tiff
|--------zlib
|--------ffmpeg
|--------x264
|--------xvidcore
其實(shí),看起來并不難, 但最難的就是這些源碼包之間的相互支持等錯(cuò)綜復(fù)雜的關(guān)系,基本上就是錯(cuò)一個(gè)動(dòng)全身,筆者經(jīng)過了幾番的嘗試,終于找到了一個(gè)在當(dāng)前環(huán)境下可以成功的源碼包,其版本如下:
xilinx-arm交叉編譯工具:xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin
ffmpeg源碼包:ffmpeg-0.10.3.tar.bz2
jpeg源碼包:jpegsrc.v8d.tar.gz
png源碼包:libpng-1.5.14.tar.gz
tiff源碼包:tiff-4.0.3.tar.gz
x264源碼包:x264-snapshot-20120528-2245-stable.tar.bz2
xvid源碼包:xvidcore-1.3.2.tar.gz
zlib源碼包:zlib127.zip
OpenCV源碼包:OpenCV-2.4.3.tar.bz2(筆者選用的2.4.3,但是里面有個(gè)bug在Windows下用mingw32-make編譯可能會(huì)報(bào)錯(cuò),對(duì)于這個(gè)bug官方給的建議是升級(jí)2.4.4,選用2.4.4應(yīng)該也可以,可以嘗試一下,這個(gè)沒bug)
Qt第三方庫(kù):qt-everywhere-opensource-src-4.8.5.tar.gz(筆者沒有選用最新的5.1版本,據(jù)說這個(gè)版本增加了很多功能比如傳感器等等,有興趣可嘗試)
由于其是這些庫(kù)中有些很難找,筆者直接傳到百度網(wǎng)盤,供下載 ?shareid=3831914682&uk=1092766566
需要注意的是版本一定要正確并且一定要按照以下的順序安裝,否則會(huì)出現(xiàn)各種錯(cuò)誤。
-------------------------------------------------------------------------------------------------------------------
1.安裝xilinx-arm交叉編譯工具
xilinx-arm交叉編譯工具即SourceryCodeBench,該工具是專門為32位機(jī)器設(shè)計(jì)的,所以64位機(jī)器需要下載32-bit庫(kù)
sudo -s進(jìn)入root權(quán)限(一定要小心,不要亂刪除文件,退出exit即可)
apt-get install ia32-libs ia32-libs-gtk
然后需要將dash更改為bash,輸入
dpkg-reconfigure dash
出現(xiàn)如圖所示對(duì)話框,選擇No,將dash修改為bash。
下載xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin文件,默認(rèn)保存在Downloads文件夾下,保存位置任意。
輸入如下命令打開文件
cd Downloads // 打開Downloads文件夾,根據(jù)保存文件不同,此類指令任意改變,以下略去
./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin // 打開bin文件,由于此時(shí)為root權(quán)限,所以可以打開任意文件否則需要使用
// chmod命令為文件分配權(quán)限
然后彈出如下安裝界面,一路accept和next,選擇Typical安裝以及Do not modify,安裝在默認(rèn)路徑(/root/CodeSourcery下)
?
export ARCH=arm
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
export PATH=/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/:$PATH
注意:$PATH 千萬不要輸入錯(cuò)誤,否則會(huì)運(yùn)行不了很多命令,也可以輸入
gedit /etc/bash.bashrc
如圖所示,添加以下內(nèi)容
保存并關(guān)閉gedit,然后輸入
source /etc/bash.bashrc使當(dāng)前設(shè)置立即生效,
可以通過輸入echo $PATH命令檢查環(huán)境變量是否設(shè)置正確,如下圖:
可以,編譯C文件進(jìn)行測(cè)試,
使用gedit在任意目錄下編輯hello.c文件如圖所示,保存后進(jìn)入終端。
以root身份進(jìn)入到當(dāng)前目錄下,輸入arm-xilinx-linux-gnueabi-gcc -o hello hello.c命令(該命令root身份有效)
生成hello可執(zhí)行文件,輸入file hello命令,hello文件信息如下,顯示arm可執(zhí)行文件。
此時(shí)證明arm-xilinx交叉編譯工具安裝正確無誤,進(jìn)入下一步。
在此之前建議,添加環(huán)境變量用于簡(jiǎn)單表示交叉編譯庫(kù)存放路徑,每次啟動(dòng)終端都需要輸入此命令
export ZYNQ_CV_BUILD=/opt/opencv/opencv-lib
使用echo $ZYNQ_CV_BUILD命令檢驗(yàn)是否添加環(huán)境變量,再開始對(duì)依賴庫(kù)的編譯。
2.依賴庫(kù)的交叉編譯
對(duì)于依賴庫(kù)的編譯,都需要進(jìn)行配置,當(dāng)發(fā)生配置錯(cuò)誤時(shí)可使用./configure --help命令查看幫助,以及閱讀相應(yīng)log文件查看編譯出錯(cuò)原因。切記需要按照順序編譯,并且一定注意版本一致。
(1)zlib-1.2.7
由于zlib中沒有--host選項(xiàng),所以需要預(yù)先聲明cc變量
unzip zlib127.zip
cd zlib-1.2.7
export CC=arm-xilinx-linux-gnueabi-gcc
./configure --prefix=$ZYNQ_CV_BUILD --shared
make
make install
然后,可進(jìn)入$ZYNQ_CV_BUILD/lib目錄下檢查是否已編譯ARM環(huán)境的zlib庫(kù)
cd $ZYNQ_CV_BUILD/lib
ls
file libz.so.1.2.7
如下圖所示,則表明成功編譯arm所需庫(kù)文件,以下依賴庫(kù)均可采用此種檢查方式,故略去。
(2)jpeg-8d
tar -xzvf jpegsrc.v8d.tar.gz
cd jpeg-8d
./configure --prefix=$ZYNQ_CV_BUILD --host=arm-xilinx-linux-gnueabi --enable-shared
make
make install
(3)libpng-1.5.14
libpng編譯時(shí)需要zlib庫(kù)的內(nèi)容,所以需要LDFLAGS以及CFLAGS變量聲明。
tar -xzvf libpng-1.5.14.tar.gz
cd libpng-1.5.14
./configure --prefix=$ZYNQ_CV_BUILD --host=arm-xilinx-linux-gnueabi
--with-pkgconfigdir=$ZYNQ_CV_BUILD/lib/pkgconfig LDFLAGS=-L$ZYNQ_CV_BUILD/lib
CFLAGS=-I$ZYNQ_CV_INSTALL/include
make
make install
(4)x264-snapshot-20120528-2245-stable
tar -xjvf x264-snapshot-20120528-2245-stable.tar.bz2
cd x264-snapshot-20120528-2245-stable
./configure --host=arm-linux --cross-prefix=arm-xilinx-linux-gnueabi- --enable-shared --prefix=$ZYNQ_CV_BUILD
make
make install
(5)xvidcore-1.3.2
注意此處一定要禁止匯編。
tar -xzvf xvidcore-1.3.2.tar.gz
cd xvidcore/build/generic // 注意該依賴庫(kù)configure在build/generic/目錄下
./configure --prefix=$ZYNQ_CV_BUILD --host=arm-xilinx-linux-gnueabi --disable-assembly
make
make install
(6)tiff-4.0.3
同理,需要添加zlib支持,因此需要聲明LDFLAGS和CFLAGS變量。
tar -xzvf tiff-4.0.3.tar.gz
cd tiff-4.0.3
./configure --prefix=$ZYNQ_CV_BUILD --host=arm-xilinx-linux-gnueabi --enable-shared
LDFLAGS=-L$ZYNQ_CV_BUILD/lib CFLAGS=-I$ZYNQ_CV_BUILD/include
make
make install
(7)ffmpeg-0.10.3
ffmpeg的配置選項(xiàng)較多,需要添加cflas和ldflags聲明。
tar -xjvf ffmpeg-0.10.3.tar.bz2
cd fmpeg-0.10.3
./configure --prefix=$ZYNQ_CV_BUILD --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm
--disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-xilinx-linux-gnueabi-gcc --enable-swscale
--extra-cflags=-I$ZYNQ_CV_BUILD/include --extra-ldflags=-L$ZYNQ_CV_BUILD/lib --disable-asm
make
make install
3. OpenCV2.4.3交叉編譯過程
OpenCV的安裝相對(duì)容易,編譯前需要安裝cmake以及cmake-gui配置工具。其實(shí)該配置過程與windows下很相似,只是需要修改一些路徑以及選項(xiàng),并制定編譯器。
sudo apt-get install cmake cmake-gui
解壓OpenCV源代碼
tar -xzvf opencv-2.4.3.tar.bz2
進(jìn)入源代碼,建立build文件夾(此步驟一定需要建立一個(gè)文件夾)
cd OpenCV-2.4.3
mkdir buid
cd build
gedit toolchain.cmake
利用新建toolchain.cmake文件,并添加如下內(nèi)容:
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-xilinx-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-xilinx-linux-gnueabi-g++ )
set( CMAKE_FIND_ROOT_PATH "/opt/opencv/opencv-lib" ) ##注意此路徑與$ZYNQ_CV_BUILD路徑一致且為絕對(duì)路徑##
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
后四行作為交叉編譯時(shí)的依賴庫(kù)的查找路徑。
然后進(jìn)行cmake配置。
cmake -D TOOLCHAIN_FILE=tookchain.cmake ../
啟動(dòng)cmake-gui圖形化管理工具(也可以用ccmake)
cmake-gui
設(shè)置好源路徑($ZYNQ_CV_BUILD,/opt/opencv/opencv-lib)以及編譯路徑(OpenCV-2.4.3\build),將不支持的東西全部去掉,只在with tiff,withjpeg,with ffmpeg,with png。單擊config,出現(xiàn)一系列配置信息。
單擊generate生成makefile文件。
make
make install
OpenCV-2.4.3的交叉編譯全部結(jié)束,明天繼續(xù)鏡像制作以及Qt的交叉編譯。
Qt的移植與安裝
很喜歡Qt這個(gè)庫(kù)以及Qt creater這個(gè)IDE,其實(shí)個(gè)人覺得還蠻好用,因?yàn)楝F(xiàn)在基本都是在用瞪眼兒法找錯(cuò)誤。
尤其喜歡Qt里面槽和信號(hào)的機(jī)制,感覺這個(gè)機(jī)制特別魔幻,特別方便,上個(gè)學(xué)年一整年的課程設(shè)計(jì)都是用Qt做的。
言歸正傳,先說一下,如何在Linux下安裝Qt。
(一)Linux下Qt以及Qt creater的安裝與使用
解壓qt-everywhere-opensource-src-4.8.5.tar.gz到任意文件夾內(nèi)
tar -xzvf qt-everywhere-opensource-src-4.8.5.tar.gz
cd qt-everywhere-opensource-src-4.8.5.tar
配置并指定編譯安裝目錄/opt/qt-4.8.4
./configure -prefix /opt/qt-4.8.4
配置過程中出現(xiàn)如下提示,選擇o回車,繼續(xù)出現(xiàn)提示,
輸入yes回車,接下來生成Makefile文件。
然后,執(zhí)行make以及make install。編譯過程我個(gè)人花了將近四個(gè)小時(shí),
此時(shí)間很長(zhǎng)。完成后添加環(huán)境變量。
gedit /etc/bash.bashrc
添加如下內(nèi)容
export PATH=/opt/qt-4.8.4/bin:$PATH
export QTDIR=/opt/qt-4.8.4
export MANPATH=$QTDIR/man:$MANPATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
保存好后,輸入source /etc/bash.bashrc使添加的環(huán)境變量生效。
接下來安裝Qt-creater。進(jìn)入文件夾,輸入如下命令:
chmod 777 qt-creator-linux-x86-opensource-2.7.0.bin
sudo ./qt-creator-linux-x86-opensource-2.6.1.bin
接下來進(jìn)入安裝界面,設(shè)置安裝目錄以及Qt庫(kù)位置,安裝完成后即可使用。
(二)交叉編譯Qt庫(kù)及鏡像制作
此部分內(nèi)容可參考官方wiki+Qt+and+Qwt+Base+Libraries-Build+Instructions
先建立幾個(gè)環(huán)境變量,輸入如下命令:
export ZYNQ_QT_BUILD=/opt/qt-arm/build
export ZYNQ_QT_INSTALL=/opt/qt-arm/install
export PATH=$ZYNQ_QT_INSTALL/bin:$PATH
在opt內(nèi)建立相應(yīng)目錄
cd /opt
mkdir qt-arm
cd qt-arm
mkdir build install
進(jìn)入qt-everywhere-opensource-src-4.8.5.tar.gz文件夾內(nèi),解壓文件到ZYNQ_QT_BUILD目錄內(nèi)
tar -xzvf qt-everywhere-opensource-src-4.8.5.tar.gz -C $ZYNQ_QT_BUILD
解壓qt_build_src.tar文件,里面有我們需要的配置文件qmake.conf,該文件由Xilinx官方提供,命令如下:
tar xvf qt_build_src.tar
cp ./qmake.conf $ZYNQ_QT_BUILD/qt-everywhere-opensource-src-4.8.5/mkspecs/qws/linux-arm-gnueabi-g++/
因?yàn)樵撆渲梦募赒t4.7,為編譯Qt4.8,需要修改文件內(nèi)容。
gedit $ZYNQ_QT_BUILD/qt-everywhere-opensource-src-4.8.5/mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf
源文件內(nèi)容如圖所示:
將前三行替換為
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)
修改后文件內(nèi)容如圖所示:
然后對(duì)Qt進(jìn)行配置
./configure -embedded arm -xplatform qws/linux-arm-gnueabi-g++ -little-endian -opensource -host-little-endian
-confirm-license -nomake demos -nomake examples -prefix $ZYNQ_QT_INSTALL
配置完成后make以及make install。
之后將Xilinx交叉編譯庫(kù)中的內(nèi)容復(fù)制到Qt庫(kù)中,輸入命令:
cp -P /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/usr/lib/libstdc++.so* $ZYNQ_QT_INSTALL/lib
安裝好Qt庫(kù)后,需要為Zedboard制作鏡像。
cd $ZYNQ_QT_BUILD
dd if=/dev/zero of=qt_lib.img bs=1M count=90 // qt-4.8.5需要90M大小作為鏡像大小,根據(jù)需要可以改變count
mkfs.ext2 -F qt_lib.img
chmod go+w qt_lib.img
mount qt_lib.img -o loop /mnt
cp -rf $ZYNQ_QT_INSTALL/* /mnt
chmod go-w qt_lib.img
umount /mnt
這個(gè)qt_lib.img就是我們所需的運(yùn)行庫(kù)了。
評(píng)論