By Toradex秦海
1).?簡(jiǎn)介
隨著嵌入式設(shè)備的發(fā)展沪编,由于部署更靈活應(yīng)用方便等特性寸爆,原本在網(wǎng)絡(luò)應(yīng)用中廣泛使用的docker技術(shù)也慢慢在一些嵌入式設(shè)備中應(yīng)用苍凛,因此本文就基于嵌入式ARM平臺(tái)使用集成docker技術(shù)的Liinux系統(tǒng)來(lái)測(cè)試CAN通信功能龄寞。
本文所演示的平臺(tái)來(lái)自于Toradex Colibri iMX8X ARM嵌入式平臺(tái)壁拉,這是一個(gè)基于NXP iMX8X ARM處理器拐叉,支持Cortex-A35和Coretex-M4架構(gòu)的計(jì)算機(jī)模塊平臺(tái)。
2.?準(zhǔn)備
a).?Colibri iMX8X 2GB WB IT?ARM核心版配合Colibri Evaluation?載板扇商,連接調(diào)試串口UART1(載板X27)到開(kāi)發(fā)主機(jī)方便調(diào)試凤瘦。
b). Colibri iMX8X?通過(guò)Toradex Easy Installer?安裝包含Docker支持的Torizon Linux操作系統(tǒng),目前最新的monthly發(fā)布?TorizonCore 5.1.0-devel-202012+build.6
c).?Apalis iMX8QM?4GB WB IT ARM核心版配合Ioxra?載板案铺,連接調(diào)試串口UART1(載板X22)到開(kāi)發(fā)主機(jī)方便調(diào)試蔬芥。
d). Apalis iMX8QM同樣通過(guò)Toradex Easy Installer安裝標(biāo)準(zhǔn)嵌入式Linux?用于CAN接口測(cè)試時(shí)候?qū)樱到y(tǒng)版本為L(zhǎng)inux Reference Multimedia 5.1.0-devel-202012
3).?測(cè)試系統(tǒng)配置
a). Colibri iMX8X CAN接口對(duì)應(yīng)管腳說(shuō)明如下控汉,本文測(cè)試使用FlexCAN1接口
b).?測(cè)試系統(tǒng)如下硬件連接將Colibri iMX8X CAN1和Apalis iMX8QM CAN0接口進(jìn)行連接
./ Colibri Eva Board JP4和JP5跳線斷開(kāi)笔诵,將X9連接器?SODIMM_55和SODIMM_63管腳分別連接到X38連接器TX和RX插座。
./ Colibri Eva Board X2 Top DB9?管腳2和7通過(guò)兩端均配置120Ohm終端電阻的連線和Ixora載板X20管腳1和2連接姑子。
c). Colibri iMX8X TorizonCore linux系統(tǒng)默認(rèn)使能的是Colibri Evaluation Board載板上面的MCP2515 SPI CAN接口乎婿,需要通過(guò)如下device tree overlay配置修改為iMX8X的兩個(gè)FlexCAN接口
./ device tree overlay的基本說(shuō)明請(qǐng)參考這里,編譯方法請(qǐng)參考這里街佑。
./ overlay?源文件請(qǐng)參考如下鏈接
./?將上述源文件編譯好的overlay文件(可以從這里下載)根據(jù)這里的說(shuō)明部署到Colibri iMX8X上
4).?部署CAN測(cè)試Docker image
a).?首先參考這里的說(shuō)明在開(kāi)發(fā)PC上面配置Docker編譯環(huán)境
b).?在開(kāi)發(fā)PC創(chuàng)建如下Dockerfile?用于進(jìn)行CAN測(cè)試
-------------------------------
ARG IMAGE_ARCH=arm64v8
# Use the parameter below for Arm 32 bits (like iMX6 and iMX7)
# ARG IMAGE_ARCH=arm32v7
FROM torizon/$IMAGE_ARCH-debian-shell:1.0
WORKDIR /home/torizon
RUN apt-get -y update && apt-get install -y \
??? nano \
??? python3 \
??? python3-pip \
??? python3-setuptools \
??? git \
??? iproute2 \
??? can-utils \
??? net-tools \
??? vim \
??? python3-can \
&& apt-get clean && apt-get autoremove && rm -rf /var/lib/apt/lists/*
-------------------------------
c).?如下編譯并打包成離線Docker image文件谢翎,當(dāng)然也可以上傳到dockerhub上面通過(guò)在線的方式在設(shè)備安裝
-------------------------------
$ docker build -t can-test-torizon .
$ docker save -o can-test-torizon.tar can-test-torizon
-------------------------------
e).?將上面打包好的docker image復(fù)制到Colibri iMX8x設(shè)備上面捍靠,并安裝并運(yùn)行
-------------------------------
### load docker image
$ docker load -i can-test-torizon.tar
### check docker image
$ docker images
REPOSITORY?????????? TAG???????????????? IMAGE ID??????????? CREATED???????????? SIZE
can-test-torizon???? latest????????????? 3f1a2122de1c??????? 10 minutes ago????? 236MB
### run docker image
$ docker run -it --rm --name=can-test-torizon --net=host --cap-add="NET_ADMIN" -v /dev:/dev -v /tmp:/tmp -v /run/udev/:/run/udev/ can-test-torizon
-------------------------------
5). CAN通訊測(cè)試
a).?在上述Colibri iMX8x啟動(dòng)的docker image里面使能can1接口
-------------------------------
### set can1 interface up
/home/torizon# ip link set can1 type can bitrate 1000000
/home/torizon# ip link set can1 up
### check can1 interface
/home/torizon# ifconfig can1
can1: flags=193<UP,RUNNING,NOARP>? mtu 16
??????? unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00? txqueuelen 10? (UNSPEC)
??????? RX packets 0? bytes 0 (0.0 B)
??????? RX errors 0? dropped 0? overruns 0? frame 0
??????? TX packets 0? bytes 0 (0.0 B)
??????? TX errors 0? dropped 0 overruns 0? carrier 0? collisions 0
??????? device interrupt 69?
-------------------------------
b).?繼續(xù)在docker image里面創(chuàng)建如下”can-test.sh”腳本用于間隔50ms連續(xù)發(fā)送CAN標(biāo)準(zhǔn)包
-------------------------------
#!/bin/bash
for ((i=1; i<=20; i++))
do
cansend can1 01F#1122334455667788
sleep 0.05
done
-------------------------------
c).?在Apalis iMX8QM Linux下運(yùn)行下面命令使能can0接口并準(zhǔn)備進(jìn)行CAN包接收
-------------------------------
root@apalis-imx8:~# ip link set can0 type can bitrate 1000000
root@apalis-imx8:~# ip link set can0 up
root@apalis-imx8:~# candump can0
-------------------------------
d).?在colibri imx8x docker內(nèi)執(zhí)行上面創(chuàng)建的腳本發(fā)送CAN包
-------------------------------
/home/torizon# chmod +x can-test.sh
/home/torizon# ./can-test.sh
-------------------------------
e). Apalis iMX8QM接收到對(duì)應(yīng)的CAN包
-------------------------------
root@apalis-imx8:~# candump can0
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F ??[8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
? can0? 01F?? [8]? 11 22 33 44 55 66 77 88
-------------------------------
f).?將發(fā)送和接收互換后測(cè)試也同樣結(jié)果
-------------------------------
### Apalis iMX8QM?發(fā)送
root@apalis-imx8:~# ./can-test.sh
### Colibri iMX8x接收
/home/torizon# candump can1
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
? can1? 01F?? [8]? 11 22 33 44 55 66 77 88
-------------------------------
6).?總結(jié)
本文使用NXP iMX8X嵌入式平臺(tái)配合嵌入式Linux?和Docker平臺(tái)測(cè)試CAN通信,相比原生CAN通信森逮,利用Docker技術(shù)可以更靈活的用包管理方式安裝所需的組件榨婆,同時(shí)在不同平臺(tái)遷移也相對(duì)更簡(jiǎn)單,但需要注意的是在Docker環(huán)境下訪問(wèn)主機(jī)外設(shè)需要對(duì)cgroup權(quán)限做正確的設(shè)置以保證可以順利加載褒侧。