2012-03-13 99 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 

你設置地址無論你喜歡什麼。查看鏈接器的文檔以查看相應的選項。