1. 断続的な障害 (数千回の再起動に 1 回発生): u-boot プロセス中にソフトウェアがフリーズします。障害メッセージは「Synchronous Abort」ハンドラ、esr 0x02000000 です。コードを逆アセンブルすると、次の呼び出しパスが明らかになります: initr_pci → pci_init → dm_pciauto_config_device (pci_auto.c:371) →dm_pci_hose_probe_bus (pci-uclass.c:607) → dm_pciauto_prescan_setup_bridge→ `bl dm_pci_get_bdf`と`ret`の後にポインタ0x8202fc20を取得しようとした際に例外が発生しました。問題は、`ret`が誤ったアドレスにアクセスしていたのに対し、`asr`呼び出しは単なるレジスタシフトであり、本質的にエラーが発生しやすい部分(メモリへのアクセスやジャンプ)がないことです。
2. このソフトウェアはCPLDを使用してウォッチドッグ(外部ウォッチドッグ)にアクティブに信号を送ります。問題発生後、PORESETを使用して外部ウォッチドッグをリセットしましたが、失敗しました。
こんにちは、
これはasr命令自体のエラーではない可能性が高い。主な症状は、 ret破損または不正なリンク レジスタから PC をロードし、 0x8202fc20から命令フェッチが発生することです。したがって、異常終了は命令フェッチ時に検出された可能性が高いが、データ破損はそれよりも前に発生したと考えられる。
まず、以下の分野を調査してください。
スタック破損またはスタックオーバーフロー
spをチェックしてください。無効な関数ポインタまたは破損したLR
bl dm_pci_get_bdf 直前と直後の x30/LR 、 SP 、 PC 、およびすべてのレジスタをキャプチャします。メモリ破損
PCIe構成アクセスタイムアウト/エラー
CPUが破損したコードを実行している間もCPLDからウォッチドッグに給料を受けられるため、システムがウォッチドッグのタイムアウトに到達できない可能性があります。また、 PORESETシステムを障害状態に維持しているロジックをリセットしない可能性があり、あるいはそのパルスが必要な幅/シーケンスを満たさない可能性があります。
NXPのドキュメントでは外部ウォッチドッグロジックを独立したリセットトリガーとして説明していますが、その実際のリセットパスと影響を受けるドメインはSoCおよびボードリセットアーキテクチャで検証されなければなりません。
オシロスコープまたはロジックアナライザで確認してください。
PORESETHRESET / システムリセットウォッチドッグポリシーを修正して以下のようにします:
次に最も価値のある成果物は、 PC 、 LR/x30 、 SP 、 ESR 、 FAR 、 SPSR 、および保存された戻りアドレス周辺のスタックの内容を含む完全な例外ダンプです。そのデータがない場合、障害発生箇所は、破損した戻り値が検出された場所を特定するだけであり、破損が発生した場所を特定するものではありません。
よろしくお願いします。