3

我一直在玩 C 语言中的 Game Boy Advance 编码。要使中断工作,必须手动将中断处理程序的地址复制到 RAM 位置 0x03007FFC。我知道如何在 ARM 汇编中做到这一点,但在 C 中却不知道。我正在尝试这样的事情:

#define REG_INTERRUPT *(vu32*)0x03007FFC
void irqhandler()
{
    while(1){}
}

int main()
{
    REG_INTERRUPT = &irqhandler();

    while(1){}
    return 0;

}

但它不起作用。根据我对 C 函数的了解,似乎 C 正在考虑我正在尝试获取的返回值的地址irqhandler(因为它是 void,所以没有返回值),这就是错误的来源。如何告诉 C 我想要函数本身的内存位置?

4

1 回答 1

6
  • irqhandler()错了,你调用的是函数而不是获取它的地址。您应该写irqhandler或 100% 等效的&irqhandler.
  • 不要使用奇怪的自制类型,比如vu32,没有人知道那是什么意思。使用来自 stdint.h 的标准化类型。
  • 您不能将函数指针分配给整数,它们不是兼容的类型。您需要显式转换为整数。

更正的代码:

#include <stdint.h>
#define REG_INTERRUPT (*(volatile uint32_t*)0x03007FFCu)
...
REG_INTERRUPT = (uint32_t)irqhandler;

当然,这假设底层硬件支持这一点,并且地址0x3007FFC中存在有效的东西,期望 32 位整数访问。

有关详细信息,请查看如何从固件访问硬件寄存器?

于 2021-11-03T11:52:05.233 回答