第一章:Zephyr与蓝牙概览
各位同学好,我是你们这门课的老张。做嵌入式蓝牙开发十几年了,从早期的单片机裸机跑协议栈,到后来用FreeRTOS,再到现在深度使用Zephyr,这条路走得不算快,但每一步都踩过坑。今天咱们先聊聊Zephyr RTOS和它的蓝牙协议栈,把环境搭起来。
1.1 Zephyr RTOS简介
Zephyr是什么?说白了,它是一个为资源受限设备设计的实时操作系统。跟Linux那种庞然大物不同,Zephyr可以跑在只有几十KB RAM的芯片上。我最早接触它是在2018年,当时一个项目需要同时支持BLE和Wi-Fi,还要低功耗,Zephyr的蓝牙协议栈让我眼前一亮。
Zephyr有几个核心特点:
- 模块化设计:你想用啥功能就加啥模块,不像某些RTOS那样一锅端
- 丰富的协议栈:蓝牙、Wi-Fi、Thread、Zigbee,全都有
- 跨平台:支持ARM、RISC-V、x86等多种架构
- Linux-like开发体验:用Kconfig配置,用CMake构建,熟悉Linux的同学上手很快
我个人习惯:选RTOS时,先看它的蓝牙协议栈是否成熟。Zephyr的蓝牙协议栈是直接从Linux BlueZ移植过来的,经过大量验证,稳定性有保障。
1.2 蓝牙协议栈架构
Zephyr的蓝牙协议栈,我把它分成三层来看:
| 层级 | 名称 | 作用 |
|---|---|---|
| 上层 | Host层 | GAP、GATT、L2CAP、SMP等协议实现 |
| 中间 | HCI层 | Host和Controller之间的通信接口 |
| 底层 | Controller层 | 物理层、链路层,通常由芯片厂商提供 |
嗯,这里要注意:Zephyr支持两种模式——
- 单芯片模式:Host和Controller都在同一个芯片上跑
- 双芯片模式:Host跑在主控MCU上,Controller跑在蓝牙芯片上,通过UART或USB通信
我在项目中遇到过一个问题:用双芯片模式时,HCI的波特率设置不对,导致蓝牙连接断断续续。后来发现是UART的流控没开。你想想看,这种问题查起来多费劲?所以建议新手先用单芯片模式,少踩一个坑。
1.3 开发环境搭建
搭建环境是第一步,也是很多人卡住的地方。我尽量把步骤说清楚。
1.3.1 安装West工具
West是Zephyr的元构建工具,说白了就是帮你管理代码和构建的。安装很简单:
# 安装west
pip3 install west
# 验证安装
west --version
小提示:如果你在Windows上,建议用WSL2或者Git Bash。我试过在原生Windows cmd下跑west,各种路径问题,后来老老实实换了WSL2。
1.3.2 获取Zephyr源码
用west初始化工作区:
# 创建工作区目录
mkdir zephyr_project
cd zephyr_project
# 初始化
west init
# 下载所有模块
west update
这个过程会下载Zephyr主仓库和所有子模块,大概1-2GB。网速慢的话,建议找个好点的网络环境。我记得第一次下载时等了快一个小时,中间还断了一次,气得我差点砸电脑。
1.3.3 安装SDK和工具链
Zephyr SDK包含了交叉编译工具链、调试工具等。安装步骤:
# 下载SDK安装脚本
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.3/zephyr-sdk-0.16.3_linux-x86_64.tar.xz
# 解压
tar xf zephyr-sdk-0.16.3_linux-x86_64.tar.xz
# 运行安装脚本
cd zephyr-sdk-0.16.3
./setup.sh
避坑指南:我曾经在Ubuntu 20.04上安装SDK时,发现缺少libncurses5库,导致编译报错。解决办法:sudo apt install libncurses5。不同Linux发行版可能缺不同的库,遇到问题先看错误信息。
1.3.4 配置环境变量
把以下内容加到你的~/.bashrc或~/.zshrc里:
export ZEPHYR_BASE=/path/to/zephyr_project/zephyr
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
export ZEPHYR_SDK_INSTALL_DIR=/path/to/zephyr-sdk-0.16.3
然后执行source ~/.bashrc使其生效。
1.3.5 验证环境
编译一个最简单的示例来验证:
cd $ZEPHYR_BASE
west build -b nrf52840dk_nrf52840 samples/bluetooth/beacon
如果编译成功,你会看到类似这样的输出:
-- west build: generating a build system
-- west build: building
[0/1] Linking C executable zephyr/zephyr.elf
看到这个,恭喜你,环境搭好了!
1.4 本章小结
这一章我们聊了Zephyr RTOS的特点、蓝牙协议栈的架构,以及如何搭建开发环境。说白了,就是为后面的实战打好基础。下一章我们会真正开始写蓝牙代码,从最简单的BLE Beacon开始。
嗯,最后说一句:环境搭建遇到问题很正常,别灰心。我当年第一次搭Zephyr环境,折腾了整整两天。现在回想起来,那些坑都成了宝贵的经验。你遇到的问题,大概率别人也遇到过,善用搜索引擎和Zephyr的Discord社区。
下章预告:第二章「BLE Beacon实战」—— 从零开始写一个蓝牙广播程序,让你的设备被手机扫描到。