UART 接收器中 DMA 交易的測量

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

大家好

我正在開發三科爾 TC399,我想嘗試通過 DMA 測量從 uart 的接收 HW FIFO 到 DSPR0 內存的傳輸時間。 為此,我從實例 " UART_DMA_轉移 _1 開始,用於 KIT_AURIX_TC375_LK "。
我首先嘗試通過調試來運行代碼,根據文件 " 英菲尼昂 UART_DMA_TRANSFER_1_KIT_TC375_LK-訓練-V01_00-EN " 我應該得到變量 G_CorrectTransactions=12 的值,但意外發現它等於 1。 我不知道是否有人知道這個問題是因為什麼。

此外,我的目標是測量 DMA 的傳輸時間;因此我想到通過兩個 uint64 變量:啟動和停止使用 Stm 模塊。 起始變量通過函數接收 stm 計數器的刻度數:" (uint64) ifxstm_get(IFXSTM_DEFAULT_TIMER)& 時間 _INFINITE;",這在命令 ifxasclin _ASC_Write 之前的 void send_data(void)內完成(& G_AschAndle,G_txData,& g_count,TIME_INFINITE);。
停止變量始終通過函數:'(uint64) ifxstm_get(IFXSTM_DEFAULT_TIMER)& TIME_INFINITE;',這在 DMA 的 ISR 內完成:空白 PRIO_DMA(空白)。
我想知道此技術是否正確和準確,也是因為,每次調試時,我都會從「啟動停止」(應該是傳輸開始和 DMA 操作結束之間的刻度)操作中得到不同的結果。

我在下面報告了完成兩個 tick 獲取的兩段代碼:

