歪歪漫画登录页面首页环球漫画|欧美激情A片大尺度|斗罗大陆小舞107集免费|国产久久精品二区三区老狼|51吃瓜.world张津瑜|26uuu电影新地址|厨房出轨上司HD院线

 
Proteus:什么是動態內存訪問
來源: | 作者:風標電子工程師 | 發布時間: 2026-01-30 | 360 次瀏覽 | ?? 點擊朗讀正文 ?? ? | 分享到:

在嵌入式開發中,你是否遇到過這樣的困境:CPU忙著處理核心任務,卻還要分心跑腿傳輸數據,導致整體效率大打折扣?今天,我們就來聊聊解決這個問題的關鍵技術——DMA(動態內存訪問),一個能讓CPU“解放雙手的高效數據搬運工

一、什么是DMA?核心價值是什么?

DMA,全稱Dynamic Memory Access(動態內存訪問),是多數微控制器具備的核心功能。其核心價值在于:無需CPU介入,即可自主完成數據在不同存儲區域或外設與內存之間的傳輸

這就好比工廠里的流水線,CPU是核心操作工,負責處理復雜的加工任務;而DMA是專門的物料搬運工,負責將原材料(數據)從倉庫(內存)運到生產線(外設),或把成品(處理后的數據)運回倉庫,讓CPU無需停下手中的核心工作,從而大幅提升系統的整體吞吐量和并行處理能力。

DMA的傳輸場景主要包括三類:

內存內存:數據在兩個內存區域間直接復制;

內存外設:數據從內存傳輸到外設(如UARTDAC等);

外設內存:數據從外設(如UARTADC等)讀取到內存。

二、內存外設DMA:告別傳輸阻塞與中斷開銷

我們先看一個常見場景:通過UART等通信外設傳輸大量數據。在沒有DMA的情況下,CPU只有兩種處理方式,且都存在明顯弊端:

1. 阻塞式傳輸CPU必須全程盯著數據傳輸過程,直到所有數據發送完成才能做其他事。而通信協議的速度往往遠低于CPU運行速度,這就導致CPU大量時間被浪費,相當于操作工放下手里的活,全程盯著物料搬運

2. 中斷式傳輸CPU可以先處理其他任務,數據傳輸完成后通過中斷通知CPU。但這種方式需要頻繁進行中斷上下文切換,每次切換都會產生額外的處理開銷,就像操作工剛專心加工一會兒,就被搬運工打斷確認物料,頻繁分心降低效率

DMA的出現完美解決了這些問題:CPU只需提前告訴DMA“要傳輸的數據地址、目標外設、傳輸長度,之后就可以全身心投入核心任務;DMA會自主完成數據傳輸,完成后再通過中斷(可選)告知CPU即可。

更重要的是,DMA并非只能處理單一數據流——多數微控制器的DMA控制器支持同時管理多個獨立的數據流(具體數量取決于芯片型號),比如同時通過UART發送數據、通過SPI傳輸數據,互不干擾,進一步提升系統并行處理能力。

三、外設內存DMA:數據不丟失,多設備通信更從容

外設內存的DMA傳輸,核心優勢在于確保數據不丟失、減輕CPU接收壓力,尤其適合多設備并發通信或高頻數據采集場景。

比如多設備通信場景:當有5個、10個外設同時通過UART發送數據時,CPU如果逐個處理接收,很可能因為忙于其他任務而錯過數據(導致數據丟失)。而DMA可以在CPU處理核心任務時,自主將各個外設的接收數據搬運到內存緩沖區,相當于搬運工主動接收各個供應商的物料,存入倉庫,等操作工空閑時再統一處理,完美避免數據丟失問題。

可能有同學會說:外設本身不是有接收緩沖區嗎?確實,部分通信外設內置了小型接收緩沖區,但容量有限(通常幾個字節到幾十個字節),面對高頻或大量數據時很容易溢出;而DMA使用的內存緩沖區,容量僅受限于微控制器的可用RAM,可根據需求靈活設置,適配各種大數據量場景。

典型案例:ADC采樣+DSP處理+DAC輸出的全流程DMA應用

外設內存DMA的一個經典應用,是模擬信號采集與處理全流程,我們通過一個完整場景理解其價值:

假設需要對模擬信號進行采樣、數字信號處理(DSP),并將處理后的信號通過DAC輸出。傳統方案中,CPU需要負責觸發ADC采樣、讀取采樣值、將數據傳輸到處理緩沖區、運行DSP算法、再將處理后的數據發送到DAC——全程被繁瑣的數據搬運工作占用,根本無法高效運行高強度的DSP算法。

而通過DMA實現的方案,流程完全自動化:

1. 定時器按固定間隔觸發ADC采樣;

2. ADC采樣完成后,DMA自動將采樣值搬運到內存緩沖區(外設內存);

3. 另一路DMA將采樣緩沖區的數據復制到DSP處理緩沖區(內存內存);

4. CPU專注運行DSP算法,無需參與任何數據搬運;

5. 算法處理完成后,第三路DMA將結果搬運到DAC輸出(內存外設)。

整個過程中,CPU只需專注于核心的DSP算法,數據傳輸全由DMA自主完成,系統效率大幅提升。(如果對ADCDAC等術語不熟悉,可以參考我們之前的專屬科普文章~

補充:兩種常用的接收緩沖區模式

在數據接收場景中,為了更高效地管理緩沖區,微控制器通常支持兩種DMA緩沖區模式:

圓形DMA緩沖區:緩沖區地址首尾相連,數據寫滿后自動從起始地址覆蓋,CPU按需讀取數據,無需頻繁切換緩沖區,效率更高,編碼也更簡潔(作者更推薦這種模式);

乒乓緩沖區:設置兩個獨立的內存區間,DMA交替向兩個緩沖區寫入數據,CPU則交替讀取兩個緩沖區的數據,避免讀取與寫入沖突,適合對實時性要求極高的場景。

四、總結:DMA沒那么難,上手即解鎖高效開發

對于嵌入式新手來說,DMA的配置和使用可能初看有些復雜,甚至讓人望而生畏。但實際上,只要花時間動手實踐一次,掌握其核心配置邏輯(傳輸源、傳輸目標、傳輸長度、觸發方式等),就能形成可復用的代碼模板——后續項目中只需稍作修改,就能快速適配不同的傳輸場景。

學會使用DMA,不僅能大幅提升項目的運行效率,還能讓微控制器從容應對更復雜的多任務、大數據量場景(比如多外設并發通信、高頻數據采集與處理等),是嵌入式開發進階路上的必備技能。

下次開發項目時,不妨試試用DMA解放CPU,感受一下高效開發的快樂~