Hi3559A 開發總結--使用docker

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

進行拉取,這裏面常用的開發庫都已經安裝完畢。

三 、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例子,如圖一切正常:
在這裏插入圖片描述

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