2401712_ja-JP

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

2401712_ja-JP

2401712_ja-JP

S32K3 ADCのDMAストリーミング最適化

こんにちは、

ADCグループが1つのチャネルしか持たず、AdcのEnable Optimized DMA Streaming Groupsの設定項目がチェックされている場合、Adc_Ipw_SetupTcdSingleAdcChannelMajorLink関数の実行時にハードフォルトが発生します。

単一チャネルの場合、Adc Group Without Interruptsの設定項目がチェックされACCESS_MODE_STREAMINGされた場合、「Select Adc Streaming DMAチャネル」が有効になります。それ以外の場合は、設定ファイルのDMAチャネル数は255で、これは妥当な数値です。しかし、私が理解できないのは、ADC_ENABLE_GROUP_STREAMING_RESULTS_RORDER または ADC_OPTIMIZE_DMA_STREAMING_GROUPS が STD_ON の場合、STD_ON==GroupPtr ->AdcWithoutInterrupt の代わりに Adc_Ipw_SetupTcdSingleAdcChannelMajorLink 関数が呼び出される理由です。これは不合理に思えるし、この関数を呼び出すとハードフォルトが発生するからでもある。

Jason22_0-1785831767968.png

BR、

ジェイソン


Re: S32K3 ADC Optimize DMA Streaming

こんにちは、@ Jason22

次回はQQのメールアカウントを使用しないでください。代わりに会社のメールアドレスをご利用ください。

試してみましたが、問題は見つかりませんでした。

参考までに、テストプロジェクトとテスト結果を添付しました。


また、あなたのコードを確認したところ、いくつかエラーが見つかりました。

1.clock initが間違っている、コードが正常に動作しないはずがない。

Senlent_0-1785915417329.png


2. adc_group0_valは「キャッシュ不可領域」の属性であるべきです


また:

DMAストリーミンググループの最適化の使い方はユーザーマニュアルに明確に説明されています。

RTD_ADC_UM.pdf

Senlent_0-1785915908665.png



Re: S32K3 ADC Optimize DMA Streaming

こんにちは、@ Jason22

これが私のテスト結果です。私が提供したプロジェクトを使用し、最適化レベルを-O0に設定している場合、私たちの観察結果は同じになるはずです。

私はここに何の問題もないと思います。境界を超えた場合は確実にハードフォルトに入るはずですが、テスト結果はそうでなく、これはコンパイル最適化レベルが原因であることを意味しています。エラー状態下では、分析を続ける必要はありません。

Re: S32K3 ADC Optimize DMA StreamingHi@Senlent

この問題を設計チームに報告してくださり、誠にありがとうございます。最終結果がある場合、どこで確認すればよいですか?もし実際にエラーが発生した場合、SW32K3_S32M27x_RTD_R23-11_7.0.0_D2511_ReleaseNotes.pdf のような文書で公開されるのでしょうか?

BR、
ジェイソン
Re: S32K3 ADC Optimize DMA Streaming

こんにちは、@ Jason22

デザインチームのフィードバックをお送りします。

通常、重大な影響を及ぼすバグの場合は、新しいバージョンで修正版をリリースし、リリースノートに記載します。

Re: S32K3 ADC Optimize DMA StreamingHi@Senlent

LogicChが255だとわかってよかったです。あなたのプロジェクトでは正しく動作しますが、これはアクセス範囲外ですよね?「境界を超えた場合は、必ずハード断層に入るはずだ」というあなたの発言についてですが、私は完全には同意できません。C言語では、C++のようなランタイム境界チェックはありません。ポインタ配列の場合、ハードフォルトが発生するかどうかは、境界外アクセスから得られる値に依存します。

ポインタ配列を考えてみましょう: uint32* pArr[2] = {0x20400000, 0x20400004}。pArr のアドレスが 0x204300A0 であると仮定すると、pArr[2] の値はアドレス 0x204300A8 に格納されている値になります。0x204300A8が0x20400008を含む場合、*pArr[2](アドレス0x20400008の値を最終的に読み取る境界外アクセス)はハードフォルトを発生させません。ただし、0x204300A8 に 0x1FFFFFF0 が含まれている場合、*pArr[2] (最終的に 0x1FFFFFF0 から読み取る) はハードフォルトを引き起こします。どちらも境界外アクセスですが、ハードフォルトが発生するかどうかは確率のマターです。

