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-essential
  • riscv32-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环境搭建与编译流程 SDK下载与解压 工具链安装配置 make编译工程 BDT烧录固件 串口日志调试 关键检查点 ① 工具链版本匹配 ② 环境变量生效 ③ 烧录前擦除Flash ④ 日志波特率一致

这张图把整个流程串起来了。你从SDK下载开始,到工具链安装,再到编译、烧录、日志查看,每一步都有明确的输入输出。我建议你按照这个顺序走一遍,不要跳步。

3.6 常见问题与避坑

问题 原因 解决方案
编译报错"找不到头文件" SDK路径没配对 检查Makefile中的SDK_ROOT路径
烧录后板子没反应 Bootloader被擦除 重新烧录bootloader分区
串口输出乱码 波特率不匹配 确认SDK中UART配置为115200
日志只输出"Mesh stack initialized" 配网超时 检查手机APP是否在广播

我曾经踩过的坑:有一次我烧录了light_switch固件,但灯死活不亮。查了半天,发现是板子上的跳线帽没插对——GPIO没有连接到LED。所以,硬件连接一定要先确认。别像我一样,软件调了半天,结果是硬件问题。