Zephyr™ 项目是一个采用 Apache 2.0 协议许可,Linux基金会托管的协作项目。为所有资源受限设备,构建了针对低功耗、小型内存微处理器设备而进行优化的物联网嵌入式小型、可扩展的实时操作系统(RTOS),支持多种硬件架构及多种开发板,可以在小至 8 kB 内存的系统上运行。
Zephyr 采用深入的安全开发生命周期:安全验证,模糊和渗透测试,频繁的代码审查,静态代码分析,威胁建模和审查,以防止代码中的后门 。
Zephyr 支持 Bluetooth、Bluetooth Low Energy、Wi-Fi、802.15.4、6Lowpan、CoAP、IPv4、IPv6 和 NFC 等标准,通过社区驱动的发展来改进和增强功能 。
Zephyr 可以在 Windows/MAC/Linux 上开发,首先介绍在 Linux(Ubuntu) 上的环境搭建 :
1. 更新软件源
sudo apt-get update
sudo apt-get upgrade
2. 安装依赖软件包
## 下面是整个一条命令
sudo apt-get install --no-install-recommends git cmake ninja-build gperf \
ccache doxygen dfu-util device-tree-compiler \
python3-ply python3-pip python3-setuptools xz-utils file make gcc-multilib
3. 克隆 Zephyr 源码仓库
建议把 Zephyr 源码克隆到用户目录中,例如克隆至 repo/zephyr
文件夹中。
mkdir -p repo cd repo git clone https://github.com/zephyrproject-rtos/zephyr
4. 安装必要的依赖工具
## 进入 Zephyr 文件夹
cd zephyr
## 通过 pip3 工具安装其他依赖工具
pip3 install --user -r scripts/requirements.txt
5. 安装 3.8.2 版本及以上 CMake 工具
Zephyr 的开发需要 cmake 3.8.2
或以上版本,通过 ubuntu 软件仓库安装的 cmake
版本较低并不符合要求,可通过以下步骤把合适的CMake安装到 ~/cmake
目录下。
mkdir $HOME/cmake && cd $HOME/cmake
wget https://cmake.org/files/v3.8/cmake-3.8.2-Linux-x86_64.sh
yes | sh cmake-3.8.2-Linux-x86_64.sh | cat
把 CMake 安装目录增加到用户环境变量中,修改用户目录中的 .bashrc
文件的最后增加一行 ,
echo "export PATH=$PWD/cmake-3.8.2-Linux-x86_64/bin:\$PATH" >> $HOME/.zephyrrc
## 执行 Zephyr 源码目录下的 zephyr-env.sh
source <zephyr git clone location>/zephyr-env.sh
cmake --version
查看当前 Cmake 版本号,如果是 3.8.2 ,则说明配置正常。
6. 安装 Zephyr SDK
Zephyr 的 SDK 包含所有必须的工具和交叉编译器,用于支持 build 内核在不同的系统架构上。除此之外,它包括主机工具,如自定义 QEMU 二进制文件和主机编译器,如果需要的话,可以构建宿主工具。
SDK支持以下架构:
本文使用的 SDK 版本是 0.9.5 ,安装过程中控制台将出现 Zephyr SDK 安装路径的提示,建议把 Zephyr SDK 安装到用户目录 ~/opt/zephyr-sdk
文件夹中。
## 下载 SDK,如果下载过程中速度过慢,可以在浏览器中下载后拷贝到对应文件夹中
mkdir -p ~/opt/zephyr-sdk && cd ~/opt/zephyr-sdk
wget https://github.com/zephyrproject-rtos/meta-zephyr-sdk/releases/download/0.9.2/zephyr-sdk-0.9.2-setup.run
## 安装 SDK
sudo chmod +x zephyr-sdk-0.9.2-setup.runa
./zephyr-sdk-0.9.2-setup.run
7. 设置环境变量
在用户目录 .bashrc
文件末尾再增加 ZEPHYR_GCC_VARIANT
、ZEPHYR_SDK_INSTALL_DIR
和 ZEPHYR_BASE
等参数,修改完成之后在控制台执行 source ~/.bashrc
,该指令可使新增加的环境变量立即生效 。
这里建议使用 vim 编辑器,如果 ubuntu 中默认没有安装可以先安装:
## 安装 vim 精简版 vim.tiny
sudo apt-get install vim-gtk
## 配置 vim
sudo vim /etc/vim/vimrc
## 请在您的 vimrc 文件末尾添加如下配置,之后保存退出文件
set nu ## 在左侧行号
set tabstop ## tab 长度设置为 4
set nobackup ## 覆盖文件时不备份
set cursorline ## 突出显示当前行
set ruler ## 在右下角显示光标位置的状态行
set autoindent ## 自动缩进
安装 vim 编辑器之后,可以配置添加环境变量。
vim ~/.bashrc
## 文件末尾添加如下配置,之后保存退出文件
export PATH=<camke install directory>/bin:$PATH ## cmake 安装路径
export ZEPHYR_GCC_VARIANT=zephyr
export ZEPHYR_SDK_INSTALL_DIR=<zephyr-sdk directory> ## Zephyr SDK 安装路径
export ZEPHYR_BASE=<zephyr local repository directory> ## Zephyr 源码路径
## 执行命令时环境变量立即生效
source ~/.bashrc
8. 在 QEMU 中运行 hello world 示例程序
完成上述安装过程后,可以通过 hello world
示例验证 Zephyr 开发环境是否一切正常。此处使用 qemu_x86
仿真平台进行验证。此处编译生成的 hello world
可执行文件将运行于 QEMU 仿真平台。
$ZEPHYR_BASE/samples/hello_world
文件夹下文件介绍:
CMakeLists.txt:构建文件,用于生成makefile;
prj.conf:配置文件 ;
src/main.c:主函数文件。
通过 CMake 生成 Makefile 文件时,需要通过 BOARD 参数指定目标平台,此处指定为 qemu_x86 平台。如果想在QEMU 上运行示例代码,需要先安装 Ninaja 工具用于编译源码文件:
cd ~/repo
git clone git://github.com/ninja-build/ninja.git && cd ninja
## 生成可执行文件
./configure.py --bootstrap
## 将生成的可执行文件 ninja 拷贝到系统目录(/user/bin)下
sudo cp ninja /user/bin/
安装完成 Ninaja 工具之后可以直接使用 Ninaja 工具生成工程了,以 Zephyr 系统中 hello world
例程为例:
cd $ZEPHYR_BASE/samples/hello_world
##新建一个 build 目录,用于存放临时目录
mkdir -p build && cd build
## 通过 cmake 指令生成 qemu_x86 平台 makefile 文件
cmake -GNinja -DBOARD=qemu_x86 ..
## 编译执行程序
ninja
ninja run
## 可以看到界面打印 hello world 日志
## 退出 qemu 模拟器方式:ctrl-a,然后按 x
9. 在 nRF52832 上运行蓝牙示例程序
接下来,我们在实际板子 nRF52832 上运行 Zephyr 系统的蓝牙心率计例程,例程目录为$ZEPHYR_BASE/samples/bluetooth/peripheral_hr
。通过 Cmake 生成 Makefile 文件时,需要通过 BOARD 参数指定目标平台,此处指定为 nrf52_pca10040 平台。可以使用 Cmake 生成执行文件,也可以使用 Ninja 文件生成可执行文件。
下面是使用 Cmake 工具生成执行文件过程:
cd $ZEPHYR_BASE/samples/bluetooth/peripheral_hr
##新建一个 build 目录,用于存放临时目录
mkdir -p build && cd build
## 通过 cmake 指令生成 nrf52_pca10040 平台 makefile 文件
cmake -DBOARD=nrf52_pca10040 ..
## 配置工程和编译
make menuconfig ## 用于打开 menuconfig 工具配置功能,如开启 shell 功能、修改优化等级等
make ## 编译程序
编译完成在 build 目录下会生成 zephyr 目录,zephyr 目录下有可执行文件(.bin、.elf、.hex 等,这里使用 hex 文件)。本设备使用的可执行文件名为 zephyr.hex
,在 window 系统下获取该文件,使用 nRFgo Studio
工具烧写到 nRF52832 设备上(nRF5x Programming -> program Application -> Browse 选择生成的 zephyr.hex 文件 -> Program 烧写)。
nRFgo Studio 工具使用时如果出现下载不正常或 jlink 使用错误,可以查看 jlink 错误解析 来解决问题。
烧写完成,重启设备,打开手机蓝牙可以搜索到名称为 Zephyr Heartrate Sensor
的蓝牙设备,说明示例程序运行正确。
下面介绍在 window 环境下搭建 Zephyr 系统编译环境,这里使用 cmd.exe
程序构建编译环境,如果使用 PowerShell
可能有所不同,建议查看 Zephyr 官方介绍。
1. 设置环境变量用于下载网络资源
建议先用管理员权限运行 cmd.exe 程序,执行如下操作:
set HTTP_PROXY=http://user:[email protected]:1234
set HTTPS_PROXY=http://user:[email protected]:1234
2. 安装 Chocolatey 软件
使用 cmd 安装:
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
使用 PowerSehll 安装:
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
安装完成之后执行 choco
命令可以查看 Chocolatey 软件版本号信息,说明安装成功。
## 输入 choco
choco
## 显示 Chocolatey 版本号
Chocolatey v0.10.11
Please run 'choco -?' or 'choco -?' for help menu.
3. 安装 Cmake 和其他工具
## 全局关闭确认,避免安装软件是确认
choco feature enable -n allowGlobalConfirmation
## 安装 Cmake 工具
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'
## 安装其他工具 git、python、ninja、dtc-msys2、gperf 等
choco install git python ninja dtc-msys2 gperf
4. 下载 Zephyr 源码程序
这里我下载到 Zephyr 源码到 E:\RT-Thread\
目录下。
cd E:\RT-Thread
git clone https://github.com/zephyrproject-rtos/zephyr
5. 安装 Python 依赖包
pip3 install -r zephyr/scripts/requirements.txt
如果出现如下错误提示:
Using cached https://files.pythonhosted.org/packages/cc/02/a1b500a5a467df64b5d4502072d4850b788065306dbbc8d3e0afc29ce5be/pyocd-0.13.2.tar.gz
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "" , line 1, in <module>
File "C:\Users\ChenYong\AppData\Local\Temp\pip-install-bu__14uj\pyocd\setup.py", line 31, in <module>
long_description=open('README.md', 'r').read(),
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 5960: illegal multibyte sequence
原因是命令行工具的标准输出流编码不对,我们可以将 Zephyr 系统中安装 scripts/requirements.txt
文件中的 pyocd 工具的安装屏蔽掉,后面的编译没有使用该软件。
## requirements.txt 文件中屏蔽 pyocd 软件安装
.....
# pyocd
....
之后再自行上面安装 python 依赖包命令,可正常执行。
6. 安装第三方编译工具
这里安装的是 GNU ARM 编译工具(Zephyr官网还有其他第三方编译工具,根据实际需求下载安装)。
工具下载地址:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads ,根据自己系统配置下载安装 GNU ARM 编译工具, 安装路径建议为 C:\gnu_arm_embedded
安装完成设置环境变量,如下所示:
set ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb
set GNUARMEMB_TOOLCHAIN_PATH=C:\gnu_arm_embedded
7. 编译运行例程
cd zephyr
## 设置编译环境参数
zephyr-env.cmd
## 进入示例文件,这里使用蓝牙心率计示例
cd samples\bluetooth\peripheral_hr
mkdir build & cd build
## 使用 Cmake 配置基于 Ninja 搭建编译环境,window 下必须基于 Ninja 搭建
cmake -GNinja -DBOARD=nrf52_pca10040 ..
## 可以选着使用 menuconfig 配置工程,可以配置优化等级
ninja menuconfig
ninja
代码烧写方式:
编译之后生成可执行文件(这里使用 hex 文件),可按照上述 Linux 介绍方式烧写程序。
使用 jlink 工具将直接将生成的文件(这里使用的 elf 文件)烧写到 nRF52832 设备中,操作步骤如下:
download.jlink
,文件内容如下:erase
loadfile zephyr.hex
r
q
download.jlink
文件放入生成可执行文件(elf 文件)的目录,本次例程为需要放入 zephyr/sample/bluetooth/peripheral_hr/build/zephyr/
目录下;C:\Soft\SEGGER\JLink_V510\JLink.exe
; ## jlink.exe 工具按照实际安装路径修改
C:\Soft\SEGGER\JLink_V510h\JLink.exe -autoconnect 1 -device NRF52832_XXAA -if swd -speed 10000 -commandfile download.jlink