Hi3559A的芯片资源


这里可以清晰看到,CPU部分无非是A73和A53,跑的系统还是linux,architecture都是"aarch64"。所以有了一个想法,就是呢,我使用RK3399的ubuntu系统编译了一个小程序,只有print函数的,生成可执行程序,移植到3559A上运行,一切正常。这个实验证明,3559AV100的linux本质上与TX2或者是RK3399的ubuntu16.04并没有什么区别,它依旧是arm64v8的linux。所以我就顺其自然地想到了一个快速在PC开发的方法:

使用arm64v8/ubuntu:xenial这样的docker镜像,不使用海思提供的交叉编译工具,毕竟这样我就可以很方便的,在PC上的docker使用apt-get install somepackages,不需要啥第三方库都得自己用交叉编译器撸一遍,然后很愉快地编译pytorch,caffe,opencv这些我需要的第三方库了。

一、 docker准备

docker基本知识汇总
请先了解docker是干什么的,同时在自己PC上面配置好docker。
Deepin安装docker

二、 安装3559A可以使用的ubuntu:xenial的docker镜像

这个是我测试过的镜像,完美模拟ARM64.https://github.com/multiarch/ubuntu-core
Once you need to configure binfmt-support on your Docker host. This works locally or remotely (i.e using boot2docker or swarm).
Host#

# configure binfmt-support on the Docker host (works locally or remotely, i.e: using boot2docker)
$ docker run --rm --privileged multiarch/qemu-user-static:register --reset

It also works for ubuntu16.04 arm64
Host#

$ docker run -it --rm multiarch/ubuntu-core:arm64-xenial
root@723fb9f184fa:/# uname -a
Linux 723fb9f184fa 4.1.13-boot2docker #1 SMP Fri Nov 20 19:05:50 UTC 2015 aarch64 aarch64 aarch64 GNU/Linux

一般进入后,最好换成国内的源:
aarch64的docker容器#

#加入源
echo 'deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse\n\
#deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse\n\
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse\n\
#deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse\n\
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse\n\
#deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse\n\
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main universe restricted\n\
#deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main universe restricted\n\
' > /etc/apt/sources.list
#更新
apt-get update

这里推荐使用我push到dockerhub的一个镜像xxradon/jetson-tx2-ubuntu:latest:
使用
Host#

docker pull xxradon/jetson-tx2-ubuntu:latest

进行拉取,这里面常用的开发库都已经安装完毕。并安装oh my zsh,所以方便的设置容器启动自启,我的容器里设置了ssh自启,方便使用ssh访问docker容器。使用docker run启动后,直接键入

su


Tips:如果docker run出现如下错误:
Host#

standard_init_linux.go:190: exec user process caused "exec format error"

请重新使用下面的指令进行注册qemu-user-static修复。
Host#

# configure binfmt-support on the Docker host (works locally or remotely, i.e: using boot2docker)
$ docker run --rm --privileged multiarch/qemu-user-static:register --reset

三 、3559A硬件连接Linux PC,调试运行

1.通过minicom进行串口连接

首先进行minicom-linux下USB转串口配置,将3559A的板子连接好PC
现在的笔记本越做越薄,好些电脑已经没有串口了,做硬件开发会非常头疼,不过有了USB转串口设备,PC机只需要有USB接口就可以了。在linux下我们使用minicom与目标设备通信,在此记录一下linux下USB转串口的配置过程。

1.查看驱动是否正常:
Host#

sst@ubuntu:~/work/test$ lsmod |grep usbserial
usbserial 45014 1 ch341

如果有usbserial这一行,说明系统支持USB转串口。

2.查看USB设备
Host#

sst@ubuntu:~/work/test$ dmesg |grep ttyUSB0
[221102.440589] usb 3-10: ch341-uart converter now attached to ttyUSB0

3.安装minicom
Host#

sudo apt-get install minicom

4.配置minicom
Host#

sudo minicom -s

按A键,设置Serial Device为: /dev/ttyUSB0按F键,设置Hardware Flow Control 为No按G键,设置Software Flow Control为No按回车,保存。如果想把你的配置设置为默认配置,在configuration选择Save setup as dfl,然后退出。

5.启动minicom
Host#

sudo minicon

我的串口输出是二进制数据,所以看上去就是乱码啦按下CTRL-A Z后会弹出帮助菜单,在菜单下按Q可以退出。

2. NFS开发环境搭建

NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。

NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利;

2.1. 安装 NFS 服务包

由于我的Host# 主机是Deepin操作系统,其他类debian的操作系统,如ubuntu执行的命令基本一致,在 Deepin 终端执行以下命令安装 NFS 服务包:

Host#

sudo apt-get install nfs-kernel-server

2.2. 设置配置文件

NFS 允许挂载的目录和权限需要在文件“/etc/exports”中进行定义。
执行如下指令,创建 NFS 共享目录,打开 NFS 配置文件 exports:
//建立 NFS 共享目录

Host#

sudo mkdir /home/shining/nfs_share
sudo gedit /etc/exports //打开 NFS 配置文件

在文件最后加入如下配置信息,添加完毕保存并退出。如下图所示:
Host#

/home/shining/nfs_share/ *(rw,sync,no_root_squash)

参数说明如下:
/home/shining/ nfs_share /:新建的 NFS 共享目录。
*:允许所有的网络段访问。
rw:访问者具有可读写权限。
sync:资料同步写入内存和硬盘。
no_root_squash:NFS 共享目录访问者具有 root 权限。
NFS 常用参数说明如下:
ro:只读访问。
rw:读写访问 sync 所有数据在请求时写入共享。
asyncnfs:在写入数据前可以响应请求。
secure nfs:通过 1024 以下的安全 TCP/IP 端口发送。
insecure nfs:通过 1024 以上的端口发送。
wdelay:如果多个用户要写入 NFS 目录,则归组写入(默认)。
no_wdelay:如果多个用户要写入 NFS 目录,则立即写入,当使用 async 时,无需此设置。
hide:在 NFS 共享目录中不共享其子目录。
no_hide:共享 NFS 目录的子目录。
subtree_check:如果共享”/usr/bin”之类的子目录时,强制 NFS 检查父目录的权限(默认)。
no_subtree_check:和上面相对,不检查父目录权限。
all_squash:共享文件的 UID 和 GID 映射匿名用户 anonymous,适合公用目录。
no_all_squash:保留共享文件的 UID 和 GID(默认)。
root_squash root:用户的所有请求映射成如 anonymous 用户一样的权限(默认)。
no_root_squas root:用户具有根目录的完全管理访问权限。
anonuid=xxx:指定 NFS 服务器”/etc/passwd”文件中匿名用户的 UID。

2.3. 重启 NFS 服务

执行以下命令重启 NFS 服务器,结果如下图所示:

Host#

sudo /etc/init.d/rpcbind restart
//重启 rpcbind

Host#

sudo /etc/init.d/nfs-kernel-server restart //重启 NFS

2.4. 开发板挂载 NFS 服务器共享目录

开发板和 PC 先通过路由器或者交换机互联,也可以通过网线直联。

2.5. 开发板和 deepin 之间 ping 测试

请进入开发板和 deepin 系统,使用 ifconfig 命令查看各自当前 IP 和子网掩码。
此处查询到 deepin IP 为: 192.168.1.243,开发板 IP 为: 192.168.1.242,子网掩码为: 255.255.255.0.
如果未设置好IP,请按照如下方案设置ip:
在deepin操作系统上,由于deepin的系统自带网络配置无法同时配置2个IP,使用如下指令安装辅助工具:
Host#

sudo apt-get install network-manager

如下图编辑自己的网络IP。


海思3559A开发板上设置,在vi /etc/init.d/rcS下加入:
3559A#

ifconfig eth0 192.168.1.242 netmask 255.255.255.0
route add default gw 192.168.1.1

设置完成后,请使用ping指令相互ping一下,确保连接正常。

2.6. 开发板挂载 NFS 服务器共享目录

进入开发板文件系统,执行如下命令建立 NFS 挂载目录并修改读写权限。

3559A#

mkdirs -p /home/shining/nfs

3559A#

chmod 777 /home/shining/nfs

在开发板中当前执行以下命令,挂载 NFS 服务器共享目录到开发板的“/home/shining/nfs”目录,并
查看共享目录内容:
3559A#

mount -t nfs -o nolock,nfsvers=3,vers=3 192.168.1.243:/home/shining/nfs_share /home/shining/nfs

3559A#

