chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

DMA 實(shí)戰(zhàn)指南:零 CPU 占用玩轉(zhuǎn)高速數(shù)據(jù)傳輸

信盈達(dá) ? 2026-01-04 09:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式開發(fā)時(shí),大家是不是都有過這種崩潰場(chǎng)景:

  • 采集一個(gè)傳感器數(shù)據(jù),本來以為只是簡(jiǎn)單的 ADC → 內(nèi)存,結(jié)果發(fā)現(xiàn) CPU 忙得要死;
  • 想收點(diǎn)串口數(shù)據(jù),CPU 每次被中斷打斷,延遲累積到系統(tǒng)卡頓;
  • 數(shù)據(jù)傳輸量一上來,系統(tǒng)直接掉幀甚至死機(jī)。

很多初學(xué)者遇到這種情況,第一反應(yīng)是“是不是代碼寫得不夠高效”。但事實(shí)是:你再怎么優(yōu)化循環(huán),CPU 親自搬數(shù)據(jù)就是效率低。

解決方案其實(shí)很明確——用 DMA(Direct Memory Access,直接存儲(chǔ)器訪問)。如果你會(huì)合理使用 DMA,很多“看似不可避免的性能瓶頸”都能迎刃而解。今天我們就來聊聊 DMA 的工作原理、常見應(yīng)用和實(shí)戰(zhàn)技巧。


一、DMA 究竟是什么?

DMA 的核心思路很簡(jiǎn)單:把數(shù)據(jù)搬運(yùn)工作交給硬件去做。

在沒有 DMA 的情況下,數(shù)據(jù)傳輸?shù)牧鞒檀蟾攀牵?/strong>

  1. 外設(shè)產(chǎn)生數(shù)據(jù);
  2. CPU 中斷響應(yīng);
  3. CPU 把數(shù)據(jù)讀出來放到內(nèi)存。

而有了 DMA:

  1. 外設(shè)和 DMA 控制器直接“勾搭”;
  2. 數(shù)據(jù)繞過 CPU,直接搬到內(nèi)存。

這樣一來,CPU 不用再做“快遞員”,可以專心處理邏輯,系統(tǒng)響應(yīng)速度和并發(fā)能力都能上一個(gè)臺(tái)階。


二、DMA 的常見應(yīng)用場(chǎng)景

1. 串口數(shù)據(jù)接收(UART DMA)

如果你做過大數(shù)據(jù)量的串口通信,就會(huì)發(fā)現(xiàn)中斷方式很容易丟數(shù)據(jù)。

  • DMA 可以配置成循環(huán)緩沖區(qū),數(shù)據(jù)一來就自動(dòng)寫入 RAM
  • CPU 只需要在合適的時(shí)候檢查緩沖區(qū),不用每個(gè)字節(jié)都處理中斷。

2. ADC 連續(xù)采樣

很多傳感器需要高速采樣,比如電機(jī)控制中的電流檢測(cè)。

  • 普通方式下,CPU 每次采樣要響應(yīng) ADC 中斷,很快就“累趴”;
  • 用 DMA,可以把采樣結(jié)果自動(dòng)存到數(shù)組里,形成數(shù)據(jù)流,CPU 后續(xù)再批量處理。

3. 內(nèi)存到外設(shè)數(shù)據(jù)傳輸

比如 SPI 發(fā)送、DAC 輸出波形:

  • 傳統(tǒng)方式要一個(gè)字節(jié)一個(gè)字節(jié)寫寄存器
  • DMA 可以直接把內(nèi)存中的一段緩沖區(qū)刷到外設(shè)寄存器,效率極高。

4. 內(nèi)存到內(nèi)存?zhèn)鬏?/strong>

一些芯片的 DMA 支持內(nèi)存塊搬運(yùn),可以用來快速清零數(shù)組、搬運(yùn)數(shù)據(jù)結(jié)構(gòu),CPU 不用一個(gè)循環(huán)一個(gè)循環(huán)寫。


三、DMA 配置的關(guān)鍵要點(diǎn)