正確には、ハードフォルトは境界外アクセス自体が直接原因ではなく、境界外のポインタ配列へのアクセスが無効なポインタを受け取り、その不正なポインタにアクセスするとハードフォルトがトリガーされるためです。

だからこそ、あなたのプロジェクトではDma_Ip_pxInit->ppxLogicChannelConfigArray[255]->LogicChId.HwChIdにアクセスするとハードフォルトは発生しませんが、私のプロジェクトではハードフォルトが発生します。
BR、
ジェイソン
Re: S32K3 ADC Optimize DMA Streaming

こんにちは@Senlent

はい、あなたのプロジェクトを一切変更せずに使用しました。あなたのビデオでは、 Dma_Ip_ConvertLogicChToHwCh 関数は間接的に呼び出されます Mcl_Initは意図された動作ではありません。意図された動作は Adc_Ipw_SetupTcdSingleAdcChannelMajorLink 間接的に呼びかける Dma_Ip_ConvertLogicChToHwCh 。私のビデオではこれを実証しています。 Mcl_Init で、すべてのブレークポイントをスキップし、その後 Mcl_Init 完了したので、ブレークポイントを再度有効にしました。その時点で、 Dma_Ip_ConvertLogicChToHwCh 再び入力され、 ロジックCh 255でした。

BR、

ジェイソン

Re: S32K3 ADC Optimize DMA Streaming

こんにちは@Senlent

ご返信いただき、誠にありがとうございます。会社のメールアドレスを使って新しいアカウントを登録し、このスレッドが終了した後はそのアカウントを使う予定です。

あなたのプロジェクトを実行しましたが、ハードフォルトは発生していませんでした。しかし、私の疑問は依然として残ります。以下のスクリーンショットに示すように、function Adc_Ipw_SetupTcdSingleAdcChannelMajorLink DMAチャネルの DMA_IP_CH_SET_MAJORLOOP_LOGIC_LINK_CH パラメータを設定します。 Dma_Ip_ConvertLogicChToHwCh が呼ばれると、 LogicCh 値は255.Dma_Ip_pxInit->ppxLogicChannelConfigArray はサイズ2の Dma_Ip_paxLogicChannelConfigArrayPB array を指しています 。アクセス Dma_Ip_pxInit->ppxLogicChannelConfigArray[255] は境界 外アクセスであるはずです。ハードフォルトは発生しませんでしたが、これは合理的ではないと思います。

Jason07_0-1785979871220.png

Jason07_1-1785979890128.png

Jason07_2-1785979907208.png

この境界外アクセスは通話によって引き起こされます Adc_Ipw_SetupTcdSingleAdcChannelMajorLink 、それもまた私の疑問です。関連する内容は RTD_ADC_UM.pdf で確認 し、ドライバーコードも確認しました。 最適化DMAストリーミンググループ(単一チャネル)では 、データはCDRから直接ユーザーバッファへ転送されます。マルチチャネルの場合とは異なり、まずCDRから DmaIntermediateBuffer へデータが移動され 、そこからユーザーバッファへ移動されますOptimize DMA Streaming グループ(単一チャネル) ストリーミングDMAチャネルは使用していません。設定ファイル内の AdcIpwConfigPtr->Mapping.AdcCountingDmaChanLogicId arrayの値は確かに ADC_IPW_INVALID_DMA_CHANNEL_ID (255)です。

Jason07_3-1785980010767.png

なぜそうなのか理解できません Adc_Ipw_SetupTcdSingleAdcChannelMajorLink まだ電話をかけてないと。本来呼び出すべき関数は Without Interrupt グループ (single チャネル)ですが、wh ADC_ENABLE_GROUP_STREAMING_RESULTS_RORDER or ADC_OPTIMIZE_DMA_STREAMING_グループ is STD_ON、代わりに STD_ON == GroupPtr ->AdcWithoutInterrupt, the Adc_Ipw_SetupTcdSingleAdcChannelMajorLink functionが呼ばれます。

Jason07_4-1785980037684.png

プロジェクトで問題を発見しました。「データセクション」のチェックを外すと、ハードフォルトが発生しなくなります。しかし、私はこれが問題の本質的なポイントだとは思いません。

Jason07_5-1785980062079.png

BR、

ジェイソン

Re: S32K3 ADC Optimize DMA Streaming

こんにちは@Senlent

前回の返信の画像は鮮明ではありません。画像を添付ファイルとして再度アップロードしました。写真の順番を番号で示しました。

BR、

ジェイソン

