DMA或動態內存訪問是某些微控制器上的一項功能,數據可以獨立于CPU移動,使CPU可以自由地執行其他工作,從而增加系統可以同時執行的總工作量。
DMA 可以將數據從一個內存區域移動到另一個內存區域,從內存移動到外設,或者從外設移動到內存。

內存到外設 DMA
內存到外設數據復制的一個例子是通過通信外設(如 UART)傳輸大量數據;如果沒有 DMA,CPU 要么需要在傳輸數據時 "阻塞"(通常傳輸速度相對較慢,這取決于通信協議的速度),要么需要使用中斷來管理傳輸(由于中斷環境,這將增加額外的處理開銷)。
本示例只考慮了只有一個數據傳輸需要同時進行的情況,DMA 通常可以同時處理多個數據流(取決于特定的微控制器實現)。
外設到內存DMA
外設到內存DMA類似 - 可以從通信外設(如UART)讀取數據,并在CPU忙于執行其他操作時復制到內存緩沖區中。除了讓 CPU 自由地做其他工作外,這還可以確保通信數據不會丟失,因為 CPU 忙于另一個任務,而不是在準備處理接收數據的代碼段中。
同樣,當有多個設備同時通信時(5 個或 10 個設備!),這一點尤其有用;DMA 可用于緩沖每個設備的通信,完美且不會丟失數據,直到 CPU 運行的代碼段準備好處理接收到的數據。有些微控制器在通信外設中包含一個小的接收緩沖區,而使用 DMA 時,接收緩沖區可以任意增大,僅受可用 RAM 的限制。
外設到內存 DMA 的另一個例子是通過 ADC 對模擬信號進行采樣。在這個例子中,設置了一個定時器,以設定的時間間隔觸發一個或多個通道的 ADC 采樣。采樣發生時,讀數會通過 DMA 自動傳輸到內存緩沖區。然后,一個單獨的 DMA 流會將這些緩沖區復制到另一個內存區域,供 CPU 運行 DSP(數字信號處理)算法。最后,另一個 DMA 流可用于將處理后的信號傳輸到微控制器 DAC 進行輸出(內存到外設)。(如果您不熟悉這些術語,可以在我們的 ADC 或 DAC 博客文章中找到相關概述)。這樣,CPU 就可以將全部時間用于運行密集型 DSP 算法,而無需浪費時間管理 ADC、內存復制或 DAC。
對于接收數據,一些微控制器支持循環 DMA 緩沖區,而另一些微控制器則支持ping-pong緩沖區,即在兩段內存之間交替接收數據(本文作者更傾向于循環緩沖區,認為其效率更高,更容易編寫代碼)。
小結
對于沒有經驗的編碼員來說,DMA 可能看起來令人生畏,但一旦您投入時間使用過一次,就擁有了一個代碼模板,可以很容易地復制到其他項目中,而且可以大大提高項目的質量和微控制器所能處理的項目的復雜性。
Proteus VSM CPU 模型可模擬真實設備中的 DMA 操作。這樣,您就可以直接在運行的仿真中編寫和測試 DMA 固件。了解有關 Proteus VSM MCU 仿真的更多信息請訪問:https://www.labcenter.com/
本文章版權歸英國Labcenter公司所有,由廣州風標電子提供翻譯,原文鏈接如下:https://www.labcenter.com/blog/sim-dma/