操作系统嵌入式嵌入式OS【免费下载链接】tockA secure embedded operating system for microcontrollers项目地址https://gitcode.com/gh_mirrors/to/tock点击查看免费下载本指南面向希望把 Tock面向微控制器的安全嵌入式操作系统部署到 Arduino Nano RP2040 Connect 开发板的开发者完整覆盖从工具链准备、ELF 转 UF2、BOOTSEL 模式进入、内核与应用烧录到串口调试的完整流程并深入解析该板卡的 RP2040Cortex-M0启动细节、时钟初始化与板级驱动实现。读完本文你将能够独立完成 Tock 内核的构建、烧录与调试并理解其底层原理。板卡与项目概览Arduino Nano RP2040 Connect 是基于树莓派基金会 RP2040 芯片的 Arduino Nano 外形开发板。在 Tock 仓库中该板卡对应的支持位于 boards/nano_rp2040_connect 目录其中包含src/main.rs板级内核入口完成外设初始化、驱动装配与内核启动src/io.rspanic 时的调试输出UART0src/flash_bootloader.rsRP2040 从 Flash 启动所需的 256 字节引导头Makefile构建与烧录目标layout.ld内存布局与链接脚本openocd.cfgOpenOCD 调试配置。从 boards/README.md 的板卡列表可以看出Nano RP2040 Connect 使用 ARM Cortex-M0 架构、RP2040 芯片其烧录方式为custom即依赖板载 UF2 引导加载程序而非 tockloader/JLink/OpenOCD 等通用工具。准备构建环境在编译任何 Tock 板卡之前请先阅读并遵循 Tock 入门指南。核心准备工作包括安装 Rust 与 rustuprustup 版本需 1.23.0$ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh安装指定的 nightly 工具链Tock 当前使用nightly-2026-07-21见仓库根目录 rust-toolchain.toml$ rustup install nightly-2026-07-21由于 rust-toolchain.toml 的存在在仓库内执行cargo/make时 rustup 会自动切换到该版本。主机工具链gcc、glibc以及命令行工具 make、find。安装交叉编译目标Nano RP2040 Connect 面向thumbv6m-none-eabiCortex-M0。该目标已包含在 rust-toolchain.toml 的targets列表中若缺失可手动执行rustup target add thumbv6m-none-eabi。构建内核时进入板卡目录执行make默认目标all即 release 构建即可产物位于target/thumbv6m-none-eabi/release/下。板卡共用的构建目标all、debug、doc、clean、install定义于 boards/Makefile.common其中install在各板卡的 Makefile 中具体实现。安装 elf2uf2-rs连接 ELF 与 UF2 的桥梁Nano RP2040 Connect 的板载引导加载程序只接受UF2 格式的文件将文件复制到其挂载出的 U 盘即完成烧录而 Tock 编译产物是 ELF 文件因此需要一个转换工具$ cargo install elf2uf2-rself2uf2-rs负责把 Tock 生成的 ELF 打包成 UF2 文件。这一转换动作被封装在板卡 Makefile 的flash目标中flash: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).elf elf2uf2-rs $ $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).uf2 if [ -d $(BOOTSEL_FOLDER) ]; then cp $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).uf2 $(BOOTSEL_FOLDER); else echo; echo Please edit the BOOTSEL_FOLDER variable to point to you Nano RP2040 Flash Drive Folder; fi从 Makefile.common 可知PLATFORM即板卡包名nano_rp2040_connectTARGET为thumbv6m-none-eabi因此生成物为target/thumbv6m-none-eabi/release/nano_rp2040_connect.uf2随后会被复制到 BOOTSEL 挂载点。进入 BOOTSEL 模式要将 UF2 复制到板卡必须先让 RP2040 进入BOOTSEL 模式此时芯片会挂载出一个 USB 闪存盘。官方文档称双击板载按钮可进入该模式但实测这一方式仅在运行 Arduino 原始软件时有效。如果双击按钮没有挂载出闪存盘可以使用跳线强制进入 BOOTSEL 模式步骤如下断开板卡与 USB 的连接用跳线连接GND引脚与REC引脚重新将板卡连接至 USB等待闪存盘挂载断开板卡与 USB 的连接这一步非常重要然后重新连接确保后续烧录前板卡处于正常上电状态。进入 BOOTSEL 模式后系统会自动挂载一个名为RP2040或RPI-RP2取决于引导加载程序版本的 U 盘。烧录 Tock 内核进入 BOOTSEL 模式后在boards/nano_rp2040_connect目录下执行$ make flash或使用调试版本$ make flash-debug注意Makefile 提供了BOOTSEL_FOLDER变量用于指向 Nano RP2040 闪存盘的挂载点。默认位置为/media/$(USER)/RP2040不同系统上可能不同请务必按实际环境调整。例如$ BOOTSEL_FOLDER/run/media/$(USER)/RPI-RP2 make flashflash目标先将 ELF 转换为 UF2再将 UF2 复制到$(BOOTSEL_FOLDER)若该目录不存在Makefile 会打印提示要求修改BOOTSEL_FOLDER。此外板卡还提供了基于 OpenOCD 的烧录路径flash-openocd在 Makefile 中通过openocd.cfg引用raspberrypi-swd.cfg与rp2040.cfg适合使用 SWD 调试探针的用户。RP2040 的 Flash 启动跳转引导头make flash产出的内核之所以能直接从 Flash 启动依赖 layout.ld 与 flash_bootloader.rs 的配合layout.ld 将.text起始处固定为rom (rx) : ORIGIN 0x10000000, LENGTH 256K并强制保留.flash_bootloader段、按 256 字节对齐——这正是 RP2040 Bootrom 要求的填充并签名的二级引导加载程序second stage bootloader布局main.rs 中通过#[cfg_attr(target_os none, link_section .flash_bootloader)]将 256 字节的FLASH_BOOTLOADER数组放置到该段链接脚本的ENTRY(jump_to_bootloader)将入口点设为 main.rs 中的裸函数jump_to_bootloader()它以内联汇编将 RP2040 复位回 Bootrom写入0xe000ed08复位向量表载入 MSP 后bx r2跳转从而让完整的 Bootrom 启动流程接管保证从 Flash 正确引导。从源码结构看该引导头对应树莓派 pico-sdk 中boot2_at25sf128a.S经pad_checksum处理后的产物Tock 将其以字节数组形式直接内置见 flash_bootloader.rs 顶部注释。烧录应用程序Tock 应用程序在仓库外独立构建参见 Tock 入门指南 中的应用部分。构建出应用的 TBFTock Binary Format文件后先让板卡进入 BOOTSEL 模式再在板卡目录执行$ APPpath to apps tbf file make flash-appflash-app目标见 Makefile的完整流程是flash-app: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).bin ifeq ($(APP),) $(error Please define the APP variable with the TBF file to flash an application) endif arm-none-eabi-objcopy --set-section-flags .appsLOAD,ALLOC $(KERNEL) $(KERNEL_WITH_APP) arm-none-eabi-objcopy --update-section .apps$(APP) $(KERNEL_WITH_APP) elf2uf2-rs $(KERNEL_WITH_APP) $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM)-app.uf2 if [ -d $(BOOTSEL_FOLDER) ]; then cp $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM)-app.uf2 $(BOOTSEL_FOLDER); ...; fi即使用objcopy将 TBF 应用写入内核 ELF 的.apps段生成nano_rp2040_connect-app.elf再整体转换为nano_rp2040_connect-app.uf2并复制到 BOOTSEL 挂载点。若未定义APP变量Makefile 会直接报错提示。串口接口与调试输出Tock 在 Nano RP2040 Connect 上尚未支持 USB串口控制台使用UART0因此需要一块USB TTL 适配器才能与板卡通信。UART 引脚与参数从 main.rs 可以看到UART0 的 TX 使用GPIO0RX 使用GPIO1代码中通过set_function(GpioFunction::UART)将这两个引脚配置为 UART 复用功能串口参数为115200波特率、8 数据位、无校验、1 停止位见 io.rs 中 panic 输出的默认配置Parameters { baud_rate: 115200, width: Width::Eight, parity: Parity::None, stop_bits: StopBits::One, hw_flow_control: false }。内核调试输出与 panic 处理正常情况下内核的debug!()输出经由 main.rs 中创建的DebugWriterComponent发送到 UART当内核 panic 时io.rs 的panic_fmt处理器会点亮板载 LEDGPIO25LedHigh并通过debug::panic_old将崩溃信息输出到 UART0若常规 UART 尚未配置它会即时创建 UART0 实例并完成引脚与参数配置后再输出确保即使早期初始化失败也能打印 panic 信息。此外main.rs 还装配了ProcessConsoleComponent进程控制台允许通过串口交互式地列出、启动与停止用户进程这也是排查应用问题时的重要入口。板载驱动与时钟初始化源码视角为帮助你在该板卡上进一步开发这里补充 main.rs 中体现的板级资源装配情况。系统时钟init_clocks()从 12 MHz 外部晶振XOSC出发配置了完整的时钟树与 pico-sdk 一致时钟来源频率PLL SYS12 MHz / 1 × 125后分频 6 / 2125 MHzPLL USB12 MHz / 1 × 40后分频 5 / 248 MHzCLK_REFXOSC12 MHz/ 112 MHzCLK_SYSPLL SYS / 1125 MHzCLK_USB / CLK_ADCPLL USB / 148 MHzCLK_RTCPLL USB / 102446875 HzCLK_PERICLK_SYS125 MHz对应 SysTick 校准值在 main.rs 末尾以SysTick::new_with_calibration(125_000_000)体现。可用的用户态驱动NanoRP2040Connect通过SyscallDriverLookup暴露的驱动包括consoleUART 控制台、alarm基于RPTimer的虚拟闹钟、gpioGPIO2/3/5/8~11/14~24 等引脚、ledGPIO6LedHigh、adcADC0~ADC3 四个通道、temperature板载 RP2040 温度传感器经 ADC Channel4 采样、lsm6dsoxtr板载 LSM6DSOXTR IMU经 I2C0 连接GPIO12SDA、GPIO13SCL默认配置为加速度 ±2G、陀螺仪 250dps、12.5 Hz 采样率、ninedof九轴聚合驱动以及ipc进程间通信。这些驱动对应的系统调用号DRIVER_NUM定义在相应 capsule 源码中具体接口可参考 doc/syscalls 目录下的文档。常见问题排查make flash提示修改 BOOTSEL_FOLDER说明$(BOOTSEL_FOLDER)目录不存在请确认板卡已成功进入 BOOTSEL 模式出现 U 盘并调整BOOTSEL_FOLDER指向实际挂载点不同发行版可能挂载在/media/、/run/media/或 macOS 的/Volumes/下。双击按钮无法进入 BOOTSEL按上文用跳线短接 GND 与 REC 强制进入并务必在烧录前断开再重新连接 USB。串口无输出确认 USB TTL 适配器连接的是 GPIO0TX与 GPIO1RX波特率设为 115200且没有把 UART 引脚占用为 GPIOmain.rs 中 GPIO 驱动默认注释掉了 GPIO0/1。应用无法加载确认APP指向的是应用的TBF 文件且板卡处于 BOOTSEL 模式后再执行make flash-app。通过以上流程你应当能够在 Nano RP2040 Connect 上稳定地运行、烧录并调试 Tock 内核与应用。赞分享操作系统嵌入式嵌入式OS【免费下载链接】tockA secure embedded operating system for microcontrollers项目地址https://gitcode.com/gh_mirrors/to/tock点击查看免费下载相关推荐Zephyr 开发板实战Arduino Nano RP2040 Connect 板级支持与从零烧录指南Zephyr 开发板实战Arduino Nano RP2040 Connect 板级支持与从零烧录指南 导读 本文以 Zephyr RTOS 仓库中 Ardu操作系统嵌入式RTOS物联网Tock 内核在 Adafruit CLUE nRF52840 上的烧录、引导加载器与调试实战指南Tock 内核在 Adafruit CLUE nRF52840 上的烧录、引导加载器与调试实战指南 本篇指南围绕 Tock 操作系统在 Adafruit CLU操作系统嵌入式嵌入式OSTock 内核在 NUCLEO-U545RE-QSTM32U545RE开发板上的构建、烧录与调试实战指南Tock 内核在 NUCLEO U545RE QSTM32U545RE开发板上的构建、烧录与调试实战指南 本指南以 NUCLEO U545RE Q 板级 R操作系统嵌入式嵌入式OS上一篇awesome-emacs中的Markdown编辑从预览到导出的完整方案下一篇为什么选择react-redux-toastr10个理由让你爱上这个Redux通知解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考