JETSON交叉編譯

1.交叉編譯簡要流程及必要性



程序在X85和ARM機器指令集不同,需要交叉編譯才能在不同機器上運行。
交叉編譯優點

2.交叉編譯前通信工具鏈設置
內核交叉編譯需要通信,jetson提供了通信工具鏈


通過鏈接下載對應版本工具鏈:
http://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05x86_64_aarch64-linux-gnu.tar.xz
解壓工具鏈:

$ mkdir $HOME/l4t-gcc 
$ cd $HOME/l4t-gcc
$ tar xf gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz

3.交叉編譯環境設置方法



交叉編譯環境設置方法包括三種,1.直接配置環境變量2.配置Makefile文件3.建立仿真環境.其中1與2方法類似。
3.1直接配置環境變量



首先指定交叉編譯路徑,然後指定gcc,g++等二進制文件對應在交叉編譯的路徑。
遇到一些奇怪問題,通過export LC_ALL=C命令嘗試解決。

該方法優點:編譯中所有需要的環境變量可以直觀的進行手動指定。指定後交叉編譯所有需要的環境變量和庫等可滿足要求。
該方法缺點:所有庫環境變量手動指定,其他項目的環境變量需要二次配置。適用於簡單項目,較爲複雜的項目不適合使用此方法配置環境。
3.2 在makefile中進行編譯
3.2.1 makefile文件修改
參考此模板生成新的makefile文件。



3.2.2 NFS掛載jetson與X86機器
首先在jetson上設置。

在jetson機器上先安裝nfs-kernel-server,使用vim進行信息配置,
查看信息是否滿足。這樣可以實現通過NFS將jetson暴露給host.

之後分別執行
$ sudo exportfs –a
$ sudo systemctl restart nfs-kernel-server.service
$ sudo exportfs

檢查狀態是否滿足。



然後在host設置NFS。


sudo /etc/fstab
192.168.55.1:/ /mnt/rootfs nfs defaults 0 0

的作用爲設置開機自動掛載,如不需要,使用手動掛載即可。

$ sudo mount –t nfs 192.168.55.1:/ /mnt/rootfs

3.3 建立仿真環境

使用Chroot&Qeum配置一個仿真環境,設置交叉編譯環境

該方法適用於解決複雜問題。

首先安裝chroot


sudo apt install chroot

接下來安裝qemu

直接使用apt install qemu 會有問題,需要使用github提供的編譯版本qemu-aarch64-static.

https://github.com/zhj-buffer/Cross-Compile-Jetson

將jetson 的rootfs拷貝出來


例如此路徑下。
將qemu-aarch64文件拷到當前文件下。

在模擬環境啓動前,先進性mount

詳細參考示例見https://github.com/zhj-buffer/Cross-Compile-Jetson
4、交叉編譯案例

2.1內核(kernel)交叉編譯
cd /nvidia/nvidia_sdk/sources/kernel/kernel-4.9
路徑下 ./source_sync.sh -t tegra-l4t-r32.3.1
下載具體型號的kernel

vim Makefile可查看相關信息,交叉編譯需要指定在Makefile指定CROSS_COMPILE

前文toolchain默認下載後解壓路徑爲

在bashrc中設置CROSS_COMPILE環境路徑路徑,給定ARCH, CROSS_COMPILE,LOCALVERSION.
設定後Makefile文件中的CROSS_COMPILE路徑就與此定義路徑相同,其他g++等路徑可在此基礎上自動找到。
vim ~/.bashrc

編譯內核config文件。直接從jetson 的proc路徑下拷貝config.gz文件


複製config文件後vim,效果爲


執行make menuconfig



執行save操作後exit.
交叉編譯環境配置已經完成,開始編譯即可。make Image


make –j16
以上操作在主機上完成,將編譯好的kernel拷貝到jetson上進行更新


4.2Multi Media api交叉編譯流程
cd進入tegra_multimedia_api/samples,相關文件均可通過交叉編譯實現。


指定target_rootfs路徑
進入路徑,vim Rules.mk


參考下圖對相關項進行修改指定:

修改後,可進行交叉編譯。
進入路徑後,執行make命令。



該路徑下執行交叉編譯命令:

./video_dec_trt2 ../../data/Video/sample_outdoor_car_1080p_10fps.h264  ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264    --trt-deployfile../../data/Model/resnet10/resnet10.prototxt      --trt-modelfile../../data/Model/resnet10/resnet10.caffemodel      --trt-mode 0

編譯中如報錯找不到路徑的錯誤,需要指定其對應的路徑,通過軟連接方式進行指定。


同理backend的編譯操作類似。
進入路徑:


執行:

./backend 1 ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --trt-deployfile
../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.prototxt --trt-modelfile
../../data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.caffemodel --trt-mode 0 --trt-procinterval
1 -fps 10

4.3 Deep stream交叉編譯流程
4.3.1編譯ssd


4.3.2編譯語義分割
cd進路徑


參考下圖,
修改Makefile (vim Makefile)


修改後,在主機進行編譯



在jetson路徑下



執行命令
./deepstream-segmentation-app
dstest_segmentation_config_semantic.txt
sample_720p.mjpeg sample_720p.mjpeg

4.4交叉編譯CUDA
仿真環境搭建好以後,編譯cuda sample
主機進入目錄 cd /usr/local/cuda/bin
裏面的cuda-install-samples-10.2.sh是想編譯的sample
將其拷貝到jetson 路徑下


仿真環境是在主機上同時有主機和jetson的路徑,在主機上即可完成對於jetson的交叉編譯,與在jetson上編譯效果相同。
直接在主機路徑上進行編譯

編譯完成後將其拷貝到jetson

用傳統方法做也可以,這個例子需要設置環境變量較少。
編譯完成後在路徑下運行編譯好的sample,可查看效果


4.5交叉編譯Caffe
在仿真環境編譯caffe
編譯caffe之前,需要先安裝cmake.由於ubuntu默認cmake版本比較舊,編譯caffe,opencv會有問題。採用源碼編譯cmake。步驟如下圖

接下來安裝caffe需要的其他依賴

建立build文件夾

Cmake

編譯

編譯完成後,make all
編譯完成的路徑在:
cd /media/green/M0/rootfs-xavier/home/nvidia/caffe/build
拷貝到jetson

在jetson上修改caffe環境變量

將~/.bashrc中的pythonpath進行修改

修改爲

import caffe
即可驗證caffe編譯
4.6交叉編譯opencv
進入目錄

執行


編譯:
Make –j16
拷貝


修改環境變量


驗證
python import cv2
即可驗證open-cv編譯

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