Fork - 微控制器固件构建工具
Fork 是一个命令行工具,用于为任何微控制器(MCU)构建固件,无需构建工具抽象或额外配置。目前仍处于早期开发阶段(Beta版本)。
核心特点
- 简化构建流程:通过简单命令
fork build -m stm32f405即可构建固件 - 自动检测工具链:从配置文件自动检测项目的工具链,构建Dockerfile并在容器内运行构建
- 无需额外配置:项目中不需要超出构建系统本身的配置文件
- 基于Docker:利用Docker容器实现隔离构建环境
主要优势
相比直接使用Docker,Fork简化了多MCU项目的构建流程:
- 传统Docker方式需要为不同MCU编写复杂的命令(包含UID映射、路径配置等)
- Fork统一为简单命令:
fork build -m rp2040和fork build -m esp32
使用方法
- 构建固件:
fork build(自动检测MCU) 或fork build --mcu rp2040 --tool embassy-rp - 烧录固件:
fork flash或fork 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::mpscchannel 替代互斥锁,但性能反而下降
优化成果
- 单线程场景:互斥锁仍是最快方案(无数据复制,无竞争)
- 多线程场景:
- 自定义 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 页
评论区
写评论还没有评论