2384165_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2384165_ja-JP

2384165_ja-JP

S32K358 eMIOS ISRが85℃で停止
親愛なるNXPサポートチームへ、
S32K358において、約85℃の温度試験中に問題が発生しています。

 

私たちのアプリケーションでは6つのeMIOSチャネルを使用し、それぞれが200Hzの周波数で両方のPWMエッジで割り込みを生成するように設定されています。
 
85°Cでは、MCUが時々1つのeMIOS ISR内に閉じ込められることがあります。ISRは終了しません。コードがeMIOSレジスタを読み取り割り込みフラグを確認するためですが、フラグは0(ファイルEmios_Mcl_Ip_Irq.c)です
 
もし (0U != ((Emios_Ip_paxBase[インスタンス]->CH.UC[チャネル]。S) & (uint32)eMIOS_S_FLAG_MASK))
 

デバッグの結果、問題が発生するとeMIOSのベースアドレスを含む変数がNULL(Emios_Ip_paxBase)であることに気づきました。アプリケーションが正しく動作すれば、同じポインタが有効で、eMIOSレジスタも正しく読み込まれます。

ある条件下では、ISR実行中にeMIOSペリフェラルへの参照が破損またはクリアされているようです。

 

スタックオーバーフロー、メモリ破損、同時アクセス、ISR処理、温度関連の挙動など、既知の問題や根本原因について何か兆候はありますか?

 

よろしくお願いいたします。
サイモン
Re: S32K358 eMIOS ISR stuck at 85°Cこんにちは、ベインさん。
現在、RTD 7.0.0を使用しています。
Re: S32K358 eMIOS ISR stuck at 85°C

こんにちは、 @simon98さん

どのRTDバージョンを使用していますか?追加情報があれば助かります。

また、RTD バージョン 6.0.0 より前のバージョンでは、関数スコープ内の静的変数のメモリ マッピングが正しくないことに関連する既知の問題がありました (ARTD-159985)。

この問題は、Emios_Mcl_Ip.c で定義されている変数 Emios_Ip_paxBase に関する問題です。また、Emios_Mcl_Ip_Irq.c には、一貫性のない初期化特性が割り当てられています。詳細はソフトウェアリリースノートに記載されています。


BR、VaneB

Re: S32K358 eMIOS ISR stuck at 85°C

こんにちは、 @simon98さん

観察された挙動を再現できる簡単なアプリケーションを教えていただけますか?また、カスタムボードを使っているのか評価ボードなのか確認してもらえますか?

さらに、問題が85°Cで発生していることを確認するための検査方法について教えていただけますか?

Re: S32K358 eMIOS ISR stuck at 85°C

こんにちは、 @simon98さん

この情報を提供していただき、誠にありがとうございます。

コードがEMIOS1_1_IRQで詰まっているようで、あなたの設定からeMIOS 1チャンネル19に対応しているため、この特定の部分に分析を絞り込んでみます。

デバッグを簡素化し、他のモジュールからの干渉を排除するために、このeMIOS構成のみを含む最小限のテストプロジェクトを作成してください。これにより、問題の動作を特定し、根本原因をより深く理解するのに役立ちます。参考までに、スレッド S32M27x/S32K3 – eMIOSの利用法で示されている例を確認できます。

同じ現象は依然として発生しますか?また、評価ボードがあるなら、同じコードをそこで試せたら素晴らしいです。

Re: S32K358 eMIOS ISR stuck at 85°C

こんにちは、 @VaneB さん

現在、カスタムボードでS32K358を使ってこれらのeMIOS_1チャンネルを使って200HzのPWMを生成しています:ch3、ch9、ch11、ch12、ch13、ch19。コードはSIMulinkを使用して生成されます

自作の基板を85℃の恒温恒湿槽に入れたところ、しばらくすると動作が停止する現象が見られました。

S32DS (3.6.7) でデバッグしていたときISR(EMIOS1_1_IRQ)に組み込まれていることが分かり、エントリ/エグジット近くのカスタムカウンターやEmios_Pwm_IrqHandler・Emios_Pwm_Ip_IrqHandler関数にも組み込み、どのコード部分が実行されているかを検出しました。

いくつかのテストの結果、内部で詰まったときに