很多同學(xué)第一次用 DMA,發(fā)現(xiàn)配置比想象中復(fù)雜。其實(shí)總結(jié)起來,主要是以下幾個(gè)步驟:

  1. 確定通道/流
  • DMA 控制器通常有多個(gè)通道,對(duì)應(yīng)不同的外設(shè)。
  • 要查手冊(cè),看你的外設(shè)掛在哪個(gè) DMA 通道上。
  • 配置源地址和目的地址
    • 源地址可以是外設(shè)寄存器,比如 ADC_DR。
    • 目的地址一般是內(nèi)存數(shù)組。
    • 有時(shí)候是反過來,比如內(nèi)存 → SPI。
  • 配置傳輸方向
    • 外設(shè)到內(nèi)存(ADC、UART RX);
    • 內(nèi)存到外設(shè)(SPI TX、DAC);
    • 內(nèi)存到內(nèi)存。
  • 配置數(shù)據(jù)長(zhǎng)度和傳輸模式
    • 單次搬運(yùn)幾個(gè)字節(jié)?總共搬多少?
    • 是循環(huán)模式(buffer 自動(dòng)回繞)還是普通模式?
  • 啟動(dòng) DMA
    • 記得在外設(shè)使能之前配置好 DMA;
    • 啟動(dòng)順序有講究,比如 UART DMA 要先開 DMA 再開 UART 接收。

四、實(shí)戰(zhàn)技巧:避免常見坑

技巧 1:循環(huán)緩沖 vs 普通模式

  • 如果數(shù)據(jù)源是持續(xù)的(比如串口、ADC),用循環(huán)緩沖更穩(wěn)。
  • 如果只是一次性發(fā)送一段數(shù)據(jù)(比如 SPI 發(fā)命令),普通模式即可。

技巧 2:善用中斷回調(diào)

DMA 雖然能自動(dòng)搬數(shù)據(jù),但你還是得知道“什么時(shí)候搬完”。

  • 可以開傳輸完成中斷,在回調(diào)函數(shù)里處理數(shù)據(jù)。
  • 對(duì)于循環(huán)模式,可以用半傳輸中斷,做到“邊采集邊處理”。

技巧 3:緩存對(duì)齊問題

有些 MCU 的 DMA 對(duì)地址有對(duì)齊要求,比如 4 字節(jié)對(duì)齊,否則性能下降甚至報(bào)錯(cuò)。寫代碼前要看手冊(cè)。

技巧 4:注意總線帶寬

DMA 不是“無限快”,它也占用內(nèi)存總線。

  • 多個(gè) DMA 通道同時(shí)工作時(shí),可能會(huì)互相搶占。
  • 解決方法:錯(cuò)峰啟動(dòng),或者降低非關(guān)鍵任務(wù)的優(yōu)先級(jí)。

技巧 5:與 CPU 配合

DMA 搬數(shù)據(jù)的同時(shí),CPU 可能要訪問同一片內(nèi)存。

  • 要小心數(shù)據(jù)一致性問題,可以用“雙緩沖”或者加鎖機(jī)制。

五、案例分享

案例 1:ADC + DMA 實(shí)現(xiàn)波形采集

某項(xiàng)目需要 10kHz 的 ADC 采樣,用中斷方式 CPU 占用率高達(dá) 70%。

→ 換成 DMA 循環(huán)搬運(yùn)到數(shù)組,CPU 占用率直接降到 5% 以下,系統(tǒng)反應(yīng)流暢。

案例 2:UART 接收不丟包

串口調(diào)試工具長(zhǎng)時(shí)間發(fā)送數(shù)據(jù),CPU 用中斷處理時(shí)經(jīng)常丟字節(jié)。

→ 改用 DMA + 環(huán)形緩沖 + IDLE 中斷檢測(cè)幀間隔,接收穩(wěn)定,再也沒掉過包。

案例 3:SPI 高速傳輸

OLED 屏幕更新一幀圖像需要傳 8KB 數(shù)據(jù),用循環(huán)寫寄存器方式刷新率只有 20fps。

→ DMA 一次傳輸緩沖區(qū),刷新率提高到 60fps,畫面流暢無比。


六、總結(jié)

