使用docker镜像编译Zephyr

本文说明如何使用docker简便的搭建编译zephyr环境.

起因 链接到标题

常在群里看见有人抱怨zephyr搭建环境太困难,搞个1,2天都搞不顺。可能是我运气比较好,在ubuntu16.04上搭建编译环境按照zephyr官网文档搭建和后来迁移到ubuntu18.04基本没有遇到大的问题。看群里的朋友遇到的问题基本是没有安装或者错误安装一些包,和实际环境关系比较大,往往有心助力,却又不知从何下手。最近发现zephyr官方有提供dockerfile,于是搭建了一下可以正常使用,这里记录一下使用方法,如果能对zephyr的入门者有一点点帮助,也倍感荣幸。

步骤 链接到标题

本文的操作都基于ubuntu 18.04进行

1. 安装docker 链接到标题

网上大把的说明,这里不做赘述,如果有商业上的考虑,注意安装docker-ce即可(社区版) 。

2. 下载docker file 链接到标题

git clone https://github.com/zephyrproject-rtos/docker-image.git

3. 修改dockerfile 链接到标题

如果你的board和app都是放在zephyr的目录树下可以省略这一步,我的board和app都是diy用的,进zephyr的master意义不大,为了不污染zephyr目录树,是单独放到一个目录下的,因此我需要在dockerfile中增加一个路径挂载我的代码修改

cd docker-image/
vim Dockerfile

在最后一行加上

RUN mkdir ~/env

4. 产生image 链接到标题

执行下面的命令,要多长时间看网速。基本上ubuntu的源和要下载的东西都是在国外站点,所以是漫长的等待,可以在晚上睡觉前进行

docker build -t zephyr_doc:v1

docker会以ubuntu 18.04为基础image安装编译zephyr所需的所有套件,image产生完成后执行docker images看到如下信息说明zephyr docker image已经产生成功

REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
zephyr_doc                       v1                  438729e53cb6        11 hours ago        5.95GB

5. 运行image 链接到标题

host的路径:

  • zephyr source: /home/frank/work/project/zephyrproject/zephyr
  • 我的app和board: /home/frank/work/project/nrf52_moderate

执行如下命令,使用zephyr docker镜像创建容器并运行

 docker run -ti -v /home/frank/work/project/zephyrproject/zephyr:/workdir  -v /home/frank/work/project/nrf52_moderate:/workdir/env zephyr_doc:v1

如果你的app和board没有独立出去可以不需要*-v /home/frank/work/project/nrf52_moderate:/workdir/env*,如下

docker run -ti -v /home/frank/work/project/zephyrproject/zephyr:/workdir zephyr_doc:v1

注意因为在镜像内执行了ENV ZEPHYR_BASE=/workdir, 所以/workdir必须挂载为host的zephyr source code目录 看到下面提示说明已经成功, 容器已经跑了起来

user@7c945e33db49:/workdir$

执行ls就可以看到zephyr source的代码

user@7c945e33db49:/workdir$ ls
arch                doc      Kconfig.zephyr  samples     version.h.in
boards              drivers  kernel          sanity-out  west.yml
cmake               dts      lib             scripts     zephyr-env.cmd
CMakeLists.txt      env      LICENSE         soc         zephyr-env.sh
CODE_OF_CONDUCT.md  ext      Makefile        subsys
CODEOWNERS          include  misc            tests
CONTRIBUTING.rst    Kconfig  README.rst      VERSION

6. 编译zephyr 链接到标题

容器启动后默认的设置是ENV ZEPHYR_TOOLCHAIN_VARIANT=zephyr,因此你可以直接编译x86等toolchain的board,例如:

cd samples/hello_world
mkdir build
cd build
cmake -DBOARD=qemu_x86 ..
make run

镜像默认安装了两个toolchain

  • Zephyr SDK
  • GNU Arm Embedded Toolchain

因此也可以编译使用arm架构芯片的板子,只用重设ZEPHYR_TOOLCHAIN_VARIANT即可

export ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb

下面是编译我nrf52 mother board basetest的方法

cd env/apps/basetest/
mkdir build
cd build
cmake -DBOARD=nrf52_mother -DBOARD_ROOT=/workdir/env ..
make -j

编译完后可以在host上对bin进行烧写,对elf进行调试

docker 容器使用说明 链接到标题

容器用于编译 链接到标题

上面的命令通过-v参数将host的目录映射到容器内,只是借助容器部署的zephyr进行编译,结果还是在host内,下图说明该情况 docker

主机进行烧写和调试 链接到标题

编译产出的bin和elf因为映射还是在主机上可以直接访问,通过主机直接烧写和调试 烧写:

pyocd flash -t nrf52 -a 0 zephyr.bin

调试: 参考pyocd搭配vscode-native-debug插件调试zephyr

参考 链接到标题

zephyr的docker也支援vnc远程桌面操作,更多参考 https://github.com/zephyrproject-rtos/docker-image/blob/master/README.md