私は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ツールで使用するためのスタートアップコードは、" あまりにも
はありがとうござい効果はありません。
イゴール、ありがとう。あなたが正しいです。最適な解決策は、各コンパイラのための別々のヘッダーファイルです。私はリンカファイルで正しいセクション名を見つけました - ".cs3.interrupt_vector"しかし、リンカはSCBが生成された後に私のベクトル宣言を置きます。 –
私はCortex M7用のKeil ARM 6.6とGCC 6と同じ "vectors.c/h"ファイルをコンパイルするC++プロジェクトを手に入れました。 Keilコンパイラ(uVisionを介して呼び出され、専用の暴言を必要とする)にはセクション(例:RESET)があらかじめ定義されているので、GCCリンカスクリプトを変更して一致させました。より難しいのは、スタックを同じに設定することです。それを並べ替えたわけではありません。 – Flip