Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

みなさん。

Tricore TC399 で作業していますが、uart の受信側 hw FIFO から DMA 経由で DSPR0 メモリへの転送時間を測定してみたいと思います。 この目的のために、私は「KIT_AURIX_TC375_LKのためのUART_DMA_Transfer_1」の例から始めました。
最初にデバッグしてコードを実行しようとしましたが、「Infineon UART_DMA_Transfer_1_KIT_TC375_LK-Training-v01_00-EN」ファイルによると、変数g_correctTransactions=12の値を取得する必要がありますが、予想外に1に等しいことが判明しました。 この問題が何が原因であるのか知っている人がいるかどうかはわかりません。

さらに、私の目的はDMAの転送時間を測定することです。そこで、startとstopという2つのuint64変数を使ってStmモジュールを使うことを考えました。 start 変数は、関数 "(uint64)IfxStm_get(IFXSTM_DEFAULT_TIMER) & TIME_INFINITE;" これは、コマンド IfxAsclin_Asc_write(&g_ascHandle, g_txData, &g_count, TIME_INFINITE); の前に関数 void send_data(void) 内で行われます。
stop 変数は、関数 '(uint64)IfxStm_get(IFXSTM_DEFAULT_TIMER) & TIME_INFINITE;' を介して常にティック数を取り、これは DMA の ISR 内で行われます: void prio_DMA(void)。
この手法が正しく正確かどうかを知りたかったのですが、デバッグするたびに、「開始-停止」(DMA操作の開始から終了までのティック数)操作から異なる結果が得られるためです。

2つのティックの取得が行われる2つのコードを以下に報告します。

ボイドsend_data(ボイド)

{

start=(uint64)IfxStm_get(IFXSTM_DEFAULT_TIMER) & TIME_INFINITE;

IfxAsclin_Asc_write(&g_ascHandle, g_txData, &g_count, TIME_INFINITE); /* TX 経由でデータを送信する */

}

 

ボイドprio_DMA(ボイド)

{

stop=(uint64)IfxStm_get(IFXSTM_DEFAULT_TIMER) & TIME_INFINITE;

g_correctTransactions++;

}

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/measurements-of-DMA-transaction-in-UART-receiver/td-p/656107

0 件の賞賛
7 返答(返信)
Translation_Bot
Community Manager
Community Manager
Community Manager

これは非常に正確である必要がありますが、キャッシュがそれに影響を与える可能性があり、他の割り込み(エンバルされている場合)にも影響を与える可能性があることを常に覚えておいてください。

あなたが期待する時間はどれくらいですか、あなたが得る価値は何ですか、そしてこれらの価値の広がりは何ですか?

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/measurements-of-DMA-transaction-in-UART-receiver/m-p/657340

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは@FD_aurix、ご回答ありがとうございます。

私は8Mbit /秒で5バイトを送信しているので、1バイト(8ビットのデータと開始ビットと停止ビット)の送信に少なくとも1.25マイクロ秒を測定することを期待しているので、合計で6.25マイクロ秒の送信が必要です。 この 6.25 マイクロ秒に加えて、ハードウェア FIFO から DSPR への DMA 転送にどれくらいの時間がかかるかはわかりません。

 

私の主な問題は、サンプルプログラム https://www.infineon.com/dgdl/Infineon-UART_DMA_Transfer_1_KIT_TC375_LK-Training-v01_00-EN.pdf?fileI... を使用すると、 g_transferCount=12になるはずですが、=1になるので、DMA移動終了のISRが12回ではなく1回しか実行されないと思われます。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/measurements-of-DMA-transaction-in-UART-receiver/m-p/657433

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは

デバッガ (例: ラウターバッハ)トレースオプションを使用すると、このメアソールは非常に簡単になります。

あなたの問題については、おそらくあなたは(私がそうであったように)DMAの機能を誤解しています。 取引は振替:-Dとは異なります。 この例では、1 つの転送で構成される 12 のトランザクションがあるため、各転送は 1 つのトランザクションで構成されます。

