1

lpc1788に移植された重い GUI ライブラリを持つファームウェアを開発しています。フォントと画像の処理には 32 MB の SDRAM を使用し、デバイス構成データと共にフォントと bmp のバイナリを格納するために NAND フラッシュを使用しています。
Usage Fault、MemManage フォルト、および Bus Fault を無効にしました。そのため、GUI 機能で何か問題が発生すると、実行がハード フォールトになることがあります。今、私がGUIに使用したライブラリはemWinですまた、ハード フォールトの原因となった機能を知る手段がありません。NAND フラッシュが破損していて、ライブラリが表示するもの (背景画像など) をフェッチしようとすると、ハード フォールトが発生します。このような状況に対処できます。(フラグを使用したコード実装によって) NAND フラッシュが破損していて、バイナリを再プログラムする必要があることが確実にわかっているためです。そうしないと、デバイスが起動するたびにアップすると、ハードフォルトになります。
ただし、他のルーチンによってハード フォールトが発生する場合は、フラッシュ全体を再度プログラムし直す必要はありません。そのため、ハード フォールトの原因がわかっている場合は、ハンドラーを再プログラムする必要があるか、単にいくつかのパラメーターを変更して最後の既知の構成を続行する必要があるかを判断して、それに応じてハンドラーを変更できます。

ハード フォールトの原因となった関数を実行時に特定する方法はありますか? 住所さえあれば十分です。これはできますか?

4

1 に答える 1

4

スタックされたレジスタを報告するハード フォールト ハンドラーを実装します。PC レジスタは、例外が発生した実行アドレスを示します。

例はhereにありますが、例での の使用printfはおそらく賢明ではありません。私が提案するUARTに直接バッファリングされていないものを書きたいと思うでしょう-システムはすでに壊れています-診断を得るために必要なコードが少ないほど良いです。ここでの同様のソリューションでは、値を変数にコピーするだけで、デバッガーでブレークポイントを設定して検査する必要があります。

報告された PC アドレスのコードを確認するには、コンパイラのマップまたはリスト出力ファイルを参照するか、デバッガの PC レジスタにアドレスを直接入力します。

于 2014-05-02T16:07:06.210 に答える