2012-03-26 15 views
0

私はSCBフォーラムでこの質問をしましたが、回答がありません 私はuVision IDEからSCBにいくつかのプロジェクトを移植しようとしています。 問題は、ベクタテーブルの実装から始まりました。 SCBライブラリは「int型メイン(無効)」の宣言を探しているのでexamleのために、私はシンプルなC++コードSourcery CodeBench ARM Cortex-Mベクトルテーブルの実装

#define STACK_TOP 0x20000800 
typedef void (*handler_ptr)(); 

void ResetHandler() { while (1); } 
void NMIHandler() { while (1); } 
void HardFaultHandler() { while (1); } 

__attribute__ ((section("vectors"))) handler_ptr const vector_table[] = { 
    (handler_ptr) STACK_TOP, 
    ResetHandler, 
    NMIHandler, 
    HardFaultHandler, 
}; 

を持っているこのコードは、コンパイルされません。 私はこの関数を追加することができますが、SCBは私のベクトルテーブルの実装を無視し、自分自身を使用します(私がVTのアドレスを呼び出すと、SCBダミーハンドラが表示されます)。

私はSCB VT実装をどのように書き換えることができますか? 特殊なSC3関数名を使用しないでください(2つのIDEでサポートするのは良くありません)。または、ベクトルテーブルを別のメモリ位置に移動してください。 Luminary Micro社のから

__attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void) 

"startup_gcc.c - GNUツールで使用するためのスタートアップコードは、" あまりにも

はありがとうござい効果はありません。

答えて

1

埋め込みサポート用の低レベルC拡張については、どちらのコンパイラでも1つのアプローチで取り残されることはありません。 ARMから公式のCMSISを配布しても、サポートされているコンパイラごとに別々のスタートアップが用意されています。

ただし、明示的なテーブル宣言よりもうまくいくものは、それを含みません。実装したいハンドラを宣言するだけです。 CMSISのスタートアップは通常、独自のスタブをWEAK機能としてマークしますので、あなたのものが優先されます。ただし、リンカーが想定しているハンドラーの標準名(例:Reset_HandlerNMI_HandlerWWDG_IRQHandlerなど)を使用する必要があります。詳細については、CMSIS docsとソースファイルを参照してください。

注意:C++としてコンパイルしている場合は、extern "C"マーカーを必ず追加してください。リンカーにはハンドラが表示されません。

+0

イゴール、ありがとう。あなたが正しいです。最適な解決策は、各コンパイラのための別々のヘッダーファイルです。私はリンカファイルで正しいセクション名を見つけました - ".cs3.interrupt_vector"しかし、リンカはSCBが生成された後に私のベクトル宣言を置きます。 –

+0

私はCortex M7用のKeil ARM 6.6とGCC 6と同じ "vectors.c/h"ファイルをコンパイルするC++プロジェクトを手に入れました。 Keilコンパイラ(uVisionを介して呼び出され、専用の暴言を必要とする)にはセクション(例:RESET)があらかじめ定義されているので、GCCリンカスクリプトを変更して一致させました。より難しいのは、スタックを同じに設定することです。それを並べ替えたわけではありません。 – Flip

関連する問題