Re: S32K3 ADC Optimize DMA Streaming

こんにちは、@ Jason07 @Jason22

最適化ビルドオプションを -O0 に設定してください。

これは、ステップ実行デバッグ中に私が確認した結果です。

Senlent_1-1786003373031.png


これはおそらく、ビルド最適化オプション(-Os)によってデバッガーがソースコード変数を正確にマッピングできなくなるためでしょう。



Re: S32K3 ADC Optimize DMA Streaming

こんにちは@Senlent

私のプロジェクトの最適化レベルは -O0で、あなたのプロジェクトを実行しました (これも -O0 で)。 Adc_Ipw_SetupTcdSingleAdcChannelMajorLink -> ...... -> Dma_Ip_ConvertLogicChToHwCh  ロジックCh 値は依然として255です。

1.png

あなたのスクリーンショットでは、 Dma_Ip_ConvertLogicChToHwCh 結果として呼ばれる Adc_Ipw_SetupTcdSingleAdcChannelMajorLink ? Mcl_Init また Dma_Ip_ConvertLogicChToHwChも呼びますが、その場合 LogicCh 0で、あなたのスクリーンショットと一致しているように思えます。

あなたのプロジェクトでテストを実行しました。 Adc_Ipw_SetupTcdSingleAdcChannelMajorLink 間接的に呼び出す Dma_Ip_ConvertLogicChToHwCh で、私は次のことを確認しました。 &Dma_Ip_pxInit->ppxLogicChannelConfigArray[LogicCh]  0x429F28に一致します &Dma_Ip_pxInit->ppxLogicChannelConfigArray[255]

2.png

その後、アドレスの値を変更しました。 0x429F28  0x1FFFFFF0にアクセスし、348 行目のコードを実行しました。

3.png

ハードフォールトが発生し、 BFAR 価値は 0x1FFFFFF6 、予想通りです。

4.png

これにより、アウトオブバウンズアクセスが実際に存在することが確認されています。ハードフォルトが発生するかどうかは、 Dma_Ip_pxInit->ppxLogicChannelConfigArray[255]の値に依存します。

Re: S32K3 ADC Optimize DMA Streaming

こんにちは、@ Jason22

これはおかしい。何度も試してみたのに。私が提供したELFファイルは直接デバッグできます。

Re: S32K3 ADC Optimize DMA Streaming

こんにちは@Senlent

私の操作が正しかったかどうか確信が持てません。あなたのELFファイルを使ってデバッグを試みましたが、うまくいきませんでした。

1.png

私の動画で示した手順を同じように行ってもらえますか?この問題の再現が可能だと思います。

手順は以下の通りです。

  1. 行にブレークポイントを設定します Mcl_Init(NULL_PTR);

  2. ブレークポイントに到達するまでプログラムを実行します。 Mcl_Init(NULL_PTR);

  3. すべてのブレークポイントを無効にする( 「すべてのブレークポイントをスキップ」ボタンをクリック)。

  4. 跨いで Mcl_Init(NULL_PTR);( 「すべてステップ」ボタンをクリックします)

  5. ブレークポイントを再度有効にし( 「すべてのブレークポイントをスキップ」ボタンをクリック)、そして「再開」ボタンをクリックします

あなたはそれを見ます Dma_Ip_ConvertLogicChToHwCh 再び入力され、 ロジックCh 255です。

BR、

ジェイソン

Re: S32K3 ADC Optimize DMA Streamingこんにちは、@Senlent
ごめん。ステップ4は、「ステップオーバー」ボタンをクリックすることです。
BR、
ジェイソン
Re: S32K3 ADC Optimize DMA Streaming

こんにちは、@ Jason22

もしかしたら、あなたの質問の意味がまだよく理解できていないかもしれません。このプロジェクトは想定通りに動作しているでしょうか?そうだとすれば、何か問題がありますか?

LogicChでは255と表示されていますが、プログラムは通常通り動作しています。これのどこがおかしいのでしょうか?

Re: S32K3 ADC Optimize DMA Streaming

こんにちは、@ Jason22

この問題は設計チームに確認してもらえます。

RTDドライバーの設計者は私ではないので、ユーザーが問題に直面しない限り、なぜこう設計したのかは詳しくは触れません。

このフィードバックプロセスは長くなるかもしれませんが、その成果を関連するデザインチームに伝えます。

タグ(1)
評価なし
バージョン履歴
最終更新日:
金曜日
更新者: