您可以使用 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 位整数访问。
我一直在用 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 位整数访问。