2366572_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2366572_ja-JP

2366572_ja-JP

S32K314 FreeRTOSのスタンバイ移行と実行モードへの復帰

私はS32K314、RDT 7.0.0を使用して割り込みとタスクを組み合わせたプロジェクトを開発しています。およびFreeRTOS 7.0.0。

割り込みとタスクは正常に機能しています。RTCで計測した指定時間が経過した後、実行モードからスタンバイモードに移行し、再び実行モードに戻るコードを実装しました。

システムが実行モードからスタンバイモードに移行し、その後リセットが発生してMCUブートローダーが再び実行されることを確認しました。

しかし、MCUの初期化が開始され、PLLがロックされた後、MCUペリフェラルにクロックを分配するプロセス中にエラーが発生します。POR(起動・再起動)中は正常に動作するため、システムをスタンバイモードに移行するプロセスに何らかのエラーがあると考えられます。

手伝っていただけませんか?

Re: S32K314 FreeRTOS Standby Transition and Return to Run Mode追加情報:

このプロジェクトはスタンバイRAMを定義します。RAMは、BSSの先頭から始まる32キロバイトの領域として割り当てられます。この領域には、スタンバイ状態から復帰した後に必要となるデータが格納されます。

/*--- スタンバイモードへの移行 ---*/
/* RTCタイマーがWKPU0を起動するためのタイムアウトを設定します */ Gpt_StartTimer(GptConf_GptChannelConfiguration_GptChannelConfiguration_RTC, RTC_BASE_CLOCK_HZ * seconds);
/* すべてのOSタスクを一時停止します */
vTaskSuspendAll();
/* クロックモードをスタンバイに初期化します */
Mcu_InitClock(McuClockSettingConfig_Standby);
/* 時計モードを設定します */
Mcu_SetMode(McuModeSettingConf_Standby);

.....(リセット発生)

