windows下eclipse的zephyr开发环境搭建

zephyr v1.11.0之后已经支持在win上不依赖unix工具集构建了,已经不推荐在WSL环境中开发。本文已经失效请不要参考!

win的Linux子系统下搭建zephyr编译环境, 在eclipse中开发.

zephyr-logo.png

Zephyr是linux基金会的rtos项目(官方网站), Apache License, 2016年年底我开始关注这个项目, 它的成长速度令人激动.

Zephyr使用Kconfig+Makefile(1.10.0之后改为CMake)构建, 在win10周年版之后, Windows加入了一个WSL(Windows Subsystem for Linux), 在WSL下搭建zephyr开发环境就像在Linux下一样方便, 习惯在win开发的人也可以用它来尝尝鲜.


笔者部分软件版本信息

1
2
3
4
5
windows 10 1709 16299.64
Zephyr Kernel v1.10.0-rc2
Zephyr SDK 0.9.2
Python 3.5.2
cmake version 3.10.0

文中的目标板是ARM平台M3内核的stm32_min_dev.


Step0 更新系统

win+R执行winver, 确认系统版本win10为1607之后, 如果版本未达到要求请先升级系统.

img.png


Step1 启用WSL 安装Ubuntu On Windows

该步骤可以参考微软的文档以及Zephyr文档.

进入控制面板 - 程序 - 程序和功能 - 开启或关闭Windows功能, 勾选适用于Linux的Windows子系统, 确定后WSL开启.
img.png

进入Microsoft Store, 搜索ubuntu, 下载即可得到一个Ubuntu子系统.

启动它的方法有几种:

  • 开始菜单中输入ubuntu, 启动
  • win+R, 输入wslbashubuntu

启动了熟悉(陌生?)的bash, 就可以把它当做ubuntu一样操作了.

img.png

这里提供一些信息:

  • 根文件系统大致位置在 C:\Users\r\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_(??)\LocalState\rootfs你可以直接在windows中浏览它, 但最好不要直接编辑它, 因为会把文件的权限弄乱, 如果不小心弄乱了权限, 请使用chmod命令重新设置文件权限.
  • wsl可以直接访问windows中的文件, 各盘符被挂载在/mnt下, 如C盘为/mnt/c
  • 更多信息可以浏览开发者博客

Step2 搭建Zephyr开发环境

该步骤在Zephyr的文档中已经描述清楚了, 这里不重复陈述, 但有一些要注意的地方.

更换国内更新源

国内访问默认更新源贼慢, 所以请先为ubuntu的apt更换源, 推荐阿里的源, 具体请百度ubuntu更换源.

下载缓慢/无法下载的问题

国内因为一些不可描述的原因, 在下载Github的Release中的压缩包时可能缓慢或无法访问, 请自备代理或者选择从其他渠道获取.


Step3 尝试编译zephyr

Step3.1 获取Zephyr源码包

方法1

Github Release直接获取压缩包

方法2

使用git clone, 此时请注意关闭git的”AutoCrlf”功能, 在windows下, 该功能会将unix风格的换行符自动转换成windows风格, unix系工具无法正确处理win风格的换行符.

Step3.2 编译Hello World程序

参考Zephyr手册, 编译hello world:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 进入zephyr源码目录
$ cd zephyr

# source命令 配置必要的环境变量
$ source zephyr-env.sh

# 进入hello world目录
$ cd $ZEPHYR_BASE/samples/hello_world

# 创建并进入build目录
$ mkdir -p build & cd build

# 使用cmake生成makefile 目标为qemu模拟器
$ cmake -DBOARD=qemu_cortex_m3 ..

# 使用cmake生成的makefile进行构建并执行
$ make run

如果环境搭建无误, 应该能看到下图的结果:
Snipaste_2017-12-06_16-22-19.png


Step4 搭建Eclipse ARM开发环境

使用IDE是为了更方便的编写和调试应用程序, 请参考我的另一篇blogwindows中eclipse的arm开发环境的搭建方法搭建环境.


Step5 使用Eclipse编译Zephyr

Step5.1 应用程序项目的目录树设计

Zephyr使用CMake构建系统, 可以很灵活地设计目录树, 这里为作演示, 简单地把zephyr/samples/hello_world中的文件拷贝到与zephyr同级的目录下, 这级目录作为工程的根目录, 如图所示:
Snipaste_2017-12-06_17-25-41.png

