< 返回版块

Mike Tang 发表于 2026-03-14 10:40

Fork - 微控制器固件构建工具

Fork 是一个命令行工具,用于为任何微控制器(MCU)构建固件,无需构建工具抽象或额外配置。目前仍处于早期开发阶段(Beta版本)。

核心特点

  • 简化构建流程:通过简单命令 fork build -m stm32f405 即可构建固件
  • 自动检测工具链:从配置文件自动检测项目的工具链,构建Dockerfile并在容器内运行构建
  • 无需额外配置:项目中不需要超出构建系统本身的配置文件
  • 基于Docker:利用Docker容器实现隔离构建环境

主要优势

相比直接使用Docker,Fork简化了多MCU项目的构建流程:

  • 传统Docker方式需要为不同MCU编写复杂的命令(包含UID映射、路径配置等)
  • Fork统一为简单命令:fork build -m rp2040fork build -m esp32

使用方法

  • 构建固件fork build (自动检测MCU) 或 fork build --mcu rp2040 --tool embassy-rp
  • 烧录固件fork flashfork flash --file ./my-firmware.uf2

扩展支持

添加新的开发板支持很简单,只需在 /boards 目录创建TOML配置文件并提交PR

系统要求

需要安装Docker或Podman

许可证

MIT开源许可

https://github.com/TareqRafed/fork

Burn 框架通信层优化:速度提升 5 倍超越 Rust 标准 Channel

背景与动机

  • Burn 框架为支持复杂递归状态(如自动微分图、融合张量编译器和 CubeCL 服务器)依赖可重入互斥锁
  • 锁开销在多 GPU 和多线程环境下成为性能瓶颈
  • 尝试使用标准 std::sync::mpsc channel 替代互斥锁,但性能反而下降

优化成果

  • 单线程场景:互斥锁仍是最快方案(无数据复制,无竞争)
  • 多线程场景
    • 自定义 channel 比标准 channel 快 10 倍
    • 比互斥锁快约 2 倍
    • 8 线程测试中任务执行数量提升近 2 倍

核心技术实现

1. 零分配任务入队

  • 问题:闭包(closure)通常超过 1000 字节,频繁的 Box<dyn FnOnce()> 分配造成严重竞争
  • 解决方案:采用分层双缓冲内存池(Double-Buffer Arena)
    • 小闭包(≤48 字节):直接内联到 64 字节 Task 结构体中(CPU 缓存行对齐)
    • 大闭包(≤4KB):使用预分配内存池,绕过全局分配器
    • 超大闭包(>4KB):回退到标准 Box(占比极少)

2. 无锁双缓冲机制

  • 采用双缓冲交换策略消除传统环形缓冲区的竞争
  • 生产者使用原子操作写入客户端缓冲区
  • 运行线程通过单次原子交换批量获取任务到私有服务端缓冲区
  • 实现零干扰的顺序任务执行

3. 线程本地存储(TLS)保证递归安全

  • 运行线程通过 TLS 检测是否向自身提交任务
  • 如果是,立即同步执行而非入队,避免死锁
  • 无需可重入锁的高开销

结论

  • 标准库适用于大多数场景,但在深度了解传输对象特性时,专用实现可大幅提升性能
  • 新的设备句柄(device handle)为独立设备服务提供了优雅的零开销通信通道
  • 保持 FnOnce 接口,确保灵活性和易用性

https://burn.dev/blog/faster-channel/

--

From 日报小组 Mike

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页