使用docker镜像编译Zephyr

Creative Commons
本作品采用知识共享署名

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

起因

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

步骤

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

1. 安装docker

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

2. 下载docker file

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

3. 修改dockerfile

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

1
2
cd docker-image/
vim Dockerfile

在最后一行加上

1
RUN mkdir ~/env

4. 产生image

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

1
docker build -t zephyr_doc:v1

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

1
2
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镜像创建容器并运行

1
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,如下

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

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

1
user@7c945e33db49:/workdir$

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

1
2
3
4
5
6
7
8
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,例如:

1
2
3
4
5
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即可

1
export ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb

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

1
2
3
4
5
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因为映射还是在主机上可以直接访问,通过主机直接烧写和调试
烧写:

1
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