- 操作系统
- 嵌入式
- 嵌入式OS
【免费下载链接】tock
A secure embedded operating system for microcontrollers
本文以 Tock 仓库中 boards/wm1110dev/README.md 为核心,系统讲解 Wio WM1110 开发板的硬件构成、Tock 内核移植要点,以及如何借助 Tock Bootloader 与 nRF52840dk 完成烧录和日常编程。读完本文,你将掌握 WM1110 的完整刷机链路(跳线连接 → 烧录 Bootloader → tockloader 刷内核与 App),并理解该板在内核源码中的引脚分配、内存布局与驱动注册方式。
一、Wio WM1110 开发板是什么
Wio WM1110 Development Board 是 Seeed Studio 推出的一款多模无线定位开发板,定位是LoRa 与位置服务(location services)应用。它基于 Nordic nRF52840 SoC,并集成了 Semtech LR1110 射频前端芯片,属于 Tock 官方支持的板级平台之一,对应内核入口为 boards/wm1110dev/src/main.rs。
从硬件构成上看,这块板集成了三类关键器件:
| 器件 | 类型 | 用途 |
|---|---|---|
| LIS3DHTR | 3 轴加速度计 | 运动检测、姿态感知 |
| SHT41 | 温湿度传感器 | 环境温湿度采集 |
| Semtech LR1110 | 多模射频前端 | LoRaWAN、GNSS(GPS 定位)、WiFi AP 扫描 |
其中 LR1110 是这块板的核心卖点:它通过一颗芯片同时支持 LoRaWAN 长距离通信、GNSS 卫星定位与 WiFi AP 扫描辅助定位,配合 nRF52840 的 Cortex-M4F 主控与丰富外设,天然适合做资产追踪、环境监测等低功耗物联网场景。
1.1 源码中的板级资源确认
在 boards/wm1110dev/src/main.rs 中,可以看到 Tock 为这块板注册的完整驱动集合。Platform结构体(main.rs#L118-L132)与SyscallDriverLookup实现(main.rs#L134-L156)把以下能力暴露给用户态进程:
- console(串口控制台,
capsules_core::console::DRIVER_NUM) - gpio(通用 IO,引脚 D2~D7)
- alarm(定时器/闹钟)
- led(三色 LED 中的绿、红两路)
- rng(真随机数,基于 nRF52840 TRNG)
- nonvolatile_storage(非易失存储驱动)
- temperature / humidity(基于 SHT41 的温湿度驱动)
- LoRa SPI 驱动(
LoRaPhySPI)与LoRa GPIO 驱动(LoRaPhyGPIO),分别对应 capsules/core/src/driver.rs#L44-L45 中定义的系统调用号0x30003与0x30004 - IPC(进程间通信)
这些驱动号与 doc/syscalls 目录下的系统调用文档一一对应,读者可以结合 doc/syscalls/README.md 查看每个驱动的用户态接口。
二、准备工作:环境与前置条件
2.1 安装 Tock 工具链
在开始任何烧录工作之前,请先按照 Tock 官方的 Getting Started 指南 完成环境搭建。核心依赖包括:
- Rust(nightly 版本,仓库的 rust-toolchain.toml 会固定具体日期版本,构建系统会自动校验并安装对应 nightly);
- rustup(版本 ≥ 1.23.0),用于管理多个 Rust 工具链;
- 宿主机工具链(gcc、glibc);
- make、find 等命令行工具。
快速安装(以 Ubuntu 为例):
$ sudo apt install -y build-essential python3-pip curl $ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh $ pipx install tockloader $ pipx ensurepath其中tockloader是 Tock 生态的烧录与 App 管理工具,稍后刷内核、装应用都靠它。
2.2 两种烧录路径的取舍
WM1110 开发板在设计上默认使用外部 JLink 编程器进行烧录。Tock 团队希望摆脱这个依赖,因此选择使用Tock Bootloader:它允许通过 UART 串口直接烧录内核与应用,日常开发不再需要 JLink。不过有两点需要明确:
- Bootloader 本身仍需借助 JLink 编程器烧录一次(一次性操作);
- 之后的内核、应用烧录全部走 Bootloader + tockloader,无需再碰 JLink。
最简单的 JLink 来源就是一块现成的nRF52840dk开发板——它板载 J-Link OB 调试器,可以直接充当外部编程器。
三、把 nRF52840dk 连接到 WM1110-dev
3.1 跳线连接图
在烧录 Bootloader 之前,先用杜邦线(跳线)把 nRF52840dk 与 WM1110-dev 连起来。官方连接示意图如下:
图中展示了四组点对点跳线连接,把 nRF52840dk 板载的 J-Link 调试排针信号引到 WM1110-dev 上。
3.2 引脚映射表
对应 README 中的官方引脚映射如下:
| nRF52840dk | WM1110-dev |
|---|---|
| GND | GND |
| SWD SEL | 3V3 |
| SWD CLK | CLK |
| SWD IO | DIO |
连接完成后的正确姿势是:nRF52840dk 与 WM1110-dev 两块板各自通过一条 USB 线连接到电脑(共两条 USB 线)。
只有一条 USB 线怎么办?官方给出的替代方案:把唯一的 USB 线插在 nRF52840dk 上,然后额外跳两根线:
3V3 (wm1110dev) <-> VDD (nrf)SWD SEL (nrf) <-> VDD (nrf)其余跳线保持不变。这样由 nRF52840dk 的 USB 同时为两块板供电,并通过 VDD 回灌点亮 WM1110 的调试链路。
3.3 底层原理:SWD 调试链路
理解这几根线的作用,能帮你排查连接问题:
- SWD SEL / 3V3:SWD SEL 是 SWD 调试使能信号,拉高到 3.3V 后 WM1110 的 SWD 调试接口才会被激活,J-Link 才能访问目标芯片;
- SWD CLK / CLK:SWD 时钟线,由 J-Link 驱动;
- SWD IO / DIO:SWD 双向数据线,承载调试协议的数据收发;
- GND / GND:共地,所有信号都必须以它为参考。
nRF52840dk 板载的 J-Link OB 正是通过这四根线以标准 SWD 协议与 WM1110 的 nRF52840 芯片通信。
四、一次性烧录 Tock Bootloader
4.1 执行烧录命令
跳线接好、两块板都通电之后,进入 WM1110 的板级目录执行:
$ cd boards/wm1110dev $ make flash-bootloader这条命令会调用JLinkExe,借助 nRF52840dk 板载的 JTag 硬件把 Bootloader 写入 WM1110。整个操作对 JLinkExe 的依赖体现在 Makefile 的flash-bootloader目标中(boards/wm1110dev/Makefile#L22-L26):
.PHONY: flash-bootloader flash-bootloader: curl -L --output /tmp/wm1110_dev-bootloader_v1.1.3.bin https://github.com/tock/tock-bootloader/releases/download/v1.1.3/wm1110_dev-bootloader_v1.1.3.bin tockloader flash --address 0 /tmp/wm1110_dev-bootloader_v1.1.3.bin rm /tmp/wm1110_dev-bootloader_v1.1.3.bin从源码可以拆解出这条目标实际做了三件事:
- 用
curl从 Tock Bootloader 的 release 页面下载 WM1110 专用的 Bootloader 镜像(版本 v1.1.3),临时存放在/tmp/wm1110_dev-bootloader_v1.1.3.bin; - 用
tockloader flash --address 0把它烧录到芯片地址 0(即 Flash 起始位置); - 烧录完成后删除临时文件。
需要强调的是:此时 nRF52840dk 必须已连接且其 J-Link 可被 JLinkExe 识别。若JLinkExe尚未安装,请参考 doc/Getting_Started.md 中的 Programming Adapter 一节,安装 "J-Link Software and Documentation Pack"(版本 ≥ 5.0)。
4.2 为什么 Bootloader 要放在地址 0
查看 WM1110 的链接脚本 boards/wm1110dev/layout.ld 可以更清楚地理解这个设计:
MEMORY { rom (rx) : ORIGIN = 0x00010000, LENGTH = 256K prog (rx) : ORIGIN = 0x00050000, LENGTH = 704K-16K ram (rwx) : ORIGIN = 0x20000000, LENGTH = 256K }- rom 段从
0x10000(64KB 偏移)开始——这正是给 Tock Bootloader 预留的 64KB 空间,Bootloader 常驻0x00000 ~ 0x0FFFF; - Tock 内核(rom 段)起始于
0x10000,长度 256KB; - 应用区(prog 段)起始于
0x50000,长度 704K−16K,末尾保留 16KB 给非易失存储。
与之呼应,WM1110 的program目标把内核烧录到--address 0x10000(boards/wm1110dev/Makefile#L18-L20):
.PHONY: program program: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).bin tockloader flash --address 0x10000 $<也就是说,Flash 的布局为:Bootloader(0x0)→ 内核(0x10000)→ 应用(0x50000 起)。这也是flash-bootloader必须烧在--address 0的原因。
4.3 用户态非易失存储
nrf52840 芯片的 main.rs#L489-L501 中,NonvolatileStorageComponent把 Flash 末尾区域开放给用户态进程使用:起始地址0xFC000、长度 16 个页(每页 4KB,共 64KB),内核自身不占用这部分("No kernel access")。这与 layout.ld 中 prog 段704K-16K的预留完全一致,App 可以在系统调用层访问这块区域做持久化存储。
五、Bootloader 的激活与日常使用
5.1 如何进入 Bootloader 模式
Bootloader 烧录完成后,日常烧录不再需要 JLink。它的激活方式是硬件操作:
快速连续按下两次复位(Reset)按钮,Bootloader 即被激活;激活后绿色 LED 常亮作为指示。
一旦绿灯常亮,说明设备已进入 Bootloader 模式,等待主机通过 UART 接收固件。这个绿灯正是 main.rs#L32-L33 中定义的LED_GREEN_PIN(P0_13),它和红色 LED(P0_14)共同组成三色 LED 中由 Tock 内核驱动的两路:
// Three-color LED. const LED_RED_PIN: Pin = Pin::P0_14; const LED_GREEN_PIN: Pin = Pin::P0_13;另外,板上的复位按键对应BUTTON_RST_PIN(P0_18),由NrfStartupComponent接管(main.rs#L240-L246)。在 boards/wm1110dev/src/main.rs 中,这两个 LED 以LedHigh方式注册进LedsComponent,用户态可通过 LED 驱动系统调用点灭它们;同时它们也被注册为内核调试 GPIO(debug_gpio!宏可用)。
5.2 Bootloader 就位后,tockloader 即可正常工作
进入 Bootloader 模式后,tockloader 会像在其他支持 Bootloader 的 Tock 板卡上一样正常工作。这意味着你可以:
- 编译并烧录内核:在 boards/wm1110dev 目录下执行
make install(等价于make program),tockloader 会把编译产物target/thumbv7em-none-eabihf/release/wm1110dev.bin通过 UART 烧到0x10000; - 安装示例应用:例如
tockloader install blink,应用会被烧入应用区并自动启动; - 管理应用:
tockloader list查看已装应用、tockloader erase-apps清空应用区、tockloader uninstall卸载指定应用等。
编译内核的通用目标与其他板卡一致(boards/Makefile.common 与 doc/Getting_Started.md 均有说明):
| 目标 | 作用 |
|---|---|
make(默认 all) | 编译 release 版内核 |
make debug | 编译带调试信息的版本 |
make doc | 生成该板的 Rust 文档 |
make clean | 清理构建产物 |
make install | 通过 tockloader 烧录内核到板子 |
make flash-bootloader | 一次性烧录 Tock Bootloader(需 JLink) |
若在
make install时指定串口,可通过make install PORT=/dev/ttyUSB0传入(Makefile 中PORT变量会转成tockloader --port <port>参数)。
六、WM1110 板级源码导读(可选深入)
如果读者想进一步理解这块板在 Tock 中的实现,以下几个文件值得精读:
- boards/wm1110dev/src/main.rs:板级入口。定义了全部引脚常量(main.rs#L32-L62):
- UART:TX=P0_24、RX=P0_22(
UART_TX_PIN/UART_RX_PIN),用于 console 与调试输出,波特率 115200; - I2C:SDA=P0_27、SCL=P0_26,挂载 SHT41;另有
I2C_PWR(P0_07)作为 I2C 总线与传感器的电源开关,启动时由内核拉高供电(main.rs#L361-L363); - SPI:SCK=P1_13、MOSI=P1_14、MISO=P1_15、CS=P1_12,连接 LR1110;
- LR1110 控制脚:BUSY=P1_11、RESET=P1_10、DIO9=P1_08,通过
LoRaPhyGPIO(0x30004)暴露给用户态; - GPIO D2~D7 分别映射 P0_17/P0_16/P0_15/P1_09/P1_04/P1_03。
- UART:TX=P0_24、RX=P0_22(
- boards/wm1110dev/src/io.rs:panic 处理。内核崩溃时点亮红色 LED(P0_14)并通过 UART(115200、8N1)打印调试信息;
- boards/wm1110dev/Makefile:烧录相关全部目标;
- boards/wm1110dev/layout.ld:内存布局,Bootloader/内核/应用/存储分区一目了然;
- boards/wm1110dev/Cargo.toml:板级 crate 依赖,主要引入
cortexm4、kernel、nrf52、nrf52840、components、capsules-core/capsules-extra/capsules-system等。
七、小结:完整上手指南
把整个流程串起来,WM1110 从零到跑起 Tock 的完整路径是:
- 装环境:Rust nightly + rustup + tockloader(参考 doc/Getting_Started.md);
- 接线:按引脚映射表把 nRF52840dk 与 WM1110-dev 用跳线连好,两块板各接一条 USB;
- 烧 Bootloader(一次性):在
boards/wm1110dev下执行make flash-bootloader,借助 nRF52840dk 的 J-Link 完成; - 进入 Bootloader 模式:快速双击复位键,绿灯常亮即成功;
- 日常烧录:
make install烧内核,tockloader install blink装应用,从此无需 JLink。
这套 "JLink 只用来烧一次 Bootloader,之后全走 UART" 的方案,是 WM1110 这类无板载调试器板卡的典型 Tock 部署模式,也让该板成为 LoRaWAN/GNSS 场景下体验 Tock 的安全嵌入式开发流程的低门槛选择。
- 操作系统
- 嵌入式
- 嵌入式OS
【免费下载链接】tock
A secure embedded operating system for microcontrollers
相关推荐
在 Zephyr 上开发 Wio-WM1110 Dev Kit:基于 nRF52840 与 Semtech LR1110 的 LoRa/GNSS 开发板实战指南
在 Zephyr 上开发 Wio WM1110 Dev Kit:基于 nRF52840 与 Semtech LR1110 的 LoRa/GNSS 开发板实战指南
操作系统嵌入式RTOS物联网ESP IoT Solution BLE TX Power Service(esp_tps)组件使用指南:从服务注册到发射功率上报的完整实践
ESP IoT Solution BLE TX Power Service(esp_tps)组件使用指南:从服务注册到发射功率上报的完整实践 本文面向在 ESP
操作系统嵌入式嵌入式OS使用 Terraform AWS Provider 的 `aws_outposts_sites` 数据源批量发现 Outposts Site
使用 Terraform AWS Provider 的 aws_outposts_sites 数据源批量发现 Outposts Site aws_outpost
操作系统嵌入式嵌入式OS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考