Paspberry Pi 4开发板

在Raspberry Pi 4 Model B开发板上通过Dockerhub来使用VxWorks 7容器

1 简介

容器可以让你将VxWorks的应用程序打包并和系统的其他部分进行分离开。VxWorks的容器可以被部署在被称为Dockerhub的元存储库上,并可从那儿分发到VxWorks的目标板上。

VxWorks是由风河公司提供的实时操作系统。

VxWorks有针对Raspberry Pi 4 model B目标板的板级支持包(BSP)。

Raspberry Pi 4开发板是一个小型的,价格可承受的计算机开发板。

DockerHub是一个Docker用户可以存储和分发容器镜像的仓库。

本文将介绍如何配置VxWorks以支持Raspberry Pi 4上的容器,还有DockerHub云如何注册。

2 前提条件

这些步骤假设你正在使用:

1) 一个具有4GB内存的Raspberry Pi 4 model B的开发板
2) 一个USB转串行TTL的串口线
3) 一个microSD卡
4) 一个安装了下面Wind River VxWorks 7, SR31.07的Windows工作站
5) Wind River VxWorks 7, SR21.07

这些步骤假设你已经有了一个Docker Hub的登录帐号。参考https://hub.docker.com 查看更多细节。

我们也假设你已经将你的工作站用buildah工具进行了配置,这是用来编译OCI兼容容器的,更多细节,请参考VxWorks容器编程指南,为容器来配置编译用的工作站。

3 相关的文档

更多关于这些主题的内容,请参考:

Wind River文档

VxWorks容器编程者指南

4 为Raspberry Pi 4的目标开发板的一些准备工作

4.1 为TTL的串口线安装驱动(仅仅在Windows的工作站上)

按照下述链接的描述来为USB转串口线安装一个Windows 10的驱动

Fake PL2303 – how to install on Windows 8.1

4.3 将TTL的串口线连接到Raspberry Pi 4的开发板上

在开发板上找到pin的连接器,Pin 1是在从板边算起的第二排的pin里面,离顶边最近的那一列的pin。(离网络RJ45和USB连接器最远的那边)

如下面描述将TTL串口线连好:

pin 06 – 黑线

pin 08 – 白线

pin 10 – 绿线

注意:红线不要接

4.3 按照BSP里面的target.txt文件里描述的指令来定位firmware:

installDir\vxworks\21.07\os\unsupported\rpi_4\rpi_4\target.txt

首先,将Raspberry Pi的firmware git库克隆到本地,比如:

git clone https://github.com/raspberrypi/firmware.git

然后,将正确版本的代码下载下来

注意:当你使用git checkout命令时候,添加-f参数来强制下载正确的firmware版本,比如:

git checkout -f d9c382e0f3a546e9da153673dce5dd4ba1200994

4.4 将启动目录的文件拷贝到SD卡的根目录

下载到一个目录中git仓储被称为firmware,将firmware/boot里面的文件拷贝到SD卡的根目录。

4.5 将串口线接到Raspberry Pi 4的开发板上

将TTL的串口线的USB接头连到工作站上

将电源线和网线连到Raspberry Pi 4的开发板上

4.6 检查Raspberry Pi 4开发板上的U-Boot串口终端

工作站终端的串口配置默认如下:

Baud Rate: 115200

Date: 8 bit

Stop: 1 bit

Parity: None

Flow Ctrl: None

5 准备支持容器的VxWorks的工程项目

5.1 创建并编译一个容器VxWorks源码编译项目(VSB)

打开Windows的命令行,配置编译环境,然后将容器库添加进新创建的VxWorks源码编译工程(VSB)里:

cd <WIND_HOME>                  // your installation directory
wrenv -p vxworks\21.07
cd <YOUR_WORKSPACE>             // your workspace
vxprj vsb create -S -bsp rpi_4 -smp rpiVSB
cd rpiVSB                       // your VSB directory
                                // add the Containers runtime
vxprj vsb layer add CONTAINER_RUNTIME 
                                // add the Containers manager
vxprj vsb layer add CONTAINER_MANAGER      
                                // add the Containers Examples