Step5.2 新建Eclipse工程

在Eclipse中新建Makefile工程
Snipaste_2017-12-06_17-30-55.png

Step5.3 调用WSL环境构建程序

由于IDE中的调试功能由插件提供, 我们需要做的仅是利用WSL进行构建, 根据官方blog A Guide to Invoking WSL 可得知调用WSL的方法:

1
bash -c command

Step5.4 编写供IDE使用的辅助构建脚本

Eclipse中常用的操作就是build/clean, 这里示范通过在WSL中调用一个自行编写的脚本build.sh实现这两个操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash

build_dir="build"
zephyr_dir="zephyr"
cmake_options="-DBOARD=stm32_min_dev"
make_options="-j8"

if [ $1 == "build" ] ; then
echo "Command: build"

if [ ! -d $build_dir ] ; then
echo "$build_dir not exist, create one"
mkdir $build_dir
fi

# zephyr environment variable
source $zephyr_dir/zephyr-env.sh

# Entry $build_dir dir
cd $build_dir

# if Makefile not exist
if [ ! -f "Makefile" ] ; then
echo "Makefile not exist, call CMake"
cmake $cmake_options ..
fi

echo "Call Make"
make all $make_options

elif [ $1 == "clean" ] ; then
echo "Command: clean"
echo "delete all files in $build_dir dir"
rm -rf $build_dir/*
else
echo "USAGE: $0 build or $0 clean"
fi

该脚本实现多线程增量编译, 将该脚本保存在工程目录下, 命名build.sh, 脚本用法:

1
2
3
4
5
# 执行build操作 当Makefile不存在时调用CMake生成Makefile 并执行make操作
$ ./build.sh build

# 执行clean 直接清空build目录
$ ./build.sh clean

Step5.5 IDE工程中关联辅助构建脚本

接下来对CDT工程的C/C++ Build进行设置:

  1. 打开工程设置(Alt+Enter), C/C++ Build, Builder Settings选项卡
  2. 取消Use default build command, Build command中填入bash
  3. 进入Behavior选项卡
  4. Build on resource saveBuild中填写-c "./build.sh build"
  5. Clean填写-c "./build.sh clean"

build1.png

build2.png

设置好后就可以在IDE中编译工程了:

build_gif.gif


Step6 IDE中调试

这里演示使用J-Link连接STM32F103C8最小系统板, 其他编译器和目标硬件大同小异, 均是在Eclipse中使用gnu-mcu-eclipse插件提供的调试功能, 它将通过打开一个调试器工具包提供的gdb server(这里是JLinkGDBServerCL.exe), 再通过编译工具链中的gdb(这里是arm-none-eabi-gdb)连接gdb server进行调试.

debug_jlink.png

Step6.1 配置调试项

进入调试设置

debug1.png

新建调试项, 指定ELF文件.

debug2.png

切换到Debugger选项卡, 设置设备名(Device Name); 由于编译过程在WSL中完成, 而调试信息使用的是绝对路径, 所以gdb在调试过程中无法对应上相应的source file, 这里在gdb client的命令中新加一条:

1
set substitute-path "WSL工程路径" "WIN工程路径"

举个例子, 当WIN工程路径为 “b:\abc” 时 对应的WSL工程路径为 “/mnt/b/abc”, 起到路径重定向的作用.

debug3.png

P.S. 笔者猜测使用绝对路径和cmake有关, 因为cmake中的一个使用相对路径的变量CMAKE_USE_RELATIVE_PATHS在v3.4中取消了, 原因是”仅部分实现, 且之前的实现不可靠”, 知道具体原因的朋友麻烦告知一下..

Step6.2 配置环境变量

由于建立的是Makefile Project, Eclipse不会帮我们在执行gdb时引入对应的工具链PATH, 需要手动设置: 打开Window - Preference, 进入C/C++ - Build - Environment, 添加PATH 加入工具链的bin文件夹, 也就是arm-none-eabi-gdb所在的文件夹.

debug_env.png

P.S. 工具链在Step5搭建Eclipse开发环境时应该已经安装好了, 这里仅用它的gdb来调试.

Step6.3 尝试调试

进入调试.

debug4.png

如果配置无误, 现在应该就能正常调试了:
debug_gif.gif


Step7 结束

Zephyr是个好东西, 祝大家玩的开心.