リンクした例(動作する場合...例のいくつかは機能していないので!

g_correctTransactionsは、文字列送信の最後に 12 に達する必要があります

 

g_transferCount例には存在しませんが、(cfg.transferCount = N_TRANSFER;) これは、各トランザクションの転送数の選択です (1)

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/measurements-of-DMA-transaction-in-UART-receiver/m-p/657695

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

申し訳ありませんが 、@FD_aurix、私はg_correctTransactionsを参照していました。
私には意味がありませんが、ISRに12回入力する必要があるため、その変数の値が12ではなく1である理由です。
いずれにせよ、デバッガの問題である可能性があります。 この目的のために、printfを使用して端末で変数g_correctTransactionsの値を出力できるかどうかを尋ねています。 過去には、デバッガを回避するためにprintfを使用して変数の値を取得しようとしましたが、値が出力される場所がわかりませんでした。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/measurements-of-DMA-transaction-in-UART-receiver/m-p/657857

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは @Kevingiordano14

トランザクションの時間が発生する前にチェックしている可能性があります。 12をチェックするまでカウントをチェックし、それに達しているのか、何もしていないのかがわかります。

printfは、 AURIX™ Development Studioのファイルシステムシミュレーション(FSS)ビューウィンドウに印刷されますが、デバッグ時に開かない場合は、ウィンドウ->ビューの表示->その他で開き、検索バーにFSSと記述できます。

また、COMポートを介したシリアル通信用にUARTを設定し、 AURIX™ Development Studioのシリアルモニタを使用するか、任意の方法を使用することもできます。 例については、 DMA_ADC_Transfer_1_KIT_TC375_LKを確認してください。

よろしくお願いいたします

エリック

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/measurements-of-DMA-transaction-in-UART-receiver/m-p/658324

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは @Kevingiordano14

時間を計算する際には、値が離れすぎないようにする必要がありますが、他の応答も考慮に入れてください。

また、CPU パフォーマンス カウンターを使用することもできます。このスレッドでは、ドライバーでそれらを使用する方法の例を見ることができます。iLLD のドキュメントでは、モジュール -> CPU、-> パフォーマンス カウンタ関数に関数があります。

また、ドキュメントをそのまま共有するのではなく、インフィニオンのWebサイトでリンクが利用可能な場合は共有する必要があります。 ありがとうございます。

KIT_AURIX_TC375_LKのためのUART_DMA_Transfer_1

よろしくお願いいたします

エリック

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/measurements-of-DMA-transaction-in-UART-receiver/m-p/657380

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

@Erick_Gさん、ご回答ありがとうございます。

時間の測り方がより明確になりました。

プログラムに戻ると、UART経由で5バイトのデータパケットを送信したいと思います。
現在、レシーバーのハードウェア FIFO をシングル ムーブ モードに設定しているため、FIFO によってバイトが集録されるたびに DMA がトリガーされます。

DMA を次のように構成しました。

 

ボイドinit_dma(ボイド)

{

/* IfxDma_Dma_Config のインスタンスをデフォルト値で初期化する */

IfxDma_Dma_Config dmaConfig;

IfxDma_Dma_initModuleConfig(&dmaConfig, &MODULE_DMA);

 

/* モジュールの初期化 */

IfxDma_Dma DMA;

IfxDma_Dma_initModule(&dma, &dmaConfig);

 

/* 全チャンネルの初期設定 */

IfxDma_Dma_ChannelConfig cfg;

IfxDma_Dma_initChannelConfig(&cfg, &dma);

 

/* DMA チャネルでは以下の設定が使用されます */

cfgです。transferCount = 1;

cfgです。moveSize = IfxDma_ChannelMoveSize_8bit;

cfgです。blockMode = IfxDma_ChannelMove_1;

 

/* DMA は要求に応じて完全なトランザクションを完了します */

cfgです。requestMode = IfxDma_ChannelRequestMode_completeTransactionPerRequest;

 

/* 割り込みサービスプロバイダとしての DMA */

cfgです。hardwareRequestEnabled = TRUE;

 

/* DMA チャネルは 1 回のリクエスト後も有効なままです */

cfgです。operationMode = IfxDma_ChannelOperationMode_continuous;

 

 

/*************** 送信元アドレスと宛先アドレス ***************/

 

/* 転送後に送信元アドレスは変更されません */

cfgです。sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none;

 

/* 転送する要素は常に同じ場所にある */

cfgです。sourceCircularBufferEnabled = TRUEです。

cfgです。destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1; //Dopo ogni transaction, l'indirizzo aumenta di 1

 

/* 要素を順番に並べてコピーする */

cfgです。destinationCircularBufferEnabled = FALSEです。

 

 

/*************** チャネル固有の設定 ***************/

 

/* AscLin RXの割り込みに関連するチャンネル12を選択 */

cfgです。channelId = (IfxDma_ChannelId) DMA_CHANNEL;

 

/* UART RX FIFO のアドレス */

cfgです。sourceAddress = (uint32) &g_ascHandle です。asclin->RXDATAです。U;

 

/* DLMU0 のアドレス */

cfgです。destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), &RxBuffer[0]); 結果バッファに移動します。

cfgです。channelInterruptEnabled = TRUEです。

 

/* DMA は、トランザクション全体が終了すると割り込みをトリガーします */

cfgです。channelInterruptControl = IfxDma_ChannelInterruptControl_thresholdLimitMatch;

 

/* チャネル割り込みトリガの優先度 */

cfgです。channelInterruptPriority = INTPRIO_DMA;

 

/* 割り込みサービスプロバイダ */

cfgです。channelInterruptTypeOfService = IfxSrc_Tos_cpu0;

 

/* DMA チャネルの初期化 */

IfxDma_Dma_initChannel(&g_chn, &cfg);

}

 

IfxDma_ChannelRequestMode_completeTransactionPerRequest で構成されているため、fifo から受信した各バイトが、8 ビット移動を行う転送で構成されるトランザクションをトリガーすることを期待しています。
さらに、cfg.channelInterruptControl が設定されているので、= IfxDma_ChannelInterruptControl_thresholdLimitMatch;各トランザクションの最後に、割り込みが生成されることを期待しています。

私の仮定が正しいかどうかを尋ねたいのですが、コードが実行されると、プログラムはDMAから5バイトが転送された後にのみDMAのトランザクション終了ISRに入ります。

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/measurements-of-DMA-transaction-in-UART-receiver/m-p/659865

0 件の賞賛