vxprj vsb layer add PYTHON 
vxprj vsb layer add CONTAINER_EXAMPLES
vxprj vsb config -s -add _WRS_CONFIG_CONTAINER_PYTHON_WEB_SERVER=y 

                                // Build the VSB
vxprj vsb build -j 16
cd ..       

5.2 创建并编译一个容器VxWorks镜像工程(VIP)

像下面一样来创建一个VxWorks镜像工程:

vxprj vip create -vsb rpiVSB llvm -profile PROFILE_DEVELOPMENT rpiVIP
cd rpiVIP

                                  // enable VIP container components
vxprj vip component add INCLUDE_CONTAINER_RUNTIME INCLUDE_CONTAINER_SHELL_CMD
vxprj vip component add INCLUDE_DISK_UTIL INCLUDE_RAM_DISK INCLUDE_OVERLAY_FS
vxprj vip parameter set RAM_DISK_SIZE 0x4000000

vxprj vip component add INCLUDE_STANDALONE_SYM_TBL
vxprj vip component add INCLUDE_STANDALONE_DTB
                                    // enable PYTHON and ROMFS
vxprj vip component add INCLUDE_PYTHON_SUPPORT INCLUDE_ROMFS

5.3 配置VxWorks可以让公网访问

vxprj vip component add INCLUDE_CONTAINER_MANAGER INCLUDE_IPDNSC
vxprj vip component add INCLUDE_PING INCLUDE_IFCONFIG
vxprj vip parameter setstring DNSC_PRIMARY_NAME_SERVER "8.8.8.8"
vxprj vip parameter set SEC_VAULT_KEY_ENCRYPTING_PW \"vault_passwd\"
vxprj vip component add INCLUDE_IPCOM_USE_TIME_CMD

注意:

在Linux主机端,按照如下指示来设置 SEC_VAULT_KEY_ENCRYPTING_PW

vxprj parameter set SEC_VAULT_KEY_ENCRYPTING_PW \"\vault_passwd\"

注意:

将SEC_VAULT_KEY_ENCRYPTING_PW设置成一个合适的含有大小写字母以及数字的密码。

5.4 添加针对Raspberry Pi 4具体的组件

vxprj vip component add DRV_END_FDT_BCM_GENETv5 INCLUDE_XBD_PART_LIB
vxprj vip component add DRV_FDT_BRCM_2711_PCIE DRV_FDT_BRCM_2711_EMMC2
vxprj vip component add DRV_SDSTORAGE_CARD

5.5 拷贝VxWorks容器证书到VIP ROMFS目录

mkdir romfs\vxc\ca-certs
copy ..\..\vxworks\21.07\os\container\manager\ca-certs\ca-certificates.crt romfs\vxc\ca-certs\

5.6 更新DTS文件中的VxWorks启动行

在一个编辑器中打开DTS文件rpi_4_0_1_2_0\rpi-4b.dts

定位到DTS文件中选择的节点

为目标机选择一个IP地址并将给IP地址正确地配置到VxWorks的启动行里,比如:

bootargs = "genet(0,0)host:vxworks h=192.168.1.105 e=192.168.1.107:ffffff00 g=192.168.1.1 u=target pw=vx tn=RPi4";

5.7 编译VIP工程项目

vxprj build

6 将这个网页服务器的示例容器推送到DockerHub上

cd ..\myVSB\usr\containers\web_server\
wsl buildah pull oci:web_server.oci
wsl buildah push --creds dockerAccountName:dockerAccountPassword web_server.oci docker://dockerAccountName/web_server.oci

注意:

dockerAccountName 是你的Docker Hub帐号的docker ID
dockerAccountPassword 是你的Docker Hub帐号的密码

7 启动Raspberry PI 4目标板上的VxWorks

7.1 将VxWorks启动文件拷贝到SD卡上

将Raspberry Pi 4目标板断电,移除SD卡,将SD卡插入到工作站上,将VIP项目工程生成的uVxWorks文件拷贝到SD卡的根目录。

将rpiVIP\rpi_4_0_1_2_0_sd_card_files目录下的内容拷贝到SD卡的根目录,从工作站移除SD卡,并安装到Raspberry Pi 4的目标板上。

