您可以使用 C 将函数的内存位置存储到 RAM 中吗?

Can you store the memory location of a function into RAM using C?

我一直在用 C 语言编写 Game Boy Advance 代码。要使中断正常工作,必须将中断处理程序例程的地址手动复制到 RAM 位置 0x03007FFC。我知道如何在 ARM Assembly 中执行此操作,但在 C 中不知道。我正在尝试这样的操作:

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

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

    while(1){}
    return 0;

}

但是没用。根据我对 C 函数的了解,C 似乎在想我正在尝试获取 irqhandler 的 return 值的地址(其中 none 因为它是空的)这就是错误的来源。我如何告诉 C 我想要函数本身的内存位置?

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

更正后的代码:

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

这当然假设底层硬件支持它,并且地址 0x3007FFC 处存在一些有效的东西,需要 32 位整数访问。

有关详细信息,请查看 How to access a hardware register from firmware?