3. SDK环境搭建与编译:从下载到跑通第一个灯
说实话,很多初学者卡在环境搭建这一步。不是代码多难,而是工具链没配好,编译报错都看不懂。今天我就带你一步步走通这个流程。我自己的习惯是,拿到一个新SDK,先不看文档,直接找个example编译试试——能跑起来再说别的。
3.1 SDK下载与目录结构
先说说SDK去哪下。以Telink的B91 Mesh SDK为例,你可以在官方GitHub仓库或者开发者门户找到。下载后解压,你会看到这样的目录结构:
telink_b91_mesh_sdk/
├── bootloader/ # 引导程序
├── drivers/ # 底层驱动
│ ├── 8258/ # 芯片相关
│ └── common/ # 通用驱动
├── stack/ # 协议栈
│ ├── ble/ # BLE核心
│ └── mesh/ # Mesh协议
├── apps/ # 应用示例
│ ├── switch/ # 开关节点
│ ├── light/ # 灯节点
│ └── gateway/ # 网关
├── tools/ # 工具链脚本
├── proj/ # 工程配置
└── Makefile # 顶层编译入口
嗯,这里要注意:apps目录是你最常打交道的地方。每个子目录就是一个独立的应用工程。我刚开始接触时,总喜欢在根目录下乱改,后来发现——每个app都有自己的Makefile,改根目录没用。
核心原则:不要修改SDK核心代码。你的业务逻辑写在apps目录下,驱动和协议栈尽量不动。这样SDK升级时,你只需要替换根目录,不用重写应用。
3.2 工具链安装
工具链说白了就是编译器+链接器+调试器。Mesh开发主要用RISC-V或ARM工具链,取决于芯片。我以RISC-V为例,因为B91就是RISC-V内核。
3.2.1 下载工具链
去T-Head或者SiFive官网下载RISC-V GCC工具链。Windows用户选.exe安装包,Linux用户选.tar.bz2。我个人建议用Linux,命令行操作更顺手。
3.2.2 配置环境变量
安装完后,把工具链的bin目录加到PATH里。Linux下这样配:
export PATH=$PATH:/opt/riscv/bin
export RISCV_PATH=/opt/riscv
记得写到~/.bashrc里,不然每次开终端都要重新export。我曾经犯过这个错——编译时报错"找不到riscv32-unknown-elf-gcc",折腾了半天才发现是环境变量没生效。
小技巧:配完后执行 riscv32-unknown-elf-gcc --version,如果能显示版本号,说明工具链装好了。如果报错,检查路径对不对,或者是不是下载了32位版本。
3.2.3 安装烧录工具
烧录工具各家不一样。Telink用BDT(Burning and Debugging Tool),下载后解压就能用。Linux下可能需要装USB驱动:
sudo cp 99-telink.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
插上开发板,执行lsusb,看到Telink设备就对了。
3.3 第一个示例工程编译
好,环境配好了,我们来编译第一个工程。选最简单的light_switch示例,它实现了一个开关控制灯的Mesh节点。
3.3.1 进入工程目录
cd telink_b91_mesh_sdk/apps/light_switch
3.3.2 执行编译
make clean
make
第一次编译会下载一些依赖,大概1-2分钟。如果一切顺利,你会看到:
Build complete: light_switch.bin
生成的.bin文件在build/目录下。这就是我们要烧录的固件。
常见报错:
make: command not found—— 没装make,sudo apt install build-essentialriscv32-unknown-elf-gcc: No such file or directory—— 工具链路径没配好undefined reference to 'mesh_init'—— SDK版本不匹配,检查stack目录
3.4 烧录与日志查看
编译通过只是第一步。烧录到开发板上,看到灯亮起来,才算真正跑通。
3.4.1 烧录固件
打开BDT工具,选择芯片型号(B91),加载light_switch.bin。点击"Connect",然后"Erase"+"Write"。烧录过程大概10秒。
烧录完成后,按一下开发板的复位键。如果一切正常,板子上的LED会闪烁——说明程序在跑了。
3.4.2 查看日志
Mesh调试离不开日志。B91默认用UART输出日志,波特率115200。用串口工具(比如PuTTY、screen)连接:
screen /dev/ttyUSB0 115200
你会看到类似这样的输出:
[INFO] Mesh stack initialized
[INFO] Node address: 0x0001
[INFO] Provisioning started...
[INFO] Provisioning success!
[INFO] Light state: ON
嗯,看到"Provisioning success"就说明Mesh网络配网成功了。如果卡在"Provisioning started...",检查一下手机APP或者另一个节点有没有在广播。
日志分级:SDK支持LOG_LEVEL宏,可以控制输出级别。调试时设成LOG_LEVEL_DEBUG,正式发布时改成LOG_LEVEL_INFO或LOG_LEVEL_ERROR,减少日志对性能的影响。
3.5 整体流程回顾
为了让你更直观地理解整个流程,我画了一张图:
这张图把整个流程串起来了。你从SDK下载开始,到工具链安装,再到编译、烧录、日志查看,每一步都有明确的输入输出。我建议你按照这个顺序走一遍,不要跳步。
3.6 常见问题与避坑
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 编译报错"找不到头文件" | SDK路径没配对 | 检查Makefile中的SDK_ROOT路径 |
| 烧录后板子没反应 | Bootloader被擦除 | 重新烧录bootloader分区 |
| 串口输出乱码 | 波特率不匹配 | 确认SDK中UART配置为115200 |
| 日志只输出"Mesh stack initialized" | 配网超时 | 检查手机APP是否在广播 |
我曾经踩过的坑:有一次我烧录了light_switch固件,但灯死活不亮。查了半天,发现是板子上的跳线帽没插对——GPIO没有连接到LED。所以,硬件连接一定要先确认。别像我一样,软件调了半天,结果是硬件问题。