7.2 从U-Boot的控制台启动VxWorks

给目标板上电,U-Boot将会自动运行启动脚本,然后VxWorks的内核shell将会出现在串口控制台上。

另一种方法,你也可以手动来启动VxWorks内核:

首先,按回车键来中断U-Boot的启动过程,然后,手动在命令行上加载uVxWorks文件。

fatload mmc 0:1 0x10000000 uVxWorks

然后,运行uVxWorks文件。

bootm 0x10000000

7.3 确定目标板的网络IP地址

从VxWorks的内核shell上运行ifconfig命令:

-> ifconfig
.
.
.
gei0      Link type:Ethernet HWaddr 7a:7a:9a:00:00:02
          inet 192.168.1.107 mask 255.255.255.0 broadcast 192.168.1.255
.
.
.

value = 0 = 0x0
->

注意:有时候,VxWorks的网络协议栈在VxWorks启动后需要花几分钟来创建一个网络链接,RJ45网络接口上的LED会在驱动尝试连接的过程中一直闪烁。

你可能需要拔掉然后再插上网线来让LED开始闪烁,当绿灯和黄灯稳定之后,你应该就可以成功访问网络了。

7.4 设置正确的VxWorks日期

-> cmd
[vxWorks *]# date 2021-06-15
ok
[vxWorks *]#

注意:

这个指令是假设当前日期是2021年6月15日。请设置成你访问本文并实际操作的日期。

8 下载并运行网页服务器的容器

8.1 检查你的网络连接

[vxWorks *]# C
-> ping "www.google.com"

Pinging lhr25s34-in-f4.1e100.net (142.250.187.228) with 64 bytes of data:
Reply from 142.250.187.228 bytes=64 ttl=114 seq=0 time=16ms

--- lhr25s34-in-f4.1e100.net ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 17 ms
rtt min/avg/max = 16/16/16 ms
value = 0 = 0x0
-> cmd
[vxWorks *]# 

注意:

你可能需要等一会,让END的网络驱动完成配置网络PHY,当RJ45链接头上的LED停止闪烁后,配置就搞定了。

8.2 将网页服务器的VxWorks容器拉到目标机上

[vxWorks *]# vxc pull dockerAccountName/web_server.oci 
[vxWorks *]# vxc unpack --image web_server.oci --rootfs flattened /ram0/bundle

注意:

dockerAccountName 是你的Docker Hub账户的docker ID

8.3 运行网页服务器容器

[vxWorks *]# vxc run --bundle /ram0/bundle web_server
Starting server using port 8888

8.4 打开你的工作张上的网页浏览器来验证示例容器已经运行

假设你的目标机IP地址是192.168.1.107,将你的浏览器导航到 http://192.168.1.107:8888 ,你可以看到示例的Wind River网页页面会展示在你的浏览器上了。

当网页服务器为你的浏览器提供内容的时候,你也会在内核shell上收到调试信息,比如:

[vxWorks *]# vxc run --bundle /ram0/bundle web_server
Starting server using port 8888
192.168.1.105 - - [06/Jul/2021 01:43:54] "GET / HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:43:54] "GET / HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:43:55] "GET /wndrvr.png HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:43:55] "GET /GettyImages.jpg HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:43:55] code 404, message File not found
192.168.1.105 - - [06/Jul/2021 01:43:55] "GET /favicon.ico HTTP/1.1" 404 -
192.168.1.105 - - [06/Jul/2021 01:44:13] "GET / HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:44:13] "GET /wndrvr.png HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:44:13] "GET /GettyImages.jpg HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:44:13] code 404, message File not found
192.168.1.105 - - [06/Jul/2021 01:44:13] "GET /favicon.ico HTTP/1.1" 404 -
192.168.1.105 - - [06/Jul/2021 01:44:51] "GET / HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:44:51] "GET /wndrvr.png HTTP/1.1" 200 -
192.168.1.105 - - [06/Jul/2021 01:44:51] "GET /GettyImages.jpg HTTP/1.1" 200 -