無效傳 送數據(無效

{

開始 = (uint64) ifxSTM _ 獲取(IFXSTM _ 默認定時器)& 時間 _ 無限;

ifxaSclin _ ASC 寫入 (& G_ 阿斯坎德爾,G_TX 數據,& g_ 計數,時間 _ 無限); /* 通過 TX 傳輸數據 */

}

 

無效 Prio_D MA(無效)

{

停止 = (uint64) ifxSTM _ 獲取(IFXSTM _ 默認定時器)& 時間 _ 無限;

G_ 正確交易 ++;

}

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

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.25 微秒的傳輸一個字節(8 位數據加上起始和停止位),所以總共需要 6.25 微秒的傳輸。 除了這些 6.25 微秒之外,我不知道 DMA 從 hw FIFO 傳輸到 DSPR 可能需要多長時間。

 

我的主要問題是使用示例程序 https://www.infineon.com/dgdl/Infineon-UART_DMA_Transfer_1_KIT_TC375_LK-Training-v01_00-EN.pdf?fil..., 我應該得到 G_transferCount=12,但我得到它 = 1,這使我認為 DMA 運動結尾的 ISR 只執行一次,而不是 12 次。

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. 在範例中,有 12 筆交易由 1 次轉移組成,因此每次轉賬由 1 筆交易組成。

在您鏈接的示例中(如果它有效... 因為某些示例不起作用!)

G_ Correct 交易應在字符串傳輸結束時達到 12

 

G_ 轉移計數不出現在範例中,但如果您是指的是 (cfg. 轉移計數 = N_ 轉移;),這是每個交易的轉移數量的選擇(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。
對我來說沒有意義的是為什麼該變量的值是一而不是 12,因為它應該輸入 ISR 12 次。
無論如何,可能是調試器問題。 為此,我問是否可以使用 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。

您也可以將 UART 設定為透過 COM 連接埠進行串行通信,並使用AURIX™ Development Studio 或您選擇的任何串行監視器。如需範例,請檢查 DMA _ADC 轉移 _1_套件 _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 效能計數器。 在此線程中,您可以看到如何與驅動程序一起使用它們的示例。 在 i LD 文檔中,您可以在模塊-> CPU-> 效能計數器函數中找到函數。

此外,請不要按原樣共享文檔,如果該鏈接在 Infineon 網站上可用,則應該共享該鏈接。 謝謝你

UART _ DMA _ 轉移 _1 套件 _ 奧利克 _ TC375_LK

最好的問候,

埃里克

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 字節數據包。
我目前已將接收器的 hw FIFO 設置為單移動模式,因此每次 FIFO 獲取字節時,它都會觸發 DMA。

我已配置 DMA 如下:

 

無效輸 入 _dma(無效)

{

/* 使用默認值初始化 IFXDMA_DMA_config 的實例 */

IFXDMA _ DMA _ 配置 DMA_Config;

ifxDMA _ DMA _ 開始模組規格 (& DMA 圖,& 模塊 _ DMA);

 

/* 初始化模塊 */

ifxDMA _ DMA dma;

IFXDMA _ DMA _ 輸入模塊(& 數字,& DMA 圖形);

 

/* 所有通道的初始配置 */

ifxDMA _ DMA _ 通道配置 cfg;

ifxDMA _ DMA _ 輸入通道配置(& 參數,& dma);

 

/* DMA 通道使用以下配置 */

參考。轉移計數 = 1;

參考。 移動大小 = ifxDMA _ 頻道移動範圍 _ 8 位;

參考。 區塊模式 = if xDMA _ 頻道移動 _1;

 

/* DMA 根據要求完成完整交易 */

參考。 請求 模式 = IFXDMA _ 通道請求模式 _ 完成傳輸單一 個請求;

 

/* DMA 作為中斷服務提供商 */

參考。 硬體要求啟用 = 真實;

 

/* DMA 通道一次請求後仍保持啟用 */

參考。 操作模式 = ifxDMA _ 通道操作模式 _ 連續;

 

 

/*************** 來源和目的地地址 ***************/

 

/* 轉移後不會修改來源地址 */

參考。 來源 地址循環排列 = ifxDMA _ 通道增量循環 _ 無;

 

/* 要傳輸的元素始終位於相同的位置 */

參考。 源循環緩衝區啟用 = 真實;

參考。 目的地地址加密步驟 = ifxDMA_頻道增加步 驟 _ 1;//每次交易後,地址增加 1

 

/* 依序複製元素在彼此旁邊 */

參考。 目的地循環緩衝區啟用 = FALSE;

 

 

/*************** 通道特定配置 ***************/

 

/* 選擇與阿斯克林 RX 中斷相關的頻道 12 */

參考。 通道 ID =(IFXDMA _ 通道 ID )D MA _ 通道;

 

/* UART RX 國際交易所的地址 */

參考。 來源地址 = ( uint32 ) & G_ 阿斯錢德爾。 阿斯克林 -> R XDATA。 U ;

 

/* DLMU0 的地址 */

參考。目的地址 = IFXCPU_GLB_ADDR_DSPR(IFXCPU _ 加入核心 ID(),& RX緩衝區 [0]);//移入結果緩衝區

參考。 通道中斷 = 真實;

 

/* 完成完整交易後 DMA 觸發中斷 */

參考。 通道中斷控制 = ifxDMA _ 通道中斷控制 _ 臨界限匹配;

 

/* 通道中斷觸發器的優先順序 */

參考。 通道中斷優先順序 = 匯率 _ DMA;

 

/* 中斷服務供應商 */

參考。 服務頻道中斷類型 = ifxsrc_tos_cpu0;

 

/* 初始化 DMA 通道 */

IFXDMA _ DMA _ 進入通道(& 格 _ 中文,& 參考);

}

 

我預計,由於它是在 IFXDMA_ChannelRequestMode_CompleteTransactionPerRequest 中配置的,從 fifo 接收的每個字節都將觸發一個由傳輸進行 8 位移動組成的交易。
此外,由於配置了 cfg.ChannelInterrupt Control = ifxDMA_ChannelInterrupt Control_ThresholdLimitMatch;我預計在每個交易結束時,會產生中斷。

我想詢問我的假設是否正確,因此,一旦代碼執行,程序僅在從 DMA 轉移 5 個字節後才進入 DMA 的交易結束 ISR。

 

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

0