1

ARM マイクロコントローラ用の「通常の」ARM クロスコンパイルは、通常、次の 3 つまたは 4 つのステップで構成されます。

  1. アセンブラを使用して、スタートアップ コード (アセンブリの場合) をオブジェクト ファイルにアセンブルします。
  2. コンパイラを使用してソース コードをオブジェクト ファイルにコンパイルする
  3. リンカーを使用して、オブジェクト ファイルを .elf ファイルにリンクします。
  4. objcopy を使用して、.elf ファイルを .hex ファイルに変換します。
  5. .hex ファイルをフラッシュします

よくわからないのはステップ 4 です。OpenOCD のflash write_imageコマンドのドキュメントには、次のように記載されています。

ファイル [タイプ] は、bin (バイナリ)、ihex (Intel hex)、elf (ELF ファイル)、s19 (Motorola s19) として明示的に指定できます。mem、またはビルダー。

OpenOCD が elf ファイルをサポートしていることは明らかですが、これが実際に何を意味するのかはわかりません。これは一部のターゲットでのみサポートされていますか? JTAG/SWD アダプターは、これが機能するために何らかの objcopy のような機能を提供する必要がありますか? OpenOCDがまだelfファイルをサポートしていなかった時代からの単なる名残りですか?

4

1 に答える 1

3

elf、ihex、srecなどのアドレスとデータを含むファイル形式が適しています。私は主にelfを使用します。.binファイルにはアドレスが含まれていないため、1)開始アドレスを指定する必要があります。2)objcopyは、定義された領域間のギャップを埋めるため、問題が発生したり、読み込み時間が長くなったりする可能性があります。

.binを使用すると、アドレスに人為的エラーの余地が残ります。残念ながら、.elfとopenocdの組み合わせが間違ったアドレスをロードするか、少なくともロード時に間違ったアドレスを出力する状況がありました。

可能な限り.elfファイルを使用します。ユーティリティがelfをサポートしていないが、ihexまたはsrecをサポートしている場合は、.hexまたは.srec。また、たとえばx / y/zmodemローダーを使用する場合は.bin。

openocdは階層化されており、ファイルを読み取るフロントエンドがあり、バックエンドに到達するまでに、jtagまたはバックエンドがデータの発信元のファイルの種類を認識していないと想定します。私は事実を知りませんが、仮定します...

于 2012-12-01T16:59:31.633 に答える