技術共有

STM32 クラッシュ問題のトラブルシューティング

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

序文

最近、他のプラットフォームのコードを STM32 にマージした後、クラッシュの問題が発生したことを発見したため、STM32 でのクラッシュ問題のトラブルシューティングの原則を全体的に整理したいと思いました。

1. 問題の説明

ここに画像の説明を挿入します
上記はクラッシュ印刷情報の一部です。調査の結果、FreeRTOS のタイマー スタック深度の設定が小さすぎるため、タイマー実行関数で実行されているコンテンツが多すぎて、各ローカル変数によって割り当てられるメモリが不足していることがわかりました。リリースが間に合わず、最終的にクラッシュが発生しました。

FreeRTOS のタイマーについて話しましょう。これは実際には、時間を維持するためのスレッドを作成し、現在のタイマー リストをポーリングしてクエリして、どのタイマーの実行時間が期限切れになっているかを確認するタスクとして理解できます。それ。

したがって、タイマーが使用するメモリ サイズも設定する必要があります。

2. STM32(Cortex M4コア)のレジスタ

ここに画像の説明を挿入します
R0~R12は汎用レジスタです。

R13 はスタック ポインターであり、物理的には 2 つのスタック ポインターがあります。メイン スタック ポインタ (MSP) はデフォルトのスタック ポインタで、リセット後およびプロセッサが処理モードのときに使用するために選択されます。もう 1 つのスタック ポインタは、スレッドでのみ使用できるプロセス スタック ポインタ (PSP) です。モード (RTOS がある場合)

R14 はリンク レジスタ (LR) で、関数またはサブルーチンが呼び出されたときにリターン アドレスを保存するために使用されます。関数またはサブルーチンの終了時に、プログラム制御は、LR の値をプログラム カウンター (PC) にロードすることによって呼び出し元のプログラムに戻り、例外処理中に LR が特殊な EXC_RETURN (例外リターン) に自動的に更新されます。 ) 価値。

たとえば、a は b を呼び出します。このとき、b サブ関数のアドレスが pc ポインターに配置され、a のアドレスが LR に配置されます。b が実行された後、a のアドレスが LR に配置されます。実行用の PC ポインタ。

3. クラッシュ問題の分析

3.1 クラッシュ情報はどこから得られますか?

アームのクラッシュは実際には異常な割り込みです。割り込みが発生すると、プロセッサは現在のタスクのステータスをスタックに保存します。

  • スタックフレーム
    ここに画像の説明を挿入します
    スタック フレームとは、関数呼び出し中に関数パラメータ、ローカル変数、リターン アドレス、その他の情報を保存するために使用されるメモリ領域を指します。

    関数が呼び出されるとき、STM32 はその関数にスタック フレームを割り当てます。スタック フレームのサイズは、パラメータの数、ローカル変数の数、コンパイラの最適化設定などの要因によって異なります。

    上記の情報を組み合わせると、関数がクラッシュしたときにどの関数がクラッシュしたかを取得したい場合は、例外割り込みがトリガーされたときにスタックにプッシュされたスタック フレームを見つける必要があり、このスタック フレームは R13 にあることがわかります。 (スタックポイント) スタックポインタが格納されます。

    クラッシュ処理関数 HardFault_Handler() 内の R13 レジスタのポインタが指す内容を取得し、それを出力する方法を見つけます。

3.2 クラッシュ情報の各キーワードの意味

STM32 マイクロコントローラーは ARM Cortex-M コアを使用します。このコアには 2 つのスタック ポインターがあり、1 つはメイン スタック ポインター (MSP)、もう 1 つはプロセス スタック ポインター (PSP) です。

MSP (メインスタックポインター): メイン スタック ポインタは、主にオペレーティング システムのカーネルまたは割り込みサービス ルーチンに使用されます。

PSP (プロセス スタック ポインター): プロセス スタック ポインタは主にユーザー アプリケーションによって使用されます。

Cortex-M コアがスレッド モードに戻ると、CONTROL レジスタの設定に従って、メイン スタック ポインタ MSP またはプロセス スタック ポインタ PSP に戻ることができます。

PSP は、実行中のユーザー アプリケーションに関連するコンテキストを保存します。具体的には次のものが含まれます。

一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。

Program Counter(PC):指向下一条将要执行的指令。

Processor Status Register(PSR)的值:包含标志位状态。

スタック ポインタ: 前のスタック フレームの位置を保存します。

通常、タスクを切り替えるとき (またはコンテキストを切り替えるとき)、この情報はスタックに保存され、新しいタスクが開始されると、そのコンテキスト情報がスタックから復元されます。

保存される特定のコンテンツは、特定のスケジュール戦略とオペレーティング システムの設計によって異なることに注意してください。

3.3 クラッシュ情報を使用してクラッシュの原因となったポイントを特定する

LR/PCポインタの値を決定する
ここに画像の説明を挿入します
まず、RTOS が使用されているかどうかを判断する必要があります。使用されている場合は、クラッシュ情報が PSP に保存される必要があります。
まずこの情報を読み出す必要があります。次に、LR と PC の値がわかった後、keil5 のデバッグを通じてクラッシュ ポイントを見つけるか、コンパイル プロセス中に生成されたマップ ファイルを通じて対応するクラッシュ ポイントを見つけることができます。
ここに画像の説明を挿入します

3.4 keil5のアドレスから問題点を見つける方法

逆アセンブリウィンドウ内で右クリックします—