STM32F4 で、CPU レジスタを読み取るにはどうすればよいですか?
これらのレジスタはメモリ内のどこかにマップされていますか?
そうでない場合は、レジスタ (LR など) をローカル変数に読み込むための簡単なアセンブリ コードを提供していただけますか?
ありがとう。
STM32F4 で、CPU レジスタを読み取るにはどうすればよいですか?
これらのレジスタはメモリ内のどこかにマップされていますか?
そうでない場合は、レジスタ (LR など) をローカル変数に読み込むための簡単なアセンブリ コードを提供していただけますか?
ありがとう。
Keil ツールチェーンでは、次のアプローチを使用しました。
register int R0 __asm("r0");
ここで、「R0」はコンパイラによって変数として認識されるようになりました。
「名前付きレジスタ変数」を検索します。例:
http://www.keil.com/support/man/docs/armcc/armcc_chr1359125006491.htm
まず、単にプログラムの実行をのぞき見したいだけなら、ARM 用 IAR Embedded Workbench ( IAR EWARM ) サイズ制限バージョン (試用期間の終了日なし) をダウンロードしてください。
しかし、本当にコードでそれを行いたい場合は、どのレジスターを読み取りたいか、それらで何をしたいか、およびコンパイラーがそれらを何に使用するかによって異なります。
汎用レジスタが使用されますが、コンパイラはそれらを使用することを決定するため、基になるアセンブリを理解してそれらが表すものを理解する必要があります。
通常、ローカル変数は GPR に格納されるため、この場合、(c コードで) ローカル変数の値を読み取ることは、基本的にレジスタ読み取りを実行することになります。
LR などの専用レジスタを読み取るには、おそらくアセンブリが必要になります。たとえば、呼び出し元の関数の LR を返す純粋なアセンブリ関数を記述し、その関数を C コードから呼び出すことができます。
たとえば、 からmain
を実行することができますx = lr_return_func();
。ここで、は で使用される LR (関数パラメーターの上のスタックに格納される) をレジスタ R0 (戻り値に使用される) にlr_return_func()
コピーする純粋なアセンブリ関数です。戻ると、この LR は格納されます(たとえば、メインに戻るレジスタ) main
。lr_return_func
x
インラインで行うこともできますが、ローカル変数が最初に使用しているレジスタを特定する必要があります。x
たとえば、それが R4 に格納されていると判断した場合、インライン アセンブリは LR を R4 にコピーし、完了する必要があります...基本的に LR を に格納しますx
。
EmbSys Registers と呼ばれる Eclipse 用の優れたツールがあります。たまに遅れるけど本当に便利