2

Cortex-M3 チップがあり、eCos を使用するブートローダーを実行しています。ブートローダーは、ファームウェアの更新などを確​​認した後、実際のアプリケーションが存在する ROM 上の別の場所 (BASE_ADDRESS_OF_APP + 0x19) にジャンプします (これも eCos でコンパイルされています)。

ここで、通常のファームウェアを実行する代わりに、Cortex-M3 ターゲット用にコンパイルされた CppUTests を実行したいと考えています。そのため、実際のオペレーティング システムではなく、ecos glibc を使用してターゲット プラットフォーム用にテストをコンパイルおよびリンクできます。しかし、JTAG を使用してボードにロードすると、実行されません。

arm-eabi-objdump を使用して調査した結果、CppUTest ファームウェアのリセット ベクターが、通常のファームウェアのオフセット 0x18 とは対照的に、オフセット 0x490 にあることがわかりました。私の疑いは、これがテストが実行されない理由であるということです。これは正しいです?

2 つのファームウェアを同じリンカー スクリプトでリンクしているときに、これらのファームウェアの開始アドレスが異なる可能性があるのはなぜですか?

テスト プログラムの開始点がアプリケーションの開始点と同じであることを確認するにはどうすればよいですか?

4

1 に答える 1

1

リンカー スクリプトの記述方法によって異なります。エントリ ポイント アドレスがリンカー スクリプトの静的な場所に設定されていない場合、エントリ ポイントの前に他のデータ/コードがオブジェクト ファイルに配置される可能性があります。エントリポイントの場所を移動し、実際に問題を引き起こしています。

私は通常、シンボルを 1 つだけ含む新しいセクションを作成し、次のようにジャンプ/分岐命令を作成することでこれを解決します。

.section entryPointSection
b myCodeEntryPoint

次に、リンカー スクリプトentryPointSectionで、ブートローダーがジャンプするハード コードされたアドレスに を配置します。

ラベルは、通常のmyCodeEntryPoint.text セクションにある C 関数 (または必要に応じてアセンブリ ラベル) の名前にすることができ、jmp の範囲内であればどこにでもリンクできます。これがエントリポイントになりますが、リンカーがそれを見つけて適切にリンクする必要があるため、どこにあるかはあまり気にしません。

さらに質問がある場合は、リンカー スクリプトを投稿することを検討してください。

于 2013-01-31T18:06:07.060 に答える