ls /home/shining/nfs //查看挂载的 NFS 共享目录内容
指令注释:
-t nfs:type,挂载类型为 NFS。
-o nolock:不加文件锁,NFS 挂载时默认选项为文件锁(lock),依赖于 portmap 提供的
动态端口分配功能。
192.168.1.89:/home/shining/nfs_share /nfs/:NFS 服务器 IP 地址为 192.168.1.89,NFS 服务器共享目录为”/home/shining/nfs_share”。

如果开发板还没有安装 NFS 客户端,请在开发板联通网络下,执行以下命令安装 NFS客户端,再重新挂载。

在 NFS 共享目录新建的文件,会在开发板挂载目录同步出现。在开发板挂载目录新建的文件,也会在 NFS 共享目录出现。开发板通过 NFS 挂载 Deepin 的 NFS 共享目录已经成功,并且可读可写,以后就可以
通过 NFS 服务器来传输文件,比 U 盘拷贝方式更加便捷。

2.7. 卸载开发板的 NFS 挂载目录

在开发板上执行以下命令,卸载 NFS 挂载目录:
3559A#

 umount /home/shining/nfs_share

3559A#

 df //查看系统挂接信息

用 df 命令查看挂接信息,已经没有挂接信息,说明卸载成功。

四、 使用docker联合3559A开发板进行开发

4.1. docker容器与3559A开发板共享文件夹

通过上面二、四教程,我们知道docker可以进行文件夹映射,这个功能与NFS相同,所以我们将aarch64的docker容器的一个工作文件夹与3559A的NFS共享文件设置为同一个文件夹,这里假设共享的文件夹是/home/shining/Projects/work/His3559A:
3559A#

mount -t nfs -o nolock,nfsvers=3,vers=3 192.168.1.243:/home/shining/Projects/work/His3559A /home/shining/nfs

aarch64 的docker容器#

docker container run --privileged --rm  -p 8003:22 -it --ipc=host -v /home/shining/Projects/work/His3559A:/home/shining/nfs -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=:0 xxradon/jetson-tx2-ubuntu:latest /bin/bash

上面的-v /home/shining/Projects/work/His3559A:/home/shining/nfs 就是docker配置文件夹映射。

4.2. 开发流程

使用aarch64 的docker容器进行编译,这里需要特别说明,所有的第三方库基本都可以使用了,opencv,caffe,pytorch(怎么编译caffe,opencv,pytorch这些常用的深度学习算法库,请自行百度),只用在aarch64 的docker容器进行编译,然后使用以下脚本deploy.sh:
docker容器#

#这里是deploy.sh里的脚本内容
deplist=$( ldd $1 | awk '{if (match($3,"/")){ print $3}}' )
cp -L -n $deplist $2

使用下面指令
docker容器#

bash  deploy.sh 软件名 打包的库文件放置位置

进行依赖库打包。这里拿编译好的pytorch的libtorch.so为例,假如我想在3559A上使用libtorch.so的ATen 操作,在编译好的pytorch的lib下/home/shining/nfs/3rdparty/install/lib,使用
docker容器#

bash  deploy.sh libtorch.so .

将libtorch.so的所有依赖打包至libtorch.so的当前目录下。

4.3. 在3559A上运行程序

第一步当然是使用export,将库路径放在环境变量中去(临时的),如下:

3559A#

export LD_LIBRARY_PATH="/home/shining/nfs/3rdparty/install/lib:$LD_LIBRARY_PATH:"
export PATH="/home/shining/nfs/3rdparty/install/bin:$PATH"

运行pytorch中的AlgorithmsTest例子,如图一切正常:

五、开发Tips

3559A的开发版一般不支持ssh,但是支持Telnet,所以可以通过telnet在PC主机上打开多个窗口。
3559A#

# telnetd&

Host

telnet 192.168.1.242

