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
相关产品推荐
相关产品推荐

