2012-03-13 13 views
0

固定メモリアドレスに関数ポインタの配列を宣言し、それを別の.cファイルで使用する必要がある埋め込みアプリケーションで作業しています。私が思いついたのは次のとおりです。固定メモリアドレスのCの関数ポインタのExtern配列

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行目で宣言されています) " そのメッセージは通常宣言と外部宣言の両方に送られます。

何か問題がありますか?

おかげ

答えて

0

は、なぜあなたは別のタイプのIntTableを再宣言していますか?

だけジープ単一.cで最初の定義、およびこのように、他の.cに含まれる.hでそれについてexternを作成します。

extern p_intr_handler_t * IntTable; 

を明らかにこれはVIM_RAM_BASEが何とかすでにある場合にのみ機能しますあなたのデータ用に予約されています(つまり、コンパイラは他のデータを入れようとしません)。そうでなければ、コンパイラのドキュメントをチェックして、メモリ内の特定の場所に変数を置く方法があるかどうかを調べる必要があります。

+0

あなたは正しいです、私は実際にそれを2度宣言しました。どういうわけか私は、サイズが96であることを暗示する必要があるように感じました...とにかく、私はあなたが言ったことをやったので、このメッセージには、この式が一定値を持たなければならない 'p_intr_hadler_t * IntTable =(p_intr_hadler_t *)&VIM_RAM_BASE;と 'extern p_intr_hadler_t * IntTable;'は定義されていません...私は.hの権利をリンクしています。 – user1267031

+0

'VIM_RAM_BASE'はどのように定義されていますか?おそらく '&'は必要ないでしょう。また、 '.h'を"リンク "するのではなく、関連する' .c'ファイルに含める必要があります。 –

+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式は、関連する.cファイルに含まれている.hファイルにありますが、エラーはexternが存在する.hに既にあります。 – user1267031

0

IntTableを2回定義しましたが、別の名前に変更しないでください。

1

何をしようとしているかによって、コンパイラではなくリンカでこれを行う方が意味があります。その場合は、シンボルをCファイル(定義が全くない)にexternと宣言して、それがどこにあるかをリンカに伝えます。

extern p_intr_handler_t IntTable[95]; 

をして、あなたは、リンク時のオプション(ここではGNU GCC/LD構文 - 他のリンカーが異なる)を追加したい

-Wl,--defsym=_IntTable=0x8000000 

あなたがアドレスを設定します。だからあなたのヘッダーが含まれていますあなたが好きなものに。同等のオプションが何であるかは、リンカーのマニュアルを参照してください。

関連する問題