You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌入式Rust开发:如何避免为中断服务程序(ISR)生成额外汇编代码

解决方案
  • 你观察到的push {r7, lr}、mov r7, sp、pop {r7, pc}是Rust为普通函数自动生成的栈帧序言/尾声代码,属于常规函数调用的标准逻辑,要去掉这部分代码需要使用Rust的裸函数属性。

核心方案:使用#[naked]属性

#[naked]属性会明确告知编译器不要为该函数生成任何自动的序言、尾声代码,函数的完整执行逻辑完全由你手动编写的汇编代码控制。
修改后的示例代码如下:

#![feature(naked_functions)] // 需启用裸函数特性,使用nightly工具链编译

#[allow(non_snake_case)]
#[no_mangle]
#[naked] // 核心属性,禁用自动生成栈帧逻辑
pub fn PendSV() {
    unsafe {
        asm!(
            "nop",
            // 实际开发时你需要自行补充完整逻辑,比如上下文切换代码 + 符合Cortex-M规范的异常返回指令
            options(noreturn) // naked函数的asm块必须指定noreturn选项,编译器不会自动插入返回逻辑
        );
    }
}

按上述代码编译后,生成的汇编只会包含你写在asm块内的指令,不会有额外的栈帧处理代码。

补充说明

  • 如果你不需要手动编写全量汇编实现异常处理,也可以直接使用cortex-m crate提供的#[exception]宏,该宏会自动完成异常函数的ABI适配,不需要手动处理栈帧问题。
  • 裸函数的所有执行逻辑都需要开发者手动控制,包括栈平衡、异常返回等操作,处理不当会直接导致程序跑飞,开发时需要严格符合Cortex-M架构的异常处理规范。

内容的提问来源于stack exchange,提问作者Afro Samurai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:24:00