直接回答:no_std 指放弃标准库,只依赖 core(语言核心:Option、Result、slice 等无分配部分)与可选的 alloc(有全局分配器时可用 Vec、Box、String)。代价是失去 std 的 IO、线程、文件系统与默认 panic 处理——panic_handler 与全局分配器要自己提供。换取的是对裸机、内核、WASM 极简环境的可移植性与可预测的资源占用。
展开解析:生态关键组件按层看:硬件访问层是 PAC(svd2rust 从厂商 SVD 生成的寄存器映射)与其上的 HAL(embedded-hal 定义统一的 GPIO/I2C/SPI trait,芯片厂商各自实现,驱动写一次可跨芯片复用);并发与执行层有 embassy(async 执行器 + 各芯片 HAL,现代主流)与 RTIC(基于优先级的抢占式实时框架);分配层用 embedded-alloc 或自实现 bump allocator;日志用 defmt(延迟格式化的超低开销日志,主机侧解码);链接与启动由 cortex-m-rt 处理向量表与内存布局。工程实践:中断与主逻辑共享数据要用 critical-section 或 RTIC 的资源模型保证互斥;panic 策略通常 abort;固件体积用 opt-level=z、LTO、abort 组合压缩。面试亮点是讲清 embedded-hal 的 trait 抽象为什么重要——它把驱动生态从芯片生态中解耦,是嵌入式 Rust 复用性的根基。
追问方向:defmt 为什么比普通日志省资源?async 在中断驱动场景如何落地?
(约 480 字)