使用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内,下图说明该情况

主机进行烧写和调试 链接到标题
编译产出的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