【深入探討】DMA到底能不能起到加速程序執行的作用,DMA死等操作是否合理,多個DMA數據流同時刷是否處理過來

我們這裏主要以STM32平臺爲例進行說明。

 

 


 

一、DMA到底能不能起到加速的作用

初學的時候,很容易存在這樣的認識,DMA直接從一個外設到另一個外設的數據傳輸,少了CPU的參與,直接硬件傳輸,應該可以做到更快。

我們這裏用實驗數據說話,爭取有理有據,下面是STM32H7的DMA2D,DMA1,DMA2,MDMA和CPU複製粘貼的性能測試:
1、可以看到DMA1/DMA2的性能跟其它不是一個級別的,適合搞搞低速的外設。
2、DMA2D,MDMA和CPU複製粘貼的性能差不多。
3、CPU操作ITCM的數據粘貼性能最強的。

 

那麼DMA到底能不能起到加速的作用?

1、如果相比CPU的複製粘貼來說,基本沒什麼加速作用。

2、如果從程序執行效果來看,可以起到明顯加速效果,特別是MDMA和DMA2D,因爲DMA刷新期間,CPU可以騰出手來幹別的事情,這個纔是DMA做的最大作用。

3、另外像DMA2D做它的本職工作,比如顏色格式轉換等操作,有明顯加速作用,這個比CPU要快。還有像H7的SDMMC帶的IDMA和以太網帶的DMA,這些是外設專屬DMA,不需要CPU參與,從程序的執行效果上也能起到加速作用。

 

 


 

2、DMA死等操作是否合理

這個問題也談的非常多,這裏從DMA的兩個方向討論:

1、一類是直接在DMA中斷裏面處理消息,像H7自帶的ADC,DAC,串口等。

這類應用我們可以直接在中斷裏面處理消息或者搞個雙緩衝。

這種應用在RTOS下和裸機下使用都比較簡單,這類應用不需要死等。

裸機下:
適合直接在中斷裏面處理,搞個外置標誌效果不是很理想,不方便性能最大化。

RTOS下:
可以中斷裏面處理,也可以發送信號量等消息,通知任務裏面處理,性能可以最大化。

2、還有一類就是圖形加速DMA2D,QSPI Flash DMA,SDIO DMA等

這類DMA應用,我們一般都需要配合GUI,FAT文件系統等一起使用。

這種情況下,要分裸機和RTOS兩種做分析,這類應用使用死等(可以加超時溢出)比較方便。

裸機情況下:
如果不做死等,而做箇中斷,做個變量標識什麼的做等待,應用層代碼基本沒有辦法寫了,比如一個簡單的GUI桌面背景部分重繪,需要進入DMA2D加速接口函數等待中斷標誌完成,應用層代碼實現非常麻煩。

RTOS下:
這種情況下,在RTOS下里才能發揮威力,以GUI爲例,我們都是直接將其丟到最低優先級任務裏面跑。文件系統類的QSPI Flash,SD卡,eMMC,NAND等,也可以直接丟到低優先級任務,或者其他稍高優先級任務,完全不影響其他高優先級任務運行。
其實這也是使用RTOS相比裸機的一個重要優勢。

 


 

3、多個DMA數據流同時刷是否處理過來:

先來看下通用DMA框圖 :

F1系列

 


F4系列

 


H7系列

 


基本上都是一個多路選擇器(優先級仲裁)選通那一路外設使用DMA,即同一個DMA,同一時刻只能處理1個DMA請求。

儘管如此,DMA的帶寬處理多個簡單的外設像DAC, ADC,  串口,I2C,SPI之類的還是無壓力的,通用DMA1, DMA2的性能基本在60-70MB/S,同時處理8路串口DMA不定長收發還是無壓力的。

但是一些時間控制類的應用很容易爆DMA性能極限,比如DAC1, DAC2,ADC1,ADC2,ADC3都開DMA,都開定時器觸發,如果觸發速度開的太高,很容易出現採集的波形異常,或者停止工作的問題。

這種情況,可以考慮分配DMA1和DMA2都開啓,分別處理一些DMA請求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章