static void Emios_Pwm_IrqHandler(const uint8 Instance, const uint8 Channel)
{
/* エミオスチャネルでイベントが発生しているか確認してください */
もし(0U != ((Emios_Ip_paxBase[インスタンス]->CH.UC[チャネル]。S) & (uint32)eMIOS_S_FLAG_MASK))
{
/* EMIOSチャネルでイベントが発生しているか確認してください */
もし(0U != ((Emios_Ip_paxBase[インスタンス]->CH.UC[チャネル]。C) & ((uint32)(eMIOS_C_DMA_MASK | eMIOS_C_FEN_MASK)))
{
Emios_Pwm_Ip_IrqHandler(インスタンス、チャネル);
}
そうでなければ
{
/* 何もしない - 偽の中断があった場合は直ちに戻ってください */
}
}
}
 
if条件:

もし(0U != ((Emios_Ip_paxBase[インスタンス]->CH.UC[チャネル]。S) & (uint32)eMIOS_S_FLAG_MASK))
 
なぜなら、何らかの理由でEmios_Ip_paxBase[インスタンス]が0を指すため、常に0です。つまり、誰も割り込みフラグをクリアしていないため、割り込みフラグは脱出できないループに入ってしまいます。
 
この問題を検出するために使用したコードは以下のとおりです。

static void Emios_Pwm_IrqHandler(const uint8 Instance, const uint8 Channel)
{
uint32_t s;
uint32_t c;
uint32_t s_flag;
uint32_t s_ovr;

dbg_pwm_last_instance = インスタンス;
dbg_pwm_last_channel = チャネル;

dbg_pwm_last_base_addr = (uint32_t)Emios_Ip_paxBase[インスタンス];
dbg_pwm_last_c_addr = (uint32_t)&Emios_Ip_paxBase[インスタンス]->CH。UC[チャネル]。C;
dbg_pwm_last_s_addr = (uint32_t)&Emios_Ip_paxBase[インスタンス]->CH。UC[チャネル]。S;
   
dbg_emiosipirq_static_state1++;

/* もし (インスタンス == 1)
{
スイッチ(チャネル)
{
CASE 16:
dbg_emiosipirq_static_cnt_ch16++;
休憩;

            CASE 17:
                dbg_emiosipirq_static_cnt_ch17++;
                休憩;

ケース18:
dbg_emiosipirq_static_cnt_ch18++;
休憩;

            case 19:
                dbg_emiosipirq_static_cnt_ch19++;
                休憩;

デフォルト:
dbg_emiosipirq_static_cnt_oth1++;
壊す;
}
}
それ以外
ヤージュ
dbg_emiosipirq_static_cnt_oth2++;
} */

/* Lettura reale dei registri vista dal codice */
/* s = Emios_Ip_paxBase[インスタンス]->CH。UC[チャネル]。S;
c = Emios_Ip_paxBase[インスタンス]->CH。UC[チャネル]。C;

s_flag = s & (uint32)eMIOS_S_FLAG_MASK;
s_ovr = s & (uint32)eMIOS_S_OVR_MASK;

dbg_pwm_last_s = s;
dbg_pwm_last_c = c;

dbg_pwm_flag_mask = (uint32)eMIOS_S_FLAG_MASK;
dbg_pwm_ovr_mask = (uint32)eMIOS_S_OVR_MASK;

dbg_pwm_last_s_and_flag = s_flag;
dbg_pwm_last_s_and_ovr = s_ovr;

if (s_flag != 0U)
ヤージュ
dbg_pwm_s_flag_yes++;
}
それ以外
ヤージュ
dbg_pwm_s_flag_no++;
}

if (s_ovr != 0U)
ヤージュ
dbg_pwm_s_ovr_yes++;
}
それ以外
ヤージュ
dbg_pwm_s_ovr_no++;
}

if ((s_flag == 0U) && (s_ovr != 0U))
ヤージュ
dbg_pwm_flag0_ovr1_count++;
}
そうでなければ、((s_flag != 0U) && (s_ovr != 0U))
ヤージュ
dbg_pwm_flag1_ovr1_count++;
}
else if ((s_flag != 0U) && (s_ovr == 0U))
ヤージュ
dbg_pwm_flag1_ovr0_count++;
}
それ以外
ヤージュ
dbg_pwm_flag0_ovr0_count++;
} */

/* EMIOSチャネルでイベントが発生しているか確認してください */
もし(0U != ((Emios_Ip_paxBase[インスタンス]->CH.UC[チャネル]。S) & (uint32)eMIOS_S_FLAG_MASK))
{
dbg_emiosipirq_static_state2++;

/* EMIOSチャネルでイベントが発生しているか確認してください */
もし(0U != ((Emios_Ip_paxBase[インスタンス]->CH.UC[チャネル]。C) & ((uint32)(eMIOS_C_DMA_MASK | eMIOS_C_FEN_MASK)))
{
dbg_emiosipirq_static_state3++;
Emios_Pwm_Ip_IrqHandler(インスタンス、チャネル);
}
そうでなければ
{
dbg_emiosipirq_static_state4++;
/* 何もしない - 偽の中断があった場合は直ちに戻ってください */
}
}
そうでなければ
{
dbg_emiosipirq_static_state5++;
Emios_Pwm_Ip_IrqHandler(インスタンス、チャネル);
Emios_Pwm_Ip_IrqHandler(1, 19);
}
}

Emios_Ip_paxBaseが指すべきアドレスを格納したグローバル変数は以下のとおりです。

dbg_pwm_last_base_addr = (uint32_t)Emios_Ip_paxBase[インスタンス];
dbg_pwm_last_c_addr = (uint32_t)&Emios_Ip_paxBase[インスタンス]->CH。UC[チャネル]。C;
dbg_pwm_last_s_addr = (uint32_t)&Emios_Ip_paxBase[インスタンス]->CH。UC[チャネル]。S;

また、NVICレジスタの実行時を読み取るカスタムコードも入れました。添付すると、Thread、ジェネラルレジスタ、NVICレジスタと変数式、EMIOSレジスタ、6つのテスト用レジスタが入ったファイルがあります。

また、この動作をテストするために使用したS32DSプロジェクトをプライベートメッセージでお送りします。

これらの情報が役に立てば幸いです。何かご不明な点がございましたら、いつでもお気軽にお問い合わせください。

BR、
サイモン

Re: S32K358 eMIOS ISR stuck at 85°Cこんにちは、ベインさん。
今週中に、その動作を再現する簡単なプロジェクトを用意してみます。
Re: S32K358 eMIOS ISR stuck at 85°C

こんにちは、 @VaneB さん

カスタムボードで、eMIOS1チャネル6チャネルのみを含む簡易設定で問題をテストしました。残念ながら、この設定ではエラーを再現できません。アプリケーションは正しく動作し、EMIOS_1_IRQで詰まることはありません。

現在、カスタムボード用に開発したプロジェクト全体をEVBにロードすることが可能かどうかを検討しています。進める前に、カスタムボードとEVBのハードウェアの違いが、予期せぬ挙動やEVBの損傷を引き起こす可能性があるかどうかも知りたいです。

BR、
サイモン

Re: S32K358 eMIOS ISR stuck at 85°C

こんにちは、 @simon98さん

当社の評価ボードは主に室温での使用を想定しており、非常に低温または非常に高温での試験や認証はされていません。

評価ボードは室温範囲外でも使用できますが、その条件下での性能を保証することはできません。

Re: S32K358 eMIOS ISR stuck at 85°C

こんにちは、 @VaneB さん

何度か試みた結果、カスタムボード上で動作するアプリケーションをできるだけ忠実に再現するEVBプロジェクトを作成することができました。特に、すべてのピンを自分のカスタムプロジェクトと同じように設定しました。

このプロジェクトをカスタムボードで85°Cの条件下でテストしましたが、eMIOS ISRの問題は依然として発生し、アプリケーションが固着し続けました。

その後、全く同じプロジェクトをEVB上で同じ温度条件(90℃以上)でテストしましたが、問題は再現できませんでした。EVBはフリーズすることなく正常に動作し続けました。

この時点で、問題の根本原因を特定し、解決策を見つけるために、次にどのような手順を踏むことをお勧めしますか?

追加の情報、測定値、またはデバッグデータが必要な場合は、お知らせください。

完全なEVBプロジェクトと、カスタムボードおよびEVB上のK358の写真を含むZIPファイルを添付しました。

再開まで今しばらくお待ちください。

BR
シモーネ

Re: S32K358 eMIOS ISR stuck at 85°C

こんにちは、 @simon98さん

この問題はカスタムボードで観察されていますがEVBでは見られません。根本原因がハードウェアに関連している可能性を調べる価値があります。

ハードウェア設計をEVBの回路図と比較し、S32K3ハードウェア設計ガイドラインを確認して、関連する推奨事項が適切に実装されているか確認することをお勧めします。

Re: S32K358 eMIOS ISR stuck at 85°C
こんにちは、 @VaneB さん
 
ハードウェア設計は我々側でレビュー済みで、明らかなハードウェア問題は見つかりませんでした。また、ハードウェア設計や動作条件が異なるため、NXP EVBとは直接比較できません。
 
お客様がカスタムボードで温度に関する問題を観察した場合、NXPから一対一のサポートをどう受けることができるのでしょうか?
 
BR、
サイモン
タグ(1)
評価なし
バージョン履歴
最終更新日:
金曜日
更新者: