こんにちは、 @HQZ
パッシブパーティションに有効なイメージが存在することを確認しましたか?電源投入後にリセットせずに実行中のターゲットにデバッガーを接続すると、どのような現象が観察されますか?デバイスはJTAGリカバリーモードに入りましたか?あるいは、デバッガでデバイスをリセットしてから、アプリケーションのエントリーポイントに到達したかを確認することもできます。
デバイスがアドレス0x2040012Cで無限ループに陥っている場合、JTAGリカバリモードに入ったことを示しています。これはIVTの設定やIVTの整合性に問題がある可能性もあります。
また、パッシブパーティション内のイメージは、アクティブパーティションのアドレス空間(つまり、0x00400000から始まるアドレス空間)から実行されるようにリンクされていますか?
最後に、セキュアブートを使用していますか?
よろしくお願いいたします。
ルーカス
こんにちは@lukaszadrapa
プラットフォーム:S32K344、AB-Swapアーキテクチャ。独立したファームウェアイメージはアクティブブロックとパッシブブロックに別々に保存されます。HSEのセキュアブートは無効になっています。問題の説明:アクティブ/パッシブパーティションスイッチを完了するためにHSE_ActivatePassiveBlock()を呼んだ後、電源を入れ直してリセットした後、デバイスはターゲットファームウェアを自動で起動できません。しかし、J-Linkデバッガがチップにコネクテッドされていて、デバッガソフトウェア内で「アプリケーション開始」をクリックすると、交換したファームウェアは通常通り動作します。追加の背景:ファームウェアはパーティションAとパーティションBの両方に存在します。両画像の違いはLEDの点滅周波数だけです。パーティションAのファームウェアは0x400000からリンクされ、パーティションBのファームウェアは0x600000からリンクされています。HSE_ActivatePassiveBlock()を呼び出してリセットした後、J-Linkでフラッシュの内容をダンプしました。パーティションAとパーティションBの内容が物理的に入れ替わっており、HSE_ActivatePassiveBlock()が有効であることが確認されています。質問:1. この行動の根本原因は何でしょうか?なぜコールド電源起動はデバッガーでトリガーされる「アプリケーションの開始」と異なる挙動をするのでしょうか?2. ABパーティションスワップ後の自動起動失敗を解決できる現実的な解決策は何ですか?ご支援ありがとうございます。
[[ ## completed ##]]
こんにちは、 @HQZ
「パーティション B のファームウェアが 0x600000 からリンクされている」 - これが問題です。アクティブなパーティションアドレス(0x400000)を使用するには、両方のイメージがリンクされている必要があります。アプリケーションは常にアクティブパーティションから動作しており、パッシブパーティションからではありません。
解決策:両方のプロジェクトで同じリンカーファイルを使用する。
これはデバッガと連携して動作します。なぜなら、デバッガはプログラムカウンタをELFファイル内のエントリポイントアドレスに「手動で」設定するからです。
よろしくお願いいたします。
ルーカス