1

STM32F4 で、CPU レジスタを読み取るにはどうすればよいですか?

これらのレジスタはメモリ内のどこかにマップされていますか?

そうでない場合は、レジスタ (LR など) をローカル変数に読み込むための簡単なアセンブリ コードを提供していただけますか?

ありがとう。

4

3 に答える 3

3

Keil ツールチェーンでは、次のアプローチを使用しました。

register int R0 __asm("r0");

ここで、「R0」はコンパイラによって変数として認識されるようになりました。

「名前付きレジスタ変数」を検索します。例:

http://www.keil.com/support/man/docs/armcc/armcc_chr1359125006491.htm

于 2013-12-27T15:04:15.930 に答える
2

まず、単にプログラムの実行をのぞき見したいだけなら、ARM 用 IAR Embedded Workbench ( IAR EWARM ) サイズ制限バージョン (試用期間の終了日なし) をダウンロードしてください。

  • 新しいプロジェクトを作成し、そこにコードをドラッグ アンド ドロップして、シミュレータで実行することもできます (たとえば、[プロジェクト] -> [オプション] -> [デバッガ] で [シミュレータ] を選択します)。次に、必要なすべてのレジスターをプロファイリングできます。

しかし、本当にコードでそれを行いたい場合は、どのレジスターを読み取りたいか、それらで何したいか、およびコンパイラーがそれらを何に使用するかによって異なります。

汎用レジスタが使用されますが、コンパイラはそれらを使用することを決定するため、基になるアセンブリを理解してそれらが表すものを理解する必要があります。

通常、ローカル変数は GPR に格納されるため、この場合、(c コードで) ローカル変数の値を読み取ることは、基本的にレジスタ読み取りを実行することになります。

LR などの専用レジスタを読み取るには、おそらくアセンブリが必要になります。たとえば、呼び出し元の関数の LR を返す純粋なアセンブリ関数を記述し、その関数を C コードから呼び出すことができます。

たとえば、 からmainを実行することができますx = lr_return_func();。ここで、は で使用される LR (関数パラメーターの上のスタックに格納される) をレジスタ R0 (戻り値に使用される) にlr_return_func()コピーする純粋なアセンブリ関数です。戻ると、この LR は格納されます(たとえば、メインに戻るレジスタ) mainlr_return_funcx

インラインで行うこともできますが、ローカル変数が最初に使用しているレジスタを特定する必要があります。xたとえば、それが R4 に格納されていると判断した場合、インライン アセンブリは LR を R4 にコピーし、完了する必要があります...基本的に LR を に格納しますx

于 2013-09-10T16:52:53.507 に答える
1

EmbSys Registers と呼ばれる Eclipse 用の優れたツールがあります。たまに遅れるけど本当に便利

于 2013-11-06T14:13:37.760 に答える