ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Tock 在 STM32 Nucleo-F446RE 上的内核烧录与应用烧录完整指南

2026/10/8 1:31:48 拓冰建站 浏览量
Tock 在 STM32 Nucleo-F446RE 上的内核烧录与应用烧录完整指南 操作系统嵌入式嵌入式OS【免费下载链接】tockA secure embedded operating system for microcontrollers项目地址https://gitcode.com/gh_mirrors/to/tock点击查看免费下载本篇指南基于 Tock 仓库中 boards/nucleo_f446re/README.md 展开系统讲解如何在 STM32 Nucleo-64 开发板搭载 STM32F446RE MCU上完成 Tock 内核与用户应用的烧录。你将掌握make flash内核烧录、基于arm-none-eabi-objcopy --update-section的免 tockloader 应用合入流程、Makefile定制program目标以及 Linux 下 ST-LINK 的 udev 权限配置并能结合仓库源码理解该平台的硬件布局与驱动能力。平台概览Nucleo-64 与 STM32F446RENucleo-F446RE 是 ST 官方推出的 Nucleo-64 系列开发板板载 STM32F446RE 微控制器ARM Cortex-M4F 内核主频最高 180MHz官方资料见 ST 产品页。在 Tock 中该板对应的板级文件位于 boards/nucleo_f446re/其构建产物目标三元组为thumbv7em-none-eabi直接复用 Cortex-M4 架构支持arch/cortex-m4与stm32f446re芯片支持包chips/stm32f446re。板级源码入口 boards/nucleo_f446re/src/main.rs 展示了该平台的完整外设清单外设/驱动内核驱动号底层硬件Console控制台capsules_core::console::DRIVER_NUMUSART2经 ST-LINK 虚拟串口LEDcapsules_core::led::DRIVER_NUM用户 LED LD2PA05高电平点亮Button按键capsules_core::button::DRIVER_NUMPC13低电平有效ADC6 路capsules_core::adc::DRIVER_NUMADC1Arduino A0~A5 对应 PA00/PA01/PA04/PB00/PC01/PC00Alarm闹钟capsules_core::alarm::DRIVER_NUMTIM2Temperature温度capsules_extra::temperature::DRIVER_NUMADC1 内部通道 18内部温度传感器GPIO14 路capsules_core::gpio::DRIVER_NUMD2~D15 数字引脚IPCkernel::ipc::DRIVER_NUM内核 IPC 机制内存布局方面boards/nucleo_f446re/chip_layout.ld 明确了分区512KB ROM 中前 256KB0x08000000起为内核区rom后 256KB0x08040000起为应用区prog128KB RAM0x20000000起供内核与进程共享boards/nucleo_f446re/layout.ld 通过INCLUDE引入该文件与全局的tock_kernel_layout.ld位于 boards/build_scripts/tock_kernel_layout.ld。内核烧录OpenOCD ST-LINKTock 内核可通过 OpenOCD 烧录。首先进入板级目录$ cd boards/nucleo_f446re然后执行以下任一命令$ make flash (or) $ make flash-debug两个命令的行为在 boards/nucleo_f446re/Makefile 中定义均调用 OpenOCD 并加载 ST 官方 Nucleo-F4 板级配置flash: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).elf $(OPENOCD) -c source [find board/st_nucleo_f4.cfg]; init; reset halt; flash write_image erase $; verify_image $; reset; shutdown flash-debug: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/debug/$(PLATFORM).elf $(OPENOCD) -c source [find board/st_nucleo_f4.cfg]; init; reset halt; flash write_image erase $; verify_image $; reset; shutdown二者的区别仅在于固件构建模式make flash烧录release镜像target/thumbv7em-none-eabi/release/nucleo_f446re.elfmake flash-debug烧录debug镜像target/thumbv7em-none-eabi/debug/nucleo_f446re.elf适合配合调试器做源码级调试。OpenOCD 命令序列含义如下init初始化调试会话reset halt将 CPU 停在复位状态flash write_image erase先擦除后写入内核镜像verify_image校验写入内容reset复位运行shutdown关闭 OpenOCD。Nucleo-F446RE 板载 ST-LINK/V2-1无需外接调试器。注意与多数 Tock 平台不同该板默认的内核镜像在加载时会清除已烧录的应用。这是为了支持下文“免 tockloader 的应用烧录流程”——内核镜像本身携带.apps段占位区用户应用被合入该段后随内核一次性写入 Flash。这也意味着若使用 tockloader 等工具单独管理应用需要留意两者工作方式的差异。构建系统的通用行为定义在 boards/Makefile.common 中默认工具链为 rustup 的llvm-tools组件可用TOOLCHAINarm-none-eabi覆盖PLATFORM与TARGET由cargo tree和cargo config get build.target自动推导本板 TARGET 为thumbv7em-none-eabi并支持make check、make debug、make lst、make memory、make stack-analysis等常用目标。应用烧录objcopy 合入 .apps 段Tock 应用是**在仓库之外out-of-tree**独立构建的例如使用 libtock-c 生态构建产物是 TBFTock Binary Format格式的.tbf文件。将应用烧录到本板的方式是用arm-none-eabi-objcopy把应用镜像合入内核 ELF 的.apps段生成一个“内核应用”的合成 ELF再一次性烧录。第一步先为内核 ELF 创建带.apps段的副本$ arm-none-eabi-objcopy \ --set-section-flags .appsLOAD,ALLOC \ target/thumbv7em-none-eabi/debug/nucleo_f446re.elf \ target/thumbv7em-none-eabi/debug/nucleo_f446re-app.elf第二步用--update-section将编译好的应用 TBF 写入该段$ arm-none-eabi-objcopy \ --update-section .apps../../../libtock-c/examples/c_hello/build/cortex-m4/cortex-m4.tbf \ target/thumbv7em-none-eabi/debug/nucleo_f446re-app.elf命令中的关键参数--set-section-flags .appsLOAD,ALLOC把原本未分配的.apps占位段标记为可加载LOAD并分配地址ALLOC使其进入最终烧录映像--update-section .appstbf路径用指定的.tbf文件内容替换.apps段。c_hello是 libtock-c 中最基础的示例应用编译产物位于其build/cortex-m4/目录下。注意.apps段之所以存在是因为 boards/Makefile.common 中OBJCOPY_FLAGS明确通过--remove-section .apps在生成.bin时剔除该段避免内核二进制覆盖已存在的应用——该段只在 ELF 中作为占位存在需要合入应用时由上述流程显式填充。烧录时flash write_image erase会先整片擦除这正是“清除已烧录应用”的来源因此合成的-app.elf同时携带内核与应用一次写入即可完成部署。定制 Makefile一键make program为了把上述两步固化进构建流程README 给出了在板级Makefile中增加program目标的做法。示例关键片段如下APP../../../libtock-c/examples/c_hello/build/cortex-m4/cortex-m4.tbf KERNEL$(TOCK_ROOT_DIRECTORY)/target/$(TARGET)/debug/$(PLATFORM).elf KERNEL_WITH_APP$(TOCK_ROOT_DIRECTORY)/target/$(TARGET)/debug/$(PLATFORM)-app.elf .PHONY: program program: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/debug/$(PLATFORM).elf arm-none-eabi-objcopy --set-section-flags .appsLOAD,ALLOC $(KERNEL) $(KERNEL_WITH_APP) arm-none-eabi-objcopy --update-section .apps$(APP) $(KERNEL_WITH_APP) $(OPENOCD) $(OPENOCD_OPTIONS) -c init; reset halt; flash write_image erase $(KERNEL_WITH_APP); verify_image $(KERNEL_WITH_APP); reset; shutdown设置好APP、KERNEL、KERNEL_WITH_APP三个变量并为program目标声明依赖后只需执行$ make program即可完成“编译检查 → 合入应用 → OpenOCD 烧录校验”全流程。变量说明APP应用 TBF 文件的路径按实际构建产物修改KERNEL当前平台的 debug ELF 路径TOCK_ROOT_DIRECTORY、TARGET、PLATFORM均由 boards/Makefile.common 自动推导PLATFORM即nucleo_f446reKERNEL_WITH_APP合成后的 ELF 输出路径。仓库中 boards/nucleo_f446re/Makefile 第 25~26 行保留了该目标的内核骨架program依赖 debug ELF并用$(error See README.md and update this section accordingly)提示开发者按上述示例补齐内容正好与本指南的定制方案衔接。Linux添加 udev 规则免 root 访问 ST-LINK在 Linux 下若不想以 root 身份运行 OpenOCD 访问板载 ST-LINK/V2-1可在/etc/udev/rules.d下新增规则文件例如安装为/etc/udev/rules.d/99-stlinkv2-1.rules# stm32 nucleo boards, with onboard st/linkv2-1 # ie, STM32F0, STM32F4. # STM32VL has st/linkv1, which is quite different SUBSYSTEMSusb, ATTRS{idVendor}0483, ATTRS{idProduct}374b, \ MODE:0660, GROUPdialout, \ SYMLINKstlinkv2-1_%n要点解析SUBSYSTEMSusb匹配 USB 子系统ATTRS{idVendor}0483是 STMicroelectronics 的 USB Vendor IDATTRS{idProduct}374b对应 ST-LINK/V2-1 的 Product IDNucleo-F4 板载版本老款 STM32VL 使用 ST-LINK/V1规则不同MODE:0660, GROUPdialout将设备权限授予dialout用户组把当前用户加入该组后即可免 root 使用SYMLINKstlinkv2-1_%n为设备创建稳定的符号链接%n为内核设备序号。修改后需重载 udev 规则如sudo udevadm control --reload-rules并重新插拔 USB使规则生效。烧录后的运行验证内核启动后板级代码会输出调试信息。默认时钟使用 STM32F446RE 内部 HSI 16MHz 振荡器见 boards/nucleo_f446re/src/main.rs 中HSI_FREQUENCY_MHZ的引用USART2 经 PA02/PA03 复用为 ST-LINK 虚拟串口内核UartMuxComponent配置波特率 115200见 boards/nucleo_f446re/src/main.rs。将串口终端如 minicom、picocom连接到板载虚拟串口并设为 115200/8-N-1复位板子即可观察到内核初始化日志与进程加载信息若触发 panicboards/nucleo_f446re/src/io.rs 定义的 panic handler 会同时通过串口输出错误信息并点亮/操作 LD2PA05LED。小结Nucleo-F446RE 在 Tock 中的烧录流程可以概括为三条主线make flash/make flash-debug烧录内核arm-none-eabi-objcopy --update-section .apps...将 out-of-tree 构建的 TBF 应用合入内核 ELF 后一次性烧录本平台默认清除既有应用的根源即在于此以及用 udev 规则解决 Linux 下的设备访问权限。结合 boards/nucleo_f446re/Makefile 与 boards/nucleo_f446re/src/main.rs 的源码开发者可以在此基础上自由扩展program目标、增删驱动外设并复用仓库其他文档如 Getting Started完成从构建到部署的完整闭环。赞分享操作系统嵌入式嵌入式OS【免费下载链接】tockA secure embedded operating system for microcontrollers项目地址https://gitcode.com/gh_mirrors/to/tock点击查看免费下载相关推荐Tock 在 STM32 Nucleo-F429ZI 上的内核烧录与应用加载完整指南Tock 在 STM32 Nucleo F429ZI 上的内核烧录与应用加载完整指南 本篇技术指南基于 Tock 嵌入式操作系统仓库中 boards/nucle操作系统嵌入式嵌入式OSTock 在 MSP-EXP432P401RMSP432P401R LaunchPad上的内核与应用烧录实战指南Tock 在 MSP EXP432P401RMSP432P401R LaunchPad上的内核与应用烧录实战指南 导读 本文是一份面向 Tock 嵌入式操作操作系统嵌入式嵌入式OSTock 内核在 NUCLEO-U545RE-QSTM32U545RE开发板上的构建、烧录与调试实战指南Tock 内核在 NUCLEO U545RE QSTM32U545RE开发板上的构建、烧录与调试实战指南 本指南以 NUCLEO U545RE Q 板级 R操作系统嵌入式嵌入式OS上一篇Revive 多项目配置管理一套工具统一管理所有 Go 代码仓库下一篇ESP-IDF构建系统架构解析5大设计原则与模块化实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考