Hi3559A 开发总结--使用docker相关推荐

  1. 开发必备技术--docker(使用篇)

    文章目录 前言 Docker的基本概念 概念 数据卷 虚拟网络 镜像操作 镜像名称 镜像命令 容器操作 基本操作 容器创建 数据卷操作 创建和查看数据卷 其他指令 实战 前言 续接上一篇博文: 开发必 ...

  2. 面向Java开发人员的Docker:简介

    本文是我们学院课程中名为< 面向Java开发人员的Docker教程 >的一部分. 在本课程中,我们提供了一系列教程,以便您可以开发自己的基于Docker的应用程序. 我们涵盖了广泛的主题, ...

  3. spring boot 与 iview 前后端分离架构之开发环境基于docker的部署的实现(三十六)

    spring boot 与 iview 前后端分离架构之开发环境基于docker的后端的部署的实现(三十六) 公众号 基于docker的后端的部署 安装mysql数据库 创建数据库 安装redis 安 ...

  4. Spring Cloud开发实践 - 04 - Docker部署

    Docker的安装和命令可以参考 https://www.cnblogs.com/milton/p/9866963.html . 资源规划 这一步要区分传统资源和Docker资源, 为后面的细节定好基 ...

  5. php docker开发环境,使用Docker的PHP开发环境

    我目前正在尝试使用NGINX和PHP-FPM Docker容器设置PHP开发环境. 现在,我知道这可以通过运行两个服务的单个容器,也可以通过多个容器设置来实现,其中每个服务都在自己的容器中运行(这是基 ...

  6. 加入docker管理员_如何使系统管理员和开发人员同意Docker

    加入docker管理员 在短短两年内,将Docker用作应用程序容器管理系统已成为开发人员和系统工程师的标准做法. 有人喜欢说,自Ope​​nSSH以来,还没有看到这样的技术进步. Docker现在是 ...

  7. 【华为云实战开发】2.Docker镜像部署怎么玩才酷炫?

    1 文章目的 本文主要帮助想要或者正在使用容器部署服务的用户,如何将他们的应用部署通过DevCloud部署在华为云上. 2 概述 2.1 Docker Docker是一个开源的引擎,可以轻松的为任何应 ...

  8. 可执行镜像——开发环境的Docker化之路

    每位开发者都经历过软件不兼容之痛.当我们需要同时开发几个使用不同Java运行时版本的项目时,这些问题会急剧爆发,特别是在OsX平台上.为此,Ruby使用自己的版本管理工具.我的两个同事曾用了几小时来调 ...

  9. [阶段4 企业开发进阶] 8. Docker

    文章目录 1 Docker简介 1.1 概述 1.2 应用场景 1.3 Docker优点 1.4 Docker能做什么 1.5 Docker架构 1.6 安装Docker 1.7 Run的运行流程 1 ...

  10. 软件测试/测试开发丨学习Docker就应该掌握的dockerfile语法与指令

    公众号搜索:TestingStudio 霍格沃兹测试开发的干货都很硬核 在日常的工作中,常常需要制作自己的项目的镜像,一般通过以下两种方式制作镜像:Docker commit.Dockerfile. ...

最新文章

  1. 【转载】从百度、360、搜狗对新站态度看国内搜索引擎技术现状
  2. ubuntu11.10安装arm-linux-gcc详解
  3. android已停止三星,急,android离线打包程序三星下总报 程序 已停止
  4. 编程体系结构(08):Spring.Mvc.Boot框架
  5. html5标签属性大全_HTML/HTML5 知识点思维导图
  6. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
  7. IBM宣布:成功研制出了量子计算机原型机,量子计算机商业化正在加速!
  8. Nero Burning Rom v7.2.3.2b 简体中文版
  9. Javascript视频教程全集,基础入门学习-动力节点
  10. android 项目交接文档,Android实用开发规范
  11. torch.nn.Module.named_buffers(prefix=‘‘, recurse=True)
  12. echarts设置地图大小比例,大小设置
  13. 微服务实践(七):从单体式架构迁移到微服务架构 - DockOne.io
  14. 市场规模、市场份额、市场定位、产品类型以及发展规划-园艺电动工具
  15. css代码 文字超出点点点
  16. java eml 附件_向EML文件追加附件的Java实现
  17. Laravel数据库 Eloquent 操作返回值
  18. Spring boot整合Redis(入门教程)
  19. stormzhang:对于 996,说下我的观点
  20. num2str(matlab自定义函数)

热门文章

  1. 免安装版的Mysql安装与配置——详细教程
  2. 电机的力矩、转速和功率
  3. odac与oracle,适用于 Windows 的 64 位 Oracle Data Access Components (ODAC) | Oracle 中国
  4. 为什么实对称矩阵要求其正交矩阵,而不是可逆矩阵使其对角化?
  5. Springboot集成Quartz定时任务,项目启动执行任务
  6. 如何完全删除数据库 任何版本 注册表删除法
  7. 2_simulink搭建RCL_电阻电感电容模块
  8. openCV4+vs2019环境搭建
  9. 新手的神奇bug——ImportError: cannot import name XXX
  10. Ubuntu:安装yarn