私のプログラムを実行するときにハードフォールが発生しています。私はPCの価値を得るために何十もの方法を見つけましたが、私はKeil uVision 5を使用しています。Cortex M0 HardFault_Handlerとフォールトアドレスの取得
私が知る限り私はマルチタスクのコンテキストではなく、PSPには0xFFFFFFF1が含まれているため、24を追加するとオーバーフローが発生します。
は、ここで私は(それがコンパイルおよび実行、のように)作業を取得するために管理してきたものだ:
enum { r0, r1, r2, r3, r12, lr, pc, psr};
extern "C" void HardFault_Handler()
{
uint32_t *stack;
__ASM volatile("MRS stack, MSP");
stack += 0x20;
pc = stack[pc];
psr = stack[psr];
__ASM volatile("BKPT #01");
}
注C関数スタックを補うためにここにある「+ = 0x20に」、。
私がPCの値を読むときはいつでも、それは0です。 誰かがそれに対応するコードを持っていますか?
そうでない場合は、ここで私は手動でそれを行う方法は次のとおりです。
- が破断すると、MSP
- ようになり
- HardFault_Handlerに(元の)にブレークポイントを置いて、その値に24を追加します。
- そのアドレスのメモリをダンプします。 それは0x00000000です。
私は間違っていますか?
ありがとうございました。精度と欠落したコードを追加しました。私のコンパイラ/アセンブラは実際に "MRS R0、MSP"をサポートしていませんが、私の "MRSスタックMSP"の結果は同じです。それは私をたくさん制限します、それはどんなレジスタも理解していないようです。これまでコンパイラで動作する__attribute __((naked))に相当するものは見つかりませんでしたが、とにかくこれが全体的に正しいことを確認しました。それについて考えていなかったヌルポインタのヒントについて、ありがとうございました。 – user1532080
あなたの答えに基づいて、スタックにプッシュされたLRの値を見ました。それは有効な場所を指しているので、それはありがとう!ありがとう! – user1532080