本文说明如何使用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
2cd 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
2REPOSITORY 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
8user@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
5cd 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
5cd 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因为映射还是在主机上可以直接访问,通过主机直接烧写和调试
烧写: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