Rust in Everything
基于 embassy-executor 0.10.0

全景

这一部分先回答「embassy 是什么」,再把前两条主线从头到尾走一遍,每一步只讲到能看清全貌的深度,细节链到 02 到 05 的页面。三页的实验都在 QEMU 11.1.2 的 b-l475e-iot01a 上跑,用 -icount 得到可重复的指令数。

  1. embassy 解决什么问题:裸机上没有线程、没有堆时的四种并发写法(轮询主循环、RTOS 线程、RTIC、embassy)各把状态和等待放在哪;embassy 的说法逐条落到代码上;和 tokio 能核实的差别:任务在 .bss 里、没有 I/O 驱动线程、任务参数必须 'static;同样两个周期任务,embassy 版比手写的轮询主循环多 2380 字节 .text、276 字节 .bss。
  2. 一次 Timer::after:定时器主线九步,在 SysTick 驱动和执行器的 trace 钩子里打点;从 Timer::after 到驱动登记约 70 条指令,从 SysTick 中断进入到任务在 .await 之后继续约 170 条;等 100 ms 期间执行器 poll 了 200 次,只有最后一次有任务可跑,原因是 SysTick 每毫秒一个中断,而处理完一次中断后事件寄存器是置位的(QEMU 上实测)。
  3. 一次中断唤醒:中断主线;bind_interrupts! 展开成一个 no_mangle 的向量函数加 Binding 实现,向量表里能看到它;另一个任务写 EXTI 的 SWIER 触发同一条线,从写寄存器到等待的任务恢复约 320 条指令,中间那条 WFE 不睡。
flowchart TB
  why[解决什么问题] --> timer["一次 Timer after"]
  why --> irq[一次中断唤醒]
  timer --> exec[02 执行器]
  timer --> time[03 时间]
  irq --> hal[05 HAL]
  irq --> sync[04 同步]

💬 关联讨论

发起讨论
加载中...