JETSON交叉编译

1.交叉编译简要流程及必要性


image.png

程序在X85和ARM机器指令集不同,需要交叉编译才能在不同机器上运行。
交叉编译优点

2.交叉编译前通信工具链设置
内核交叉编译需要通信,jetson提供了通信工具链


image.png

通过链接下载对应版本工具链:
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.交叉编译环境设置方法


image.png

交叉编译环境设置方法包括三种,1.直接配置环境变量2.配置Makefile文件3.建立仿真环境.其中1与2方法类似。
3.1直接配置环境变量


image.png

首先指定交叉编译路径,然后指定gcc,g++等二进制文件对应在交叉编译的路径。
遇到一些奇怪问题,通过export LC_ALL=C命令尝试解决。

该方法优点:编译中所有需要的环境变量可以直观的进行手动指定。指定后交叉编译所有需要的环境变量和库等可满足要求。
该方法缺点:所有库环境变量手动指定,其他项目的环境变量需要二次配置。适用于简单项目,较为复杂的项目不适合使用此方法配置环境。
3.2 在makefile中进行编译
3.2.1 makefile文件修改
参考此模板生成新的makefile文件。


image.png

3.2.2 NFS挂载jetson与X86机器
首先在jetson上设置。
image.png

在jetson机器上先安装nfs-kernel-server,使用vim进行信息配置,
查看信息是否满足。这样可以实现通过NFS将jetson暴露给host.
image.png

之后分别执行
$ sudo exportfs –a
$ sudo systemctl restart nfs-kernel-server.service
$ sudo exportfs

检查状态是否满足。


image.png

然后在host设置NFS。


image.png
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拷贝出来

image.png

例如此路径下。
将qemu-aarch64文件拷到当前文件下。
image.png

在模拟环境启动前,先进性mount
image.png

详细参考示例见https://github.com/zhj-buffer/Cross-Compile-Jetson
4、交叉编译案例
image.png

2.1内核(kernel)交叉编译
cd /nvidia/nvidia_sdk/sources/kernel/kernel-4.9
路径下
git tag –l 可以看到所有kernel. ![image.png](https://upload-images.jianshu.io/upload_images/11659928-554337fda0e9e00f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 执行
./source_sync.sh -t tegra-l4t-r32.3.1
下载具体型号的kernel
image.png

vim Makefile可查看相关信息,交叉编译需要指定在Makefile指定CROSS_COMPILE
image.png

前文toolchain默认下载后解压路径为
image.png

在bashrc中设置CROSS_COMPILE环境路径路径,给定ARCH, CROSS_COMPILE,LOCALVERSION.
设定后Makefile文件中的CROSS_COMPILE路径就与此定义路径相同,其他g++等路径可在此基础上自动找到。
vim ~/.bashrc
image.png

编译内核config文件。直接从jetson 的proc路径下拷贝config.gz文件

image.png

复制config文件后vim,效果为


image.png

执行make menuconfig


image.png

执行save操作后exit.
交叉编译环境配置已经完成,开始编译即可。make Image


image.png

make –j16
以上操作在主机上完成,将编译好的kernel拷贝到jetson上进行更新


image.png

4.2Multi Media api交叉编译流程
cd进入tegra_multimedia_api/samples,相关文件均可通过交叉编译实现。


image.png

指定target_rootfs路径
进入路径,vim Rules.mk


image.png

参考下图对相关项进行修改指定:

image.png

修改后,可进行交叉编译。
进入路径后,执行make命令。


image.png

该路径下执行交叉编译命令:

./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
image.png

编译中如报错找不到路径的错误,需要指定其对应的路径,通过软连接方式进行指定。


image.png

同理backend的编译操作类似。
进入路径:


image.png

执行:

./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


image.png

4.3.2编译语义分割
cd进路径


image.png

参考下图,
修改Makefile (vim Makefile)


image.png

修改后,在主机进行编译


image.png

在jetson路径下


image.png

执行命令
./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 路径下

image.png

仿真环境是在主机上同时有主机和jetson的路径,在主机上即可完成对于jetson的交叉编译,与在jetson上编译效果相同。
直接在主机路径上进行编译
image.png

编译完成后将其拷贝到jetson
image.png

用传统方法做也可以,这个例子需要设置环境变量较少。
编译完成后在路径下运行编译好的sample,可查看效果
image.png

image.png

4.5交叉编译Caffe
在仿真环境编译caffe
编译caffe之前,需要先安装cmake.由于ubuntu默认cmake版本比较旧,编译caffe,opencv会有问题。采用源码编译cmake。步骤如下图
image.png

接下来安装caffe需要的其他依赖
image.png

建立build文件夹
image.png

Cmake
image.png

编译
image.png

编译完成后,make all
编译完成的路径在:
cd /media/green/M0/rootfs-xavier/home/nvidia/caffe/build
拷贝到jetson
image.png

在jetson上修改caffe环境变量
image.png

将~/.bashrc中的pythonpath进行修改
image.png

修改为
image.png

python
import caffe
即可验证caffe编译
4.6交叉编译opencv
进入目录
image.png

执行


image.png

编译:
Make –j16
拷贝


image.png

修改环境变量


image.png

验证
python import cv2
即可验证open-cv编译

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342