/*--- MCU初期化 ---*/
/* スタンバイRAM領域をキャッシュ不可に設定する */
MpuConfigurator_AllocateStandbyRamToNonCacheable();
/* キャッシュ不可モードを有効にする */
MpuConfigurator_Enable();
/* MCUモジュールを初期化します */
Mcu_Init(NULL_PTR);
/* 実行モードでクロック設定を初期化します */
if (E_OK == Mcu_InitClock(McuClockSettingConfig_Run)) {
/* ポーリングによってPLLロックを待機する */
while (MCU_PLL_LOCKED != Mcu_GetPllStatus()) {
/* PLLがロックされるまで待機 */
}
/* PLLクロックをシステムに分配する */
Mcu_DistributePllClock(); ← ここでエラーが発生します

Re: S32K314 FreeRTOS Standby Transition and Return to Run Mode

こんにちは@Teruhikoさん

エラーに関する詳細情報を入手できますか?これはどのような種類の障害例外ですか?

https://community.nxp.com/t5/S32K-Knowledge-Base/Example-S32K312-HARDFAULT-Handling-Interrupt-DS3-5-...

https://community.nxp.com/t5/S32K-Knowledge-Base/How-To-Debug-A-Fault-Exception-On-ARM-Cortex-M-V7M-...

https://community.nxp.com/t5/S32K-Knowledge-Base/Fault-handling-on-S32K14x/ta-p/1114447

コードをステップ実行することで、例外が発生する正確な場所を特定することもできます。

DCM_GPRレジスタにエラーがないか確認してください。RM、表231。DCMは、製品ファミリにおける機能と利用可能性を制御します。

リセット後のSRAM初期化が正しく行われなかったことが原因である可能性があります。

それを監視するERMは存在するが、モジュールのクロックはデフォルトではゲートで遮断されている。


ありがとうございました。

BR、ダニエル

Re: S32K314 FreeRTOS Standby Transition and Return to Run Mode

こんにちは@Teruhikoさん

MCUがスタンバイモードを終了した後、デバッガを接続できるようになるはずです。
デバッグを容易にするために、アプリケーションの先頭に無限ループを追加することを検討してください。そうすることで、デバッガーを接続して、そこから実行をステップ実行できます。

volatile int var = 1;

while(var){}

MCU_WAKEUP_REASON の代わりに MCU_POWER_ON_RESET が検出された場合は、次のレジスタを確認してください: DCMROPP1~4。


ありがとうございました。

BR、ダニエル


Re: S32K314 FreeRTOS Standby Transition and Return to Run Mode

こんにちは、danielmartynek-san、

返信が遅くなり申し訳ありません。

システムがスタンバイモードに移行するとJ-TAGとの通信が途絶えるため、詳細なエラー情報を取得できていません。現在、デバッグ用のコードを書いています。

現在分かっていることをお伝えしたいと思います。
私は以下の条件下でリセットの原因を調査しました。
・スタンバイモードへの移行後、RTCタイムアウト後に自動的にリセット復旧します。

→ リセット原因: MCU_WAKEUP_REASON

・スタンバイモードに入った後、スタンバイモード中にWKPU割り込みで復帰した場合のリカバリをリセットする

→ リセット原因: MCU_WAKEUP_REASON

・RTCがスタンバイモードに移行した後、タイムアウトが発生してWKPU割り込みによってウェイクアップした際のリカバリをリセットする

→ リセット原因: MCU_POWER_ON_RESET

リセット係数は正しいと思います。

各リセット要因における起動シーケンスの違いは、何らかの関連があるのではないかと推測される。

エラーの詳細が分かり次第、別途ご回答いたします。


Re: S32K314 FreeRTOS Standby Transition and Return to Run Mode

こんにちは@Teruhikoさん

時計は良さそうだ。

質問が1つあります。POR後にMCUをスタンドアロンで実行した場合(デバッガを使用しない場合)、アプリケーションは正常に動作しますか?
私が質問する理由は、アプリケーションがデバッガー経由で起動されると、デバッガーがシステム初期化の一部を実行するからです。スタンドアロン動作の場合、アプリケーションはこの初期化処理を自身で行う必要があります。スタンバイ状態から復帰すると、MCUはリセットされ、デバッガが切断されるため、動作は実質的にスタンドアロン起動と同じになります。

Re: S32K314 FreeRTOS Standby Transition and Return to Run Mode

こんにちは、ダニエルさん。

返信が遅くなり申し訳ありません。

回路設計に関していくつか疑問点があったので、それが今回の問題とどのように関連しているのか調べていました。

その結果、回路内のポート割り当てに問題があることが判明しました。

スタンバイ状態からの復帰時にリセットが発生すると、MCUに供給される電源電圧が不安定になった。

これまでいただいたすべてのサポートに心から感謝いたします。
どうもありがとうございます。

Re: S32K314 FreeRTOS Standby Transition and Return to Run Mode

こんにちは@Teruhikoさん

Mcu_InitClock(Standby)の設定とは何ですか?

それでも時計のオプションの1つであるべきです。例:表157。オプションA - 高性能モード(CORE_CLK @ 160 MHz)。

「動作が不安定」または「異常な挙動を示す」とは、具体的にどういう意味ですか?


Re: S32K314 FreeRTOS Standby Transition and Return to Run Mode

こんにちは、ダニエルさん

アドバイスありがとうございます。

リセットしたら再接続できました。
コードをステップ実行すると、MCUペリフェラルの初期化は成功するのですが、OSタスクの起動プロセス中に「xSemaphoreCreateRecursiveMutex()」を呼び出すと、プログラムの動作が不安定になります。

さらに、この関数をステップ実行すると、`heap_4.c` の関数 `void * pvPortMalloc( size_t xWantedSize )` の次のセクションで動作が不安定になります。


2026-05-21 190438.png2026-05-21 190438.png

ヒープ割り当てが失敗しているようです。
スタンバイモードに移行する前に、何か手順を踏むべきことはありますか?


Re: S32K314 FreeRTOS Standby Transition and Return to Run Mode

こんにちは、ダニエルさん。

本プロジェクトにおける「実行」モードと「スタンバイ」モードの設定を以下に示します。
ご提供いただいた表157の設定は、実行モードに適用されているものと理解しております。

また、表160のクロック値はスタンバイモードにも適用されていると考えています。RTCが時間を計測し、WKPUが再起動をトリガーできるように、これらのブロックにクロックを設定しています。


<不安定な挙動の説明> コードをステップ実行すると、現在の情報がIDEのコンソール画面に表示されます。前述の「heapVALIDATE_BLOCK_POINTER()」を実行すると、コンソール画面がスクロールし始め、ステップの実行が不可能になります。


<スタンバイモード>

K314_StandbyMode.pngK314_StandbyMode.png


<実行モード>

K314_RunMode.pngK314_RunMode.png

Re: S32K314 FreeRTOS Standby Transition and Return to Run Mode

スタンバイモードへの移行方法は以下のとおりです。

・MCAL MCUモジュールの設定では、スタンバイモードの動作モードとして「STANDBY」が既に選択されています。

・Design Studioの時計ツールでは、「実行」と「待機」用に既に個別の機能グループを作成済みです。


<手順> 1.通常動作モードでは、「Mcu_InitClock(Run)」と「Mcu_SetMode(Run)」の順に関数を呼び出すことで、実行モードで動作させることができます。
...
2. スタンバイモードに移行するには、「Gpt_StartTimer(GptConf_GptChannelConfiguration_GptChannelConfiguration_RTC, RTC_BASE_CLOCK_HZ * seconds)」を呼び出してタイマーを開始します。これにより、指定された時間が経過すると、RTC を介してシステムが自動的に実行モードで起動します。
3.実行中のすべてのOSタスクを一時停止するには、「vTaskSuspendAll()」を呼び出します。
4. 「Mcu_InitClock(Standby)」を呼び出し、続いて「Mcu_SetMode(Standby)」を呼び出し、スタンバイモードに移行します。

vTaskSuspendAll() を呼び出す理由は、以下のリンク先の情報に基づいています。

https://community.nxp.com/t5/S32K/S32K312-Does-FreeRTOS-need-to-be-shut-down-before-entering/mp/1756...

Tags (1)
No ratings
Version history
Last update:
‎05-30-2026 05:05 AM
Updated by: