1

STM32 Cube IDE を使用していますが、次のようなエラー ダイアログが頻繁に表示されます。

failed to insert all hardware breakpoints; 
you may have requested too many hardware breakpoints/watchpoints

私が使用している ARM Cortex M0+ は 4 つのハードウェア ブレークポイントしかサポートしていないため、エラーが発生することはわかっていますが、多くの場合、これでは十分ではありません。これを回避し、4 つ以上のブレークポイントを設定するにはどうすればよいですか?

私は以前、はるかに制限された MCU である STM8 (IAR EWB を使用) を使用していましたが、必要な数のブレークポイントを使用できました。

4

2 に答える 2

0

ハードウェア ブレークポイントのほかに、ソフトウェア ブレークポイントを使用してデバッガーに侵入できます。デバッガーは、コードが RAM に配置されている場合にのみこれをサポートします。これは多くの場合、まったく実用的ではありません。

ライフハックとして、代わりにできることbreakpoint()は、ハードウェア ブレークポイントを含む関数を作成することです。この関数が呼び出されると、ブレークポイントがアクティブになります。

void __attribute__ ((noinline)) breakpoint()
{
    __asm("NOP");     // <---- set a hardware breakpoint here!
    // hello, please Step Out to go to caller location (ex: press Shift-F11)
}

void main()
{
    int x = 1;
breakpoint();             // break into the debugger
    printf("%d\n", x);
    x += 2;
breakpoint();             // break into the debugger, again
    printf("%d\n", x);
}

デバッガーは 内で停止しますbreakpoint()。ブレークポイントの実際の位置を確認するには、ステップ アウトする必要があります。

この手法により、ハードウェア ブレークポイントがシングル ステップなどの対話用に解放され、多くの場合、4 つのブレークポイントで十分です。

ノート:

  • breakpoint()関数の代わりに__asm("BKPT #0") 、デバッガーに入る を使用することもできます。残念ながら、この命令をステップ オーバーする方法はありません (STM32/GDB でテスト済み) ため、実質的に HALT 命令のように動作します。フォルト状態または未使用の割り込み内にブレークポイントを配置するために使用できます。
  • が省略された場合、breakpoint()関数は一度だけ機能するようです__asm("NOP");
  • STM8に関しては、例外的にバイト更新をサポートするフラッシュメモリを備えているため、RAMと非常によく似た方法で動作できます. デバッガーはこれを使用して、ソフト ブレークポイントを必要なだけ挿入できます。
  • ただし、STM8 には 2 つのブレークポイント レジスタしかありませんが、これらはおそらく単一のステッピング専用に使用されます。
  • 他のより強力な ARM Cortex MCU は、6 つまたは 8 つのハードウェア ブレークポイントを持つことができます。
  • GDB (および他のデバッガー) は、ブレークポイントを処理する方法が少し賢くなる可能性があります。たとえば、関数に複数のブレークポイントがある場合、その上のブレークポイントに到達する前に、いくつかのブレークポイントに到達することができないことがよくあります。これは、特定の一般的なデバッグ シナリオで大いに役立つ可能性があります。
于 2021-01-04T17:57:36.783 に答える