直接回答:no_std 表示不链接标准库(std 依赖操作系统:线程、文件、网络、堆分配都由 OS 提供),只保留 core(语言核心:Option、Result、迭代器、原子类型等无 OS 依赖部分)。裸机环境没有 OS,必须 #![no_std],通常还要 #![no_main] 自己定义入口(_start / cortex-m-rt 的 reset handler)。

展开解析:失去的能力与补齐方案:堆分配——core 不含 Vec/String,要么用 heapless(固定容量、栈上分配,编译期确定内存,嵌入式首选),要么自己实现 GlobalAlloc(链接 alloc crate 配 bump/linked-list allocator);panic 处理——std 的 panic 走 unwind,no_std 必须提供 #[panic_handler],嵌入式通常配 panic-halt(死循环)或 panic-probe(打印后停);错误输出与调试——没有 println,用 defmt(二进制压缩日志经调试探针传回)或半主机 semihosting;浮点与数学——core 有基本运算,复杂数学用 libm。生态分工:cortex-m 系列外设访问靠 PAC(寄存器映射,svd2rust 生成)、通用接口靠 embedded-hal trait、驱动层百花齐放。启动链路也要懂:链接脚本划内存布局(Flash/RAM),启动代码初始化 .data/.bss、设栈顶再跳 main。no_std 的价值不止嵌入式:Wasm、内核模块、对二进制体积敏感的库同样走这条路。

追问方向:heapless 的容量溢出如何处理?为什么中断处理里不能分配堆内存?

(约 480 字)