NXPチームの皆様、こんにちは。
私はS32K312 Cortex-M7を使い、S32 Design StudioとAUTOSAR RTD 7.0.1 / AUTOSAR 4.9を使って作業しています。
現在、MC_RGMのリセット動作、特にSWT0機能リセット、機能リセットエスカレーション、破壊的リセット、SRAM保持、SBAF/リカバリ動作、およびPower IPリセットAPIのテストを行っています。
1. SWT0機能リセットエスカレーション
私はSWT0タイムアウトを使用して機能リセットを生成しています。
私のMC_RGMの設定は以下のとおりです。
MC_RGM_FRET_FRET((uint32)15U)
MC_RGM_DRET_DRET((uint32)0U)
機能リセットカウンタが増加していることを確認しました。
SWT0機能リセット#1 -> FREC = 1
SWT0機能リセット#2 -> FREC = 2
...
SWT0機能リセット#14 -> FREC = 14
次のSWT0リセット後、FRECはクリア/リセットされますが、期待される動作は確認できませんでした。
DES[MC_RGM_FRE] = 1
私の質問は以下のとおりです。
2.すべてのSWT0機能リセットを破壊的なものにしたい
テスト目的で、以下のことも達成したいと考えています。
SWT0タイムアウト
↓
機能リセット
↓
即時破壊リセット
15回も機能リセットを待つ代わりに。
以下の設定で実現できますか:
FRET = 1U;
具体的には:
私の理解では、S32K3xxリファレンスマニュアルでは、SRAMやシステムメモリは機能リセット後も保持されるべきです。
SRAMテスト変数を作成しました。
#define SRAM_TEST_ADDR ((volatile uint32_t *)0x204007d4U)
そして、それを使って機能リセット後のデータ保持状況を確認する。
しかし、機能リセット後にSRAMデータが消去/ゼロに書き換えられていることを確認しました。
私の質問は以下のとおりです。
また、Power IPを使って直接的なソフトウェア破壊リセットもテストしています:
Power_Ip_Init(&Power_Ip_HwIPsConfigPB);
gVar= Power_Ip_GetResetReason();
for (count = 0; count < 10125000; count++);
Power_Ip_PerformReset(&Power_Ip_HwIPsConfigPB);
現在のMC_RGM構成には以下が含まれます。
static const Power_Ip_MC_RGM_ConfigType Power_Ip_MC_RGM_ConfigPB =
ヤージュ
(MCU_DEST_RESET)
...
MC_RGM_FRET_FRET((uint32)15U)
MC_RGM_DRET_DRET((uint32)0U)
};
破壊的なリセットが発生するが、デバッガーは通信を繰り返し失い、再確立する。
次のようなメッセージを見かけます。
情報: DAP IDCODE = 0x6BA02477
情報:DAPの電源投入に成功しました。DP CTRL/STAT = 0xF0000000
複数回繰り返され、続いて次のもの:
割り込みコマンドを受信しました。執行を停止します。
理解したいのは以下の点です。
直前にブレークポイントを確実に到達することはできません:
Power_Ip_PerformReset(&Power_Ip_HwIPsConfigPB);
APIの前に遅延を設定し、デバッガがアクセスを得るのに十分な時間があると期待していました。
場合によっては、ターゲットを手動で一時停止してから実行を再開した後に初めてブレークポイントに到達することがあります。
理解したいのは以下の点です。
私のRTDは以下を提供します:
void Power_Ip_Init(
const Power_Ip_HwIPsConfigType *HwIPsConfigPtr);
void Power_Ip_SetMode(const Power_Ip_ModeConfigType *ModeConfigPtr);
void Power_Ip_PerformReset(
const Power_Ip_HwIPsConfigType *HwIPsConfigPtr
);
Power_Ip_ResetType Power_Ip_GetResetReason(void);
Power_Ip_RawResetType Power_Ip_GetResetRawValue(void);
現在使用しているもの:
Power_Ip_Init(&Power_Ip_HwIPsConfigPB);
そして:
gVar = Power_Ip_GetResetReason();
私のモード設定はPOWER_IP_RUN_MODEです。
以下の点についてご説明をお願いします。
環境
MCU:S32K312
コア:Cortex-M7
S32DS:S32 Design Studio
AUTOSAR:4.9
RTD: 7.0.1
リセット元: SWT0
フレット: 15
DRET: 0
試験用の申請書を全部ご用意できます、Power_Ip_PBcfg.c。リンカー構成、MC_RGMレジスタキャプチャ、および必要に応じてデバッガーログ。
よろしくお願いします。
こんにちは、 @Sharif417 さん。
1. SWT0機能リセットエスカレーション
SWT0_RSTdoes S32K312 FRECに参加し、FRECが15に達するとDES[MC_RGM_FRE]が設定されます。Power_Ip_GetResetReason()を呼び出して「MCU_MC_RGM_FRE_RESET」を返すことで読み取れるはずです。
降格されていない機能リセット源(MCRGM.を通じて)はFERD は FREC のインクリメンションの対象となります。
Power_Ip_Init()はMC_RGMをクリアするので覚えておいてください。DES(値を保存した後)なので、電源モジュールを初期化する前にレジスタ値を取得するか、リセット理由を読み込むようにしてください。
回復モードは、閾値が>8の場合、回復モードがデフォルトで「8」に設定されているため、これに影響を与える可能性があります。sBAFはFRETではなくDRETにも干渉することがあります .「0」の場合、0xFに変わるのがわかります:
Julin_AragnM_0-1788816978772.pngJulin_AragnM_0-1788816978772.pngJulin_AragnM_0-1788816978772.pngJulin_AragnM_0-1788816978772.pngJulin_AragnM_0-1788816978772.pngJulin_AragnM_0-1788816978772.png
アプリケーションを継続的に実行すると、15回目の機能リセット後にアプリケーションやデバッガが停止し、期待される破壊的なリセットを観察できません。これがリセットシーケンス、SBAF復旧、またはデバッガに関連しているのか知りたいです。
デバッガを接続したままにしようとする代わりに、15回目の機能リセット後に接続を試みるか、UARTなどでリセット理由を印刷してみることはできますか?
2. すべてのSWT0機能リセットを破壊的なものにしたい
3. SRAMデータは、機能リセットのたびに消去されます。
スタンバイRAMがクリア/書き換えられる理由は、デフォルトのstartup_cm7.sによるものです。S32DSによって提供される機能は、リセット理由(POR、破壊的、機能的)に関係なく、SRAM全体を初期化します。機能リセットが発生した際に、割り当てられたスタンバイRAMをSRAMの初期化がスキップするように修正する必要があります。以下のコミュニティ投稿を参照してください: S32K311 スタンバイ RAM 保持。
4. 直接ソフトウェア破壊的リセット
Julin_AragnM_1-1788817136992.pngJulin_AragnM_1-1788817136992.pngJulin_AragnM_1-1788817136992.pngJulin_AragnM_1-1788817136992.pngJulin_AragnM_1-1788817136992.pngJulin_AragnM_1-1788817136992.png
5. Power_Ip_PerformReset() 前のブレークポイントの動作
6. Power IPの初期化とPower_Ip_SetMode()
簡単なテストを作成し、FRET=1を設定し、Power_Ip_SetMode( ) APIを通じて機能リセットを行うと報告FRE_RESET確認できました:
Julin_AragnM_2-1788817284857.pngJulin_AragnM_2-1788817284857.pngJulin_AragnM_2-1788817284857.pngJulin_AragnM_2-1788817284857.pngJulin_AragnM_2-1788817284857.pngJulin_AragnM_2-1788817284857.png
よろしくお願いします、
ジュリアン
こんにちは、ジュリアンさん。
ご説明いただきありがとうございます。
S32K312で再度テストを行ったので、2つの点について明確にしておきたいと思います。完全なプロジェクトフォルダを添付しておきますので、設定を確認して動作を再現できます。
設定しました:
FRET = 15U;DRET = 0U;
そして、 125ミリ秒のタイムアウトを設定したSWT0を使用して、機能リセットを生成します。
機能リセットのたびに FREC が増加しているのが観察できます:
SWT0 reset #1 -> FREC = 1
SWT0 reset #2 -> FREC = 2
...
SWT0 reset #14 -> FREC = 14しかし、次のSWT0機能リセットが発生し、 FRET = 15の閾値に達したときに、期待される破壊的リセット状態を観察することができません。
DES[MC_RGM_FRE] = 1また、15回目の機能リセット後もMCUは動作を続け、予想される破壊的なリセット動作は見られません。私のSRAMテストパーティションに保存されているSRAMデータも、そのままの状態を保っています。
以下の方法でリカバリ動作を無効にしました。
IP_DCM_GPR->DCMRWP1 |= (3 << 22);
添付のプロジェクトを確認して、もう少し詳しく教えていただけますか:
専用のSRAMパーティション/セクションを作成し、その領域にテストデータを保存しました。
SWT0機能リセットを繰り返してもSRAMの値が保持されることを確認しました。これは想定どおりです。
しかし、FRETエスカレーションによって破壊的なリセットが発生すると予想される15回目の機能リセット後でも、SRAMの値は依然として残っています。
また、直接的なソフトウェア破壊リセットも試しましたが、リセット後もSRAM値は保持されていました。
したがって、私の見解は以下のとおりです。
SWT0 functional reset
↓
SRAM value retained
15th functional reset / expected FRET escalation
↓
SRAM value still retained
Direct software destructive reset
↓
SRAM value also retainedこのSRAMの挙動がS32K312上で予想されるものなのか、また私のSRAMテスト領域が破壊的なリセットを経ても保持されるメモリ領域にある可能性があるのか、教えていただけますか?
リンカー構成、RTD構成、MC_RGM構成、SWT0構成、テストアプリケーションを含む S32K312プロジェクトフォルダ全体を添付していますので、実際のメモリ配置とリセット設定を確認できます。
再開まで今しばらくお待ちください。
こんにちは、 @Sharif417 さん。
1. 15回目のSWT0機能リセット後、DES[MC_RGM_FRE] = 1が観測されないのはなぜですか?
前述したように、Power_Ip_Init() APIはDESレジスタをクリアするため、リセット理由はPower_Ip_GetResetReason()を使用して読み取る必要があります。
2. FRECがFRET = 15に達した後、MCUは確実に破壊リセットに入るべきか?破壊的なリセットが発生した場合、なぜテストパーティションにSRAMの内容が保持されるのでしょうか?
はい。FRECがFRTで設定された閾値に達している限り、MCUは破壊的なリセットを発行すべきです。破壊的なリセットが行われていないか、変数の位置が間違っているかのどちらかです。
3. 他にMC_RGM/SBAFの設定で不足しているものはありますか?
いいえ。機能リセットエスカレーションの場合、FRETを設定するだけで十分です。
1. このSRAMの挙動がS32K312上で予想されるものか、またSRAMテスト領域が破壊的なリセットを経ても保持されるメモリ領域にある可能性があるのか、明確にしていただけますか?
しかし、そうあるべきではありません。破壊的なリセットイベントの後、すべてのSRAMコンテンツは失われます。
直接的なソフトウェア破壊リセットをどのようにテストしているのか教えてもらえますか?
プロジェクトで Power_Ip_PerformReset() API を使用している場合、それは破壊的ではなく機能的なリセットとして構成されています。
Julin_AragnM_0-1788891886849.pngJulin_AragnM_0-1788891886849.pngJulin_AragnM_0-1788891886849.pngJulin_AragnM_0-1788891886849.png
実は、値を保存してUARTで共有してテストしました。FRDM-A-S32K312はSW2で機能リセットを発行し、FRETは15に設定され、15回のSW機能リセット後にMCU_MC_RGM_FRE_RESETが生成されるのが見えます。これはRTD 6.0.0で発生しています。以下のログをご覧ください。
[RESET] Reason : MCU_F_EXR_RESET (RGM_FES F_FR0)
[RESET] FRE Counter: 0
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 1
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 2
[RESET] Reason : MCU_SW_DEST_RESET (RGM_DES F_DR29)
[RESET] FRE Counter: 0
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 1
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 2
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 3
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 4
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 5
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 6
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 7
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 8
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 9
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 10
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 11
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 12
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 13
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 14
[RESET] Reason : MCU_MC_RGM_FRE_RESET (RGM_DES F_DR6)
[RESET] FRE Counter: 0
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 1
RTD 7.0.1では、あなたが言及したのと同じ挙動が見えます(FREが破壊リセットを主張しなかったり、デバッグャが切断されたりするなど):
[RESET] Reason : MCU_SW_DEST_RESET (RGM_DES F_DR29)
[RESET] FRE Counter: 0
[RESET] Reason : MCU_SW_DEST_RESET (RGM_DES F_DR29)
[RESET] FRE Counter: 0
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 1
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 2
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 3
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 4
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 5
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 6
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 7
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 8
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 9
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 10
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 11
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 12
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 13
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 14
[RESET] Reason : MCU_SW_FUNC_RESET (RGM_FES F_FR29)
[RESET] FRE Counter: 0
これにより、RTD 6.0.0とRTD 7.0.1の間にPower ドライバにいくつかの違いがあり、それがこれらの症状の原因になっているのではないかと考えています。これが設定の問題なのかバグなのか特定できていません。分析の時間をいただき、必要なら社内チームに連絡してください。
よろしくお願いします、
ジュリアン
こんにちは、ジュリアンさん。
ご説明いただきありがとうございます。
ご要望通り、現在使用している ソフトウェアの破壊リセットテストコード/プロジェクト を含むZIPファイルを添付しました。
FRET エスカレーションが RTD 6.0.0で正しく動作するとおっしゃっていましたが、テストで使った RTD 6.0.0の動作するコードやプロジェクト を共有していただけますか?
あなたのRTD 6.0.0の動作コードを参考に、私のRTD 7.0.1プロジェクトと比較して、動作の違いを理解したいと考えています。
また、 RTD 6.0.0とRTD 7.0.1の間でパワードライバーに違いや問題がある可能性があるとおっしゃっていましたが、分析が終わったら RTD 7.0.1 の問題についての調査結果を教えていただけますか?
再開まで今しばらくお待ちください。
よろしくお願いします、
シャリフ
こんにちは、@Sharif417 さん。
Power_Ipドライバーのソースコードを調べたところ、Power_Ip_MC_RGM_GetResetReason()APIで機能リセットエスカレーションカウンタの修正が適用されているのが見えました。そこに3つ目の節が追加され、DESがビットを設定していてFRETレジスタが現在非ゼロを読み取っている場合にFESも入ります。
RTD 6.0.0:
/* If the fields of Destructive Event Status Register (DES) are set then the status of FES register must be ignored */
if (((uint32)0U == ActiveValue) || (MCU_POWER_ON_RESET == ResetReason))
{
...
}
RTD 7.0.1:
/* If the fields of Destructive Event Status Register (DES) are set then the status of FES register must be ignored */
/* If functional reset escalation to destructive reset is disabled, then the status of FES register must be ignored if the fields of Destructive Event Status Register (DES) other than DES[F_POR] are set. */
/* If functional reset escalation to destructive reset is enabled and if the fields of Destructive Event Status Register (DES), other than DES[F_POR], are set, then based on these fields user should check if the cause of the destructive reset was due to functional reset escalation or if it was triggered directly by a destructive reset source, in which case FES needs to be ignored */
if (((uint32)0U == ActiveValue) || (MCU_POWER_ON_RESET == ResetReason) || (((uint32)0U != DesResetStatus) && ((uint32)0U != Power_Ip_pxMC_RGM->FRET)))
{
...
}
これがFESフラグが上書きされる理由です。私の理解が正しければ、ハードウェアは破壊的リセットを正しく実行しているにもかかわらず、リセットモジュールは代わりに機能的リセットを報告している。これは、15回目の機能リセット直後のIP_MC_RGM->DESレジスタを読むことで確認できます:
Julin_AragnM_0-1788976448272.pngJulin_AragnM_0-1788976448272.png
有効な方法は、3番目の節を変更して、MCU_MC_RGM_FRE_RESETイベントがすでに起こっているかどうかを確認することかもしれません。
/* -----------------------------------------------------------------------
* Enter the FES block if:
* a) DES is empty (no destructive reset logged), OR
* b) DES has only the Power-On Reset bit, OR
* c) DES has bits set AND FRE escalation is configured (FRET != 0)
* AND the DES reason is NOT already MCU_MC_RGM_FRE_RESET
* ----------------------------------------------------------------------- */
if (((uint32)0U == ActiveValue) ||
(MCU_POWER_ON_RESET == ResetReason) ||
(((uint32)0U != DesResetStatus) &&
((uint32)0U != Power_Ip_pxMC_RGM->FRET) &&
(MCU_MC_RGM_FRE_RESET != ResetReason)))
RTDドライバの修正はサポートされていないことを覚えておいてください。正しい方法は、SWチームからの公式修正を待つことです。この件については社内チームに報告し、もしあれば彼らからのフィードバックも伝えます。この問題をご指摘いただきありがとうございます。
最後に、あなたのプロジェクトについてですが、Power_Ip_PerformReset()を通じてリセットを発行しているのが見えます。先ほども述べた通り、リセット設定内で「機能リセット」が設定されており、ソフトウェア破壊リセットを発行するには「破壊的リセット」に変更する必要があります:
Julin_AragnM_2-1788976691375.pngJulin_AragnM_2-1788976691375.png
または、ModeSettingConf構造体を追加し、DEST_RESETを選択して、代わりにPower_Ip_SetMode()を呼び出します。
Julin_AragnM_3-1788976695121.pngJulin_AragnM_3-1788976695121.png
よろしくお願いします、
ジュリアン