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

C语言如何获取函数内存地址并写入指定RAM位置(GBA开发场景)

你代码中存在的问题是&irqhandler()的书写逻辑:带括号的irqhandler()代表执行该函数,&取的是函数返回值的地址,而你的irqhandler是void返回类型,不存在返回值,因此编译会报错,也完全不符合你取函数自身地址的需求。

在C语言中,直接书写不带括号的函数名,就可以得到该函数的入口地址,你也可以选择在函数名前加&,两种写法语义完全等价。你只需要把main里的赋值语句修改为:

REG_INTERRUPT = (vu32)irqhandler;
// 或者下面这种写法也可以
// REG_INTERRUPT = (vu32)&irqhandler;

以下是完整的修正后参考代码:

// 注意如果你的vu32没有提前定义,需要先定义,通常GBA开发中vu32是volatile unsigned int的别名
typedef volatile unsigned int vu32;
#define REG_INTERRUPT *(vu32*)0x03007FFC

// 额外注意:GBA的中断处理函数需要加对应的编译器属性,保证函数入口符合中断调用约定,以ARM GCC为例:
void __attribute__((interrupt("IRQ"))) irqhandler()
{
    // 你的中断处理逻辑
    while(1){}
}

int main()
{
    // 直接取函数名的值就是函数入口地址
    REG_INTERRUPT = (vu32)irqhandler;

    while(1){}
    return 0;
}

额外注意事项:

  • 要记得做类型转换,把函数指针类型转换为vu32再赋值,避免部分编译器报类型不匹配的警告
  • 中断处理函数需要标注对应的编译器中断属性,否则函数的入栈出栈逻辑不符合中断要求,会导致运行异常
  • 后续还要记得配置对应中断的使能寄存器、开CPU总中断,中断才能正常触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:24:04