2012-03-13 67 views
0

我正在研究一个嵌入式应用程序,我需要在固定的内存地址上声明一个函数指针数组,然后在不同的.c文件中使用它。我想到的是:函数指针的外部数组固定内存地址

typedef void(__irq __arm * p_intr_handler_t)(void); 

p_intr_handler_t * IntTable = (p_intr_handler_t *)&VIM_RAM_BASE; 
p_intr_handler_t IntTable[95]; 

VIM_RAM_BASE是地址。我在main.f文件delcare这一点,我需要在各.c文件中使用它,所以我宣布它是这样的:

extern p_intr_handler_t IntTable[95]; 

不过,虽然试图编译我得到一个错误信息: “声明是不兼容与“p_intr_handler_t * IntTable”(在第3行声明)“ 该消息适用于正常和extern声明。

任何想法有什么不对?

感谢

回答

0

你为什么要与不同类型重新声明IntTable

只是吉普车在一个.c的第一个定义,并在.h为它创建一个extern被包含在其他.c,像这样:

extern p_intr_handler_t * IntTable; 

显然,这只有当VIM_RAM_BASE已经不知何故为你的数据保留(即编译器不会试图放置其他数据),否则你应该检查你的编译器的文档,看看是否有办法告诉它把一个变量放在内存中的特定位置。

+0

你说得对,我其实宣布了两次。不知何故,我觉得我需要暗示大小是96 ...无论如何,我做了你说的,现在我得到这个消息:'p_intr_hadler_t * IntTable =(p_intr_hadler_t *)&VIM_RAM_BASE;'这个表达式必须有一个常量值和'extern p_intr_hadler_t * IntTable;'是未定义的...即使我将.h链接了。 – user1267031 2012-03-13 17:25:16

+0

如何定义“VIM_RAM_BASE”?可能你不需要'&'。另外,您不得“链接”.h,但将其包含在相关的“.c”中。 – 2012-03-13 17:44:37

+0

它定义如下:'__IO_REG32(VIM_RAM_BASE,0xFFF82000,__ READ_WRITE);'和IO_REG32像这样'#define __IO_REG32(NAME,ADDRESS,ATTRIBUTE)\ volatile __no_init ATTRIBUTE unsigned long NAME @ ADDRESS'。通过链接我的意思包括。 extern表达式位于.h文件中,该文件包含在相关的.c文件中,但该错误已存在于.h中,其中extern是。 – user1267031 2012-03-13 18:01:20

0

你已经定义了IntTable两次,你不应该重命名为别的东西吗?

1

根据你想要做什么,用链接器而不是编译器做这件事可能更有意义。在这种情况下,您只需在C文件中声明符号为extern(根本没有定义),并告诉链接程序它在哪里。所以,你的头将包含:

extern p_intr_handler_t IntTable[95]; 

,然后你添加一个链接时的选项(这里GNU GCC/LD语法 - 其他接头是不同的)

-Wl,--defsym=_IntTable=0x8000000 

你设置地址无论你喜欢什么。查看链接器的文档以查看相应的选项。