-2

AT91sam9 ARM コントローラ用の AT91Bootloader があります。ハードウェアの初期化を追加する必要がありますが、コンパイルしたのは .bin ファイルだけです。binファイルをメモリにロードして、それを呼び出そうとしました:

((void (*)())0x00005000)();

でも、結果が出ません。アセンブラはできるだけ使わないようにしてください。以前にアセンブラを紹介されたことがありますが、ARM アセンブラは複雑で理解できません。ブートローダの途中から呼び出して、bin ファイルを実行し (たとえば、0x00005000 などのメモリ セクタにある)、ブートローダに戻って独自のコードを実行し続けるにはどうすればよいですか?

4

2 に答える 2

2

ARM asm が「複雑すぎる」場合、発生している問題をデバッグするのは非常に困難です。Basic* ARM アセンブリは、私が出会った中で最も複雑でないアセンブリ言語の 1 つです。

「.bin」が正しい形式であれば、コードは機能するはずです (ただし、ハードコードされたアドレスは使用しません)。一般的な問題:

  • エントリ ポイントは ARM コードにする必要があります。一部のコンパイラはデフォルトで Thumb を使用します。Thumb コードを機能させることは可能です (少しトリッキーですが)。
  • エントリ ポイントは、ファイルの先頭にある必要があります。分解しないと、これが正しく行われたかどうかを判断するのは困難です。
  • リンカーは、必要に応じて「サンク」(別名「スタブ」) を挿入します。一部のリンカーの癖は、エントリ ポイントの前にサンクを配置できることを意味します。--stub-group-size=-1(docs here )を使用して、これを回避できます。

* 開始する必要のない Thumb/VFP/NEON などを無視します。

于 2013-03-03T22:46:01.780 に答える
1

ARMアセンブリは、非常に単純なものの1つです。ベアメタルを継続して実行したい場合は、少なくともいくつかのアセンブリを学習する必要があります。たとえば、Alexeyのコメントを理解します。

探している命令はBXで、アドレスに分岐します。ブートローダーがダウンロードしたコードに分岐する必要のあるアセンブリは次のとおりです。

.globl tramp
tramp:
   bx r0

Cプロトタイプは

void tramp ( unsigned int address );

コメントで述べたように、プログラムは実行元のアドレス用にコンパイルする必要があり、および/または位置に依存しない必要があります。そうしないと、プログラムは機能しません。また、適切なエントリポイントを使用してアプリケーションを構築する必要があります。これは、生のバイナリであり、バイナリがロードされたアドレスに分岐する場合、バイナリの最初の単語をそのように開始できるようにする必要があります。実行のエントリポイント。

また、elf形式のファイルにはロードしたいデータが含まれていますが、全体としてはロードしたいデータではないことも理解してください。はい、これは「バイナリファイル」ですが、それに含まれるプログラムを実行するには、ロード可能な部分を解析して抽出し、適切な場所にロードする必要があります。

それらの用語が何を意味するのかわからない場合は、グーグルを使用するか、SOを検索してください。答えはそこにあります。

于 2013-03-01T14:43:21.203 に答える