DMA 對(duì)嵌入式開發(fā)來說,是“必學(xué)技能”之一。很多人初學(xué)時(shí)嫌它復(fù)雜,繼續(xù)讓 CPU 自己“跑腿”,結(jié)果系統(tǒng)卡頓、性能不達(dá)標(biāo)。其實(shí)只要掌握幾個(gè)要點(diǎn):

  1. 了解外設(shè)和 DMA 通道的映射關(guān)系;
  2. 正確配置源地址、目的地址和傳輸模式;
  3. 結(jié)合中斷回調(diào)實(shí)現(xiàn)數(shù)據(jù)處理;
  4. 注意帶寬和緩存一致性問題。

你就能真正實(shí)現(xiàn)“零 CPU 占用的高速傳輸”,讓系統(tǒng)既高效又穩(wěn)定。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11268

    瀏覽量

    224672
  • 數(shù)據(jù)傳輸
    +關(guān)注

    關(guān)注

    9

    文章

    2190

    瀏覽量

    67537
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    581

    瀏覽量

    105824
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    CW32L052單片機(jī)支持DMA實(shí)現(xiàn)高速數(shù)據(jù)傳輸

    CW32L052支持DMA(Direct Memory Access),即直接內(nèi)存訪問,無需CPU干預(yù),實(shí)現(xiàn)高速數(shù)據(jù)傳輸
    的頭像 發(fā)表于 02-27 11:36 ?2150次閱讀

    ADXRS453Z的芯片支持使用STM32單片機(jī)的DMA數(shù)據(jù)傳輸功能嗎?

    ADXRS453Z的芯片支持使用STM32單片機(jī)的DMA數(shù)據(jù)傳輸功能嗎?如果,不能,考慮到我們的數(shù)據(jù)傳輸還是挺多的,那么常規(guī)的SPI通信方式占用大量的
    發(fā)表于 12-29 07:47

    基于FPGA的高速LVDS數(shù)據(jù)傳輸

    高速LVDS數(shù)據(jù)傳輸方案和協(xié)議基于FPGA的高速LVDS數(shù)據(jù)傳輸本人在北京工作6年,從事FPGA外圍接口設(shè)計(jì),非常熟悉高速LVDS
    發(fā)表于 03-01 18:47

    Serial RapidIO接口DMA數(shù)據(jù)傳輸

    數(shù)據(jù)傳輸本人已經(jīng)在多個(gè)基于DSP和PowerPC信號(hào)處理板上調(diào)試驗(yàn)證了Serial RapidIO Endpoint Master DMA功能.1. Master DMA Write數(shù)據(jù)傳輸
    發(fā)表于 08-23 13:27

    請(qǐng)問ADXRS453Z的芯片支持使用STM32單片機(jī)的DMA數(shù)據(jù)傳輸功能嗎?

    ADXRS453Z的芯片支持使用STM32單片機(jī)的DMA數(shù)據(jù)傳輸功能嗎?如果,不能,考慮到我們的數(shù)據(jù)傳輸還是挺多的,那么常規(guī)的SPI通信方式占用大量的
    發(fā)表于 08-10 08:13

    DMA數(shù)據(jù)傳輸速率是多少?

    DMA數(shù)據(jù)傳輸速率是多少?由于DMACPU無關(guān),所以CPU的速率可能不高。你知道DMAC的時(shí)鐘是什么嗎? 以上來自于百度翻譯 以下為原
    發(fā)表于 05-14 11:13

    怎么實(shí)現(xiàn)基于FPGA的具有流量控制機(jī)制的高速串行數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)?

    本文介紹了基于Xilinx Virtex-6 FPGA的高速串行數(shù)據(jù)傳輸系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),系統(tǒng)包含AXI DMA和GTX串行收發(fā)器,系統(tǒng)增加了流量控制機(jī)制來保證高速
    發(fā)表于 05-25 06:45

    stm32數(shù)據(jù)傳輸的相關(guān)資料分享

    簡(jiǎn)介DMA,全稱Direct Memory Access,即直接存儲(chǔ)器訪問。DMA傳輸數(shù)據(jù)從一個(gè)地址空間復(fù)制到另一個(gè)地址空間,提供在外設(shè)和存儲(chǔ)器之間或者存儲(chǔ)器和存儲(chǔ)器之間的
    發(fā)表于 02-22 06:58

    DMA進(jìn)行數(shù)據(jù)傳輸CPU進(jìn)行數(shù)據(jù)傳輸的疑問

    原先的總線矩陣+仲裁器結(jié)構(gòu)中的數(shù)據(jù)總線進(jìn)行數(shù)據(jù)傳輸的? 接上一個(gè)問題,如果是的話,那么當(dāng)進(jìn)行DMA數(shù)據(jù)傳輸時(shí),必定是需要占用
    發(fā)表于 05-25 17:18

    基于FPDP的高速數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)

    基于FPDP的高速數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì) 隨著電子技術(shù)的高速發(fā)展,越來越多的信號(hào)處理系統(tǒng),需要高速數(shù)據(jù)采集和大吞吐量的
    發(fā)表于 12-01 09:41 ?2435次閱讀
    基于FPDP的<b class='flag-5'>高速</b><b class='flag-5'>數(shù)據(jù)傳輸</b>系統(tǒng)設(shè)計(jì)

    基于Zynq-7000的SRIO高速數(shù)據(jù)傳輸設(shè)計(jì)與實(shí)現(xiàn)

    用來控制DMA數(shù)據(jù)傳輸和SRIO事務(wù)處理,ARM只進(jìn)行簡(jiǎn)單的參數(shù)設(shè)置,能夠完成SRIO各種事務(wù)類型的傳輸.,實(shí)際應(yīng)用表明,該系統(tǒng)具有操作簡(jiǎn)便、高效的特點(diǎn),同時(shí)減輕了CPU的負(fù)擔(dān),達(dá)到
    發(fā)表于 12-21 11:37 ?31次下載
    基于Zynq-7000的SRIO<b class='flag-5'>高速</b><b class='flag-5'>數(shù)據(jù)傳輸</b>設(shè)計(jì)與實(shí)現(xiàn)

    DMA數(shù)據(jù)傳輸(源代碼分享)

    手頭項(xiàng)目也需要加入DMA數(shù)據(jù)傳輸,以最大限度地提升CPU效率,于是測(cè)試了一下XMEGA的DMA模塊,把一塊內(nèi)存中的數(shù)據(jù)
    的頭像 發(fā)表于 04-27 09:22 ?1w次閱讀

    DMA數(shù)據(jù)傳輸在SPEAR300實(shí)現(xiàn)高速串口驅(qū)動(dòng)設(shè)計(jì)

    DMA數(shù)據(jù)傳輸無需CPU的參與,是一種更加高效的數(shù)據(jù)傳輸方式?,F(xiàn)有的DMA數(shù)據(jù)傳輸方案都是基于
    發(fā)表于 04-04 12:23 ?1998次閱讀
    <b class='flag-5'>DMA</b><b class='flag-5'>數(shù)據(jù)傳輸</b>在SPEAR300實(shí)現(xiàn)<b class='flag-5'>高速</b>串口驅(qū)動(dòng)設(shè)計(jì)

    STM32CubeMX-串口開啟DMA進(jìn)行數(shù)據(jù)傳輸

    STM32CubeMX筆記-串口開啟DMA進(jìn)行數(shù)據(jù)傳輸
    發(fā)表于 12-27 18:40 ?7次下載
    STM32CubeMX-串口開啟<b class='flag-5'>DMA</b>進(jìn)行<b class='flag-5'>數(shù)據(jù)傳輸</b>

    stm32數(shù)據(jù)傳輸

    簡(jiǎn)介DMA,全稱Direct Memory Access,即直接存儲(chǔ)器訪問。DMA傳輸數(shù)據(jù)從一個(gè)地址空間復(fù)制到另一個(gè)地址空間,提供在外設(shè)和存儲(chǔ)器之間或者存儲(chǔ)器和存儲(chǔ)器之間的
    發(fā)表于 12-28 19:08 ?8次下載
    stm32<b class='flag-5'>數(shù)據(jù)傳輸</b>