全景
这一部分先回答「embassy 是什么」,再把前两条主线从头到尾走一遍,每一步只讲到能看清全貌的深度,细节链到 02 到 05 的页面。三页的实验都在 QEMU 11.1.2 的 b-l475e-iot01a 上跑,用 -icount 得到可重复的指令数。
- embassy 解决什么问题:裸机上没有线程、没有堆时的四种并发写法(轮询主循环、RTOS 线程、RTIC、embassy)各把状态和等待放在哪;embassy 的说法逐条落到代码上;和 tokio 能核实的差别:任务在
.bss里、没有 I/O 驱动线程、任务参数必须'static;同样两个周期任务,embassy 版比手写的轮询主循环多 2380 字节.text、276 字节.bss。 - 一次 Timer::after:定时器主线九步,在 SysTick 驱动和执行器的 trace 钩子里打点;从
Timer::after到驱动登记约 70 条指令,从 SysTick 中断进入到任务在.await之后继续约 170 条;等 100 ms 期间执行器 poll 了 200 次,只有最后一次有任务可跑,原因是 SysTick 每毫秒一个中断,而处理完一次中断后事件寄存器是置位的(QEMU 上实测)。 - 一次中断唤醒:中断主线;
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 同步]
💬 关联讨论
发起讨论加载中...