一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

數(shù)據(jù)處理時(shí)為什么要從DMA緩存空間中獲取?

GReq_mcu168 ? 來(lái)源:玩轉(zhuǎn)單片機(jī) ? 作者:玩轉(zhuǎn)單片機(jī) ? 2020-06-24 11:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

筆記中最后得出一個(gè)串口接收的總結(jié)“空閑中斷 + DMA + 隊(duì)列 + 內(nèi)存管理 + 定時(shí)控制”。因?yàn)榭臻e中斷的誤觸發(fā),導(dǎo)致我們不得不使用定時(shí)器來(lái)達(dá)到接收完整一幀的效果,這樣一來(lái),就會(huì)導(dǎo)致一些問(wèn)題:1、數(shù)據(jù)吞吐率低,發(fā)送方需要延時(shí)一段時(shí)間后才能發(fā)送下一幀;2、響應(yīng)不及時(shí),因?yàn)橛醒訒r(shí),必然導(dǎo)致接收方回復(fù)慢。3、空間利用率不高,如果一個(gè)短幀到來(lái),會(huì)導(dǎo)致整幀緩存空間(這個(gè)空間大小一般是最大幀長(zhǎng))無(wú)法使用。

今天魚(yú)鷹自己對(duì)自己進(jìn)行一次升級(jí),改用“空閑中斷 + 循環(huán)DMA + 無(wú)鎖隊(duì)列”的方式進(jìn)行最為高效的接收方式(無(wú)鎖隊(duì)列以后有時(shí)間再寫(xiě),這次的重點(diǎn)不在這)。這種接收方式魚(yú)鷹在接觸了循環(huán)隊(duì)列后就開(kāi)始思考了,那個(gè)時(shí)候工作沒(méi)多久,然后一位前輩使用的就是空閑中斷 + DMA 的方式接收,也算是驚到魚(yú)鷹了。后來(lái)魚(yú)鷹在想,循環(huán)隊(duì)列的優(yōu)勢(shì)顯而易見(jiàn),而DMA在設(shè)置為循環(huán)模式時(shí),天然就是一個(gè)循環(huán)隊(duì)列,我是否能將循環(huán)隊(duì)列和DMA相結(jié)合,實(shí)現(xiàn)一個(gè)循環(huán)緩存空間呢?具體當(dāng)時(shí)是如何思考的魚(yú)鷹已不記得了,只知道當(dāng)時(shí)利用KEIL模擬功能貌似是實(shí)現(xiàn)了想要的效果,但是在實(shí)際測(cè)試過(guò)程中應(yīng)該是出現(xiàn)了問(wèn)題,所以導(dǎo)致這個(gè)想法擱置了。這個(gè)實(shí)現(xiàn)代碼魚(yú)鷹會(huì)一并上傳到公眾號(hào),讓各位道友參考一二,自認(rèn)為自己符合條件的自行獲取就是了。直到最近看到頭條一位讀者的評(píng)論,魚(yú)鷹的心思才又活泛起來(lái)了,通過(guò)評(píng)論交流,終于理解了其中是如何實(shí)現(xiàn)的,也想到了如何將其和無(wú)鎖隊(duì)列相結(jié)合,也就有了這一次筆記的分享。

實(shí)習(xí)時(shí)初次接觸空閑中斷時(shí),用的接收方式是 空閑中斷 + 串口接收中斷,這個(gè)算是 V1.0版。后來(lái)正式工作后接觸到的是 “空閑中斷 + DMA”這個(gè)是V2.0,后來(lái)魚(yú)鷹在此基礎(chǔ)上進(jìn)行改進(jìn),加入了隊(duì)列,加入了定時(shí)器,算V2.5好了。這次效率更高,而且空間利用率也高,中斷處理簡(jiǎn)單到到極致,定為V3.0??赡芎芏嗳嗽谥暗墓P記中根本無(wú)法真正理解魚(yú)鷹的本意,因?yàn)檫@份筆記太長(zhǎng),如果沒(méi)有一定的經(jīng)驗(yàn)根本無(wú)法體會(huì),盡管有一份參考代碼放在后臺(tái)供各位道友進(jìn)行參考,但是因?yàn)槟欠荽a只解決了一個(gè)定時(shí)器控制問(wèn)題,注釋也不詳盡,還是魚(yú)鷹的初次思考,所以相信很多人看到這份代碼都是云里霧里的,還是無(wú)法實(shí)現(xiàn)其中的細(xì)節(jié)。那么今天魚(yú)鷹就來(lái)簡(jiǎn)單描述其中的關(guān)鍵細(xì)節(jié)實(shí)現(xiàn):

串口接收實(shí)現(xiàn)V1.01、初始化時(shí)開(kāi)啟串口的接收中斷和空閑中斷2、串口中斷處理時(shí),每接收一個(gè)字節(jié)存入緩存空間(注意控制越界問(wèn)題)3、一旦空閑中斷來(lái)了,停止接收,設(shè)置標(biāo)志位,通知上層已完成一幀數(shù)據(jù)的接收,上層負(fù)責(zé)數(shù)據(jù)的處理工作。當(dāng)然為了防止誤觸發(fā),也可以使用定時(shí)器進(jìn)行進(jìn)一步控制,也可以在此基礎(chǔ)上加入緩存隊(duì)列。

串口接收實(shí)現(xiàn)V2.01、初始化時(shí)開(kāi)啟串口的空閑中斷,并且初始化為正常DMA。2、觸發(fā)空閑中斷時(shí),通知上層接收完成并且將其拷貝到一個(gè)緩存中供上層使用,然后重新啟動(dòng)DMA進(jìn)行下一次的接收,因?yàn)閹c幀之間有空閑時(shí)間,只要保證這段時(shí)間大于中斷處理時(shí)間,那么接收一般不會(huì)出現(xiàn)問(wèn)題。這里有一個(gè)關(guān)鍵點(diǎn)就是,如何獲取這次接收的數(shù)據(jù)長(zhǎng)度:

Rev_Size = DMA_Set_Size - CNDTR

Rev_Size 是實(shí)際接收的長(zhǎng)度,DMA_Set_Size是初始化DMA時(shí)設(shè)置的緩存大小,這個(gè)大小一般大于等于一幀數(shù)據(jù)的最大長(zhǎng)度,并且最好是它的2倍以上,這樣極端情況下不容易被下一幀數(shù)據(jù)所覆蓋(怕中斷處理不及時(shí)導(dǎo)致覆蓋了之前已接收的數(shù)據(jù))。而 CNDTR就是 DMA 寄存器中記錄目前剩余需要接收的大小,當(dāng)它為 0 時(shí)表示接收完成,DMA自動(dòng)關(guān)閉。好好理解一下,實(shí)現(xiàn)起來(lái)不難。 串口接收實(shí)現(xiàn)V3.0

1、初始化時(shí)開(kāi)啟串口的空閑中斷,并且初始化為循環(huán)DMA。2、觸發(fā)空閑中斷時(shí),更新索引,這個(gè)索引表示當(dāng)前寫(xiě)入索引值,用于上層判斷緩存空間已寫(xiě)入的數(shù)據(jù)(魚(yú)鷹前面寫(xiě)了關(guān)于循環(huán)FIFO的筆記,可自行查看,如果不懂這個(gè),下面的你理解不了,數(shù)據(jù)結(jié)構(gòu)系列文章之隊(duì)列 FIFO)。3、如果加入無(wú)鎖FIFO,更新in索引值。數(shù)據(jù)處理時(shí)只要從DMA緩存空間中獲取即可。

現(xiàn)在我們來(lái)分析一下更細(xì)節(jié)的東西1、緩存大?。?、如何獲取數(shù)據(jù)?3、好處?4、隱患,缺點(diǎn)?緩存大小可以根據(jù)需要設(shè)置,這個(gè)需要看你數(shù)據(jù)處理的延遲時(shí)間。比如說(shuō)發(fā)送者10 ms發(fā)送一幀數(shù)據(jù),你的數(shù)據(jù)處理正常時(shí)候10 ms處理一次,但有時(shí)候CPU 負(fù)擔(dān)重,你的數(shù)據(jù)處理優(yōu)先級(jí)較低,那么可能20 ms才會(huì)處理,那么緩存空間必然需要大于兩幀數(shù)據(jù)才行,這個(gè)空間需要測(cè)試后才能確定,而且需要留有一定的富余才行。那么如何獲取數(shù)據(jù)?通過(guò)學(xué)習(xí)循環(huán)FIFO的知識(shí)我們知道,循環(huán)FIFO由兩個(gè)變量in和out進(jìn)行數(shù)據(jù)管理,如果我們的in可以根據(jù)DMA剩余量進(jìn)行更新,那么就可以根據(jù)in和out之間的關(guān)系知道目前緩存空間里面到底有多少未處理的數(shù)據(jù)了。那么如何更新呢?魚(yú)鷹就不藏私了,直接在此說(shuō)明,不過(guò)加入無(wú)鎖FIFO的就自己從參考代碼中獲取了,這個(gè)其實(shí)都差不多。

In = DMA_Set_Size - CNDTR(CNDTR永遠(yuǎn)不會(huì)是0)

數(shù)據(jù)處理時(shí)為什么要從DMA緩存空間中獲???

是不是很驚訝,是不是不可思議,你和終極接收方式只差一層窗戶紙?當(dāng)年魚(yú)鷹為了更新這個(gè)值,用了老長(zhǎng)一段代碼實(shí)現(xiàn):

數(shù)據(jù)處理時(shí)為什么要從DMA緩存空間中獲???

而現(xiàn)在再看這個(gè)代碼,已經(jīng)忘記當(dāng)初是咋想的了,但是這個(gè)式子確實(shí)可以更新in的值,即上面的offset,只是當(dāng)初想的有點(diǎn)復(fù)雜了。簡(jiǎn)單來(lái)說(shuō),就是先通過(guò)CNTR和之前的 offset 獲取目前的接收的長(zhǎng)度(這個(gè)應(yīng)該是受V2.0版本影響),然后根據(jù)長(zhǎng)度更新目前的offset。但是通過(guò)讀者的評(píng)論,發(fā)現(xiàn)根本不需要這樣麻煩。只要有了in的值,然后又有out,那么獲取隊(duì)列中的數(shù)據(jù)也就不難了。

其實(shí)如果說(shuō)采用循環(huán)DMA只是減少了中斷的代碼,讓中斷處理時(shí)間更短,那么魚(yú)鷹還是會(huì)選擇以前的V2.0的接收方式,畢竟這種方式實(shí)現(xiàn)了幀隔離,但是讀者的一個(gè)評(píng)論提醒了我,那就是這種方式不需要重新啟動(dòng)DMA。這意味著什么?意味著高效,意味著DMA持續(xù)工作,意味著不存在因?yàn)镈MA的短暫關(guān)閉而導(dǎo)致數(shù)據(jù)丟失。這就是魚(yú)鷹接下來(lái)要說(shuō)的優(yōu)點(diǎn):1、中斷代碼及其簡(jiǎn)單,像上面那種只是更新in的話只需要三條代碼即可完成。2、不需要重啟DMA3、因?yàn)椴恍枰貑MA,也就減少了這段時(shí)間串口數(shù)據(jù)的丟失4、數(shù)據(jù)吞吐量可以達(dá)到最大化,每幀數(shù)據(jù)只需間隔一個(gè)空閑時(shí)間即可繼續(xù)發(fā)送。最大程度的利用了串口的接收能力,而且不用擔(dān)心數(shù)據(jù)丟失,這對(duì)于快速數(shù)據(jù)的接收是非常有好處的。5、就算你不想數(shù)據(jù)幀之間出現(xiàn)空閑間隔時(shí)間,你也可以通過(guò)一個(gè)定時(shí)器定時(shí)更新in的值。6、即使在串口中斷更新in的值時(shí)DMA又在接收數(shù)據(jù),也不會(huì)出現(xiàn)問(wèn)題,這個(gè)原理和無(wú)鎖FIFO一樣。7、不需要定時(shí)控制,防止空閑中斷的誤觸發(fā)。8、即使因?yàn)橹袛囿w系短暫關(guān)閉,而導(dǎo)致空閑中斷不能及時(shí)處理,也不會(huì)影響DMA在后臺(tái)自動(dòng)接收數(shù)據(jù)。 優(yōu)點(diǎn)很多,缺點(diǎn)也有,下面就來(lái)嘮叨嘮叨缺點(diǎn):1、因?yàn)樗袛?shù)據(jù)都在一個(gè)緩存中,無(wú)法實(shí)現(xiàn)幀與幀之間的硬性隔離,所以必須通過(guò)數(shù)據(jù)本身確定一幀數(shù)據(jù),對(duì)于數(shù)據(jù)的處理難道較高,這一點(diǎn)目前魚(yú)鷹采用狀態(tài)機(jī)處理,但是總感覺(jué)效率較低,后期看看能不能升個(gè)級(jí)啥的。2、因?yàn)闊o(wú)法實(shí)現(xiàn)幀隔離,所以一旦因?yàn)橛布蓴_啥的導(dǎo)致多或少接收一個(gè)字節(jié)數(shù)據(jù),又或者數(shù)據(jù)接收錯(cuò)誤,那么再?gòu)木彺嬷械玫揭粠暾麛?shù)據(jù)就比較耗時(shí)了,所以狀態(tài)機(jī)一定要有自恢復(fù)機(jī)制,能夠繼續(xù)處理后續(xù)的數(shù)據(jù)幀。3、一旦數(shù)據(jù)處理比較慢,而剩余緩存空間不夠大,那么未處理的數(shù)據(jù)將自動(dòng)被DMA接收的新數(shù)據(jù)所覆蓋,所以緩存大小一定要有富余。4、一次發(fā)送的數(shù)據(jù)大于或等于緩存空間,那么in的值就有問(wèn)題,所以發(fā)送者發(fā)送的一幀數(shù)據(jù)一定不能大于或等于緩存空間,切記這一點(diǎn)。 上面的第3點(diǎn)可以通過(guò)處理來(lái)提醒用戶緩存不夠(有些無(wú)法情況無(wú)法發(fā)覺(jué)),這個(gè)魚(yú)鷹在代碼中做了處理,各位可參考。而第四點(diǎn)一般不會(huì)出現(xiàn),這是在設(shè)計(jì)DMA緩存時(shí)就會(huì)考慮的。
責(zé)任編輯:pj

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

    關(guān)注

    1

    文章

    246

    瀏覽量

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

    關(guān)注

    3

    文章

    576

    瀏覽量

    103090
  • 數(shù)據(jù)處理
    +關(guān)注

    關(guān)注

    0

    文章

    627

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    有沒(méi)有上位機(jī)獲取DMA狀態(tài)的API?

    我想在發(fā)送數(shù)據(jù)之前,查看DMA的狀態(tài)?;蛘咴诮邮?b class='flag-5'>數(shù)據(jù)之前獲取DMA的狀態(tài)。
    發(fā)表于 05-13 08:28

    使用串口dma環(huán)形接收+空閑中斷,觸發(fā)空閑中斷后進(jìn)入任務(wù)中拷貝數(shù)據(jù)發(fā)現(xiàn)拷貝的數(shù)據(jù)全為0,怎么處理?

    求助,我使用串口dma環(huán)形接收+空閑中斷,默認(rèn)應(yīng)該開(kāi)了緩存,在觸發(fā)空閑中斷后進(jìn)入任務(wù)中拷貝數(shù)據(jù)發(fā)現(xiàn)拷貝的數(shù)據(jù)全為0,但是我掛上調(diào)試之后在拷貝之前只要打上斷點(diǎn)斷一次執(zhí)行之后再執(zhí)行就正常了
    發(fā)表于 03-27 06:17

    數(shù)字化車(chē)間中,如何有效實(shí)施數(shù)據(jù)中臺(tái)?

    車(chē)間的業(yè)務(wù)模式、數(shù)據(jù)來(lái)源、數(shù)據(jù)量、數(shù)據(jù)處理流程等,以便確定數(shù)據(jù)中臺(tái)的功能范圍和技術(shù)架構(gòu)。與車(chē)間各部門(mén)進(jìn)行深入溝通,了解他們?cè)?b class='flag-5'>數(shù)據(jù)應(yīng)用中的痛點(diǎn)
    的頭像 發(fā)表于 01-09 17:45 ?363次閱讀

    三維測(cè)量數(shù)據(jù)處理流程

    一系列的處理步驟才能轉(zhuǎn)化為有用的信息。 1. 數(shù)據(jù)采集 三維測(cè)量數(shù)據(jù)處理的第一步是數(shù)據(jù)采集。這一步驟涉及到使用各種傳感器和設(shè)備來(lái)獲取三維
    的頭像 發(fā)表于 12-30 15:06 ?738次閱讀

    康謀分享 | 如何應(yīng)對(duì)ADAS/AD海量數(shù)據(jù)處理挑戰(zhàn)?

    如何有效處理ADAS/AD海量數(shù)據(jù)并從中獲得見(jiàn)解?IVEX數(shù)據(jù)處理流程可自動(dòng)從原始傳感器數(shù)據(jù)等輸入中識(shí)別出值得關(guān)注的事件和場(chǎng)景,推動(dòng)數(shù)據(jù)高效
    的頭像 發(fā)表于 12-25 10:05 ?3966次閱讀
    康謀分享 | 如何應(yīng)對(duì)ADAS/AD海量<b class='flag-5'>數(shù)據(jù)處理</b>挑戰(zhàn)?

    緩存對(duì)大數(shù)據(jù)處理的影響分析

    緩存對(duì)大數(shù)據(jù)處理的影響顯著且重要,主要體現(xiàn)在以下幾個(gè)方面: 一、提高數(shù)據(jù)訪問(wèn)速度 在大數(shù)據(jù)環(huán)境中,數(shù)據(jù)存儲(chǔ)通常采用分布式存儲(chǔ)系統(tǒng),
    的頭像 發(fā)表于 12-18 09:45 ?756次閱讀

    緩存技術(shù)在軟件開(kāi)發(fā)中的應(yīng)用

    在現(xiàn)代軟件開(kāi)發(fā)中,隨著數(shù)據(jù)量的爆炸性增長(zhǎng)和用戶對(duì)響應(yīng)速度的高要求,緩存技術(shù)成為了提升系統(tǒng)性能的重要手段。緩存技術(shù)通過(guò)將數(shù)據(jù)存儲(chǔ)在離用戶更近的位置,減少
    的頭像 發(fā)表于 12-18 09:32 ?688次閱讀

    cmp在數(shù)據(jù)處理中的應(yīng)用 如何優(yōu)化cmp性能

    CMP在數(shù)據(jù)處理中的應(yīng)用 CMP(并行處理)技術(shù)在數(shù)據(jù)處理領(lǐng)域扮演著越來(lái)越重要的角色。隨著數(shù)據(jù)量的爆炸性增長(zhǎng),傳統(tǒng)的串行處理方法已經(jīng)無(wú)法滿足
    的頭像 發(fā)表于 12-17 09:27 ?1130次閱讀

    使用 RISC-V 進(jìn)行高效數(shù)據(jù)處理的方法

    使用RISC-V進(jìn)行高效數(shù)據(jù)處理的方法涉及多個(gè)方面,包括處理器內(nèi)核與DSA(領(lǐng)域特定加速器)之間的通信優(yōu)化、內(nèi)存管理優(yōu)化、多線程性能提升等。以下是一些具體的方法: 一、處理器內(nèi)核與DSA之間的通信
    的頭像 發(fā)表于 12-11 17:52 ?1070次閱讀

    上位機(jī)實(shí)時(shí)數(shù)據(jù)處理技術(shù) 上位機(jī)在智能制造中的應(yīng)用

    上位機(jī)實(shí)時(shí)數(shù)據(jù)處理技術(shù) 上位機(jī)實(shí)時(shí)數(shù)據(jù)處理技術(shù)是指上位機(jī)(通常是指PC或服務(wù)器上的應(yīng)用程序)通過(guò)各種通信協(xié)議與下位機(jī)(如PLC、嵌入式系統(tǒng)等)進(jìn)行交互,實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)收集、處理、顯示和
    的頭像 發(fā)表于 12-04 10:29 ?1435次閱讀

    eda中常用的數(shù)據(jù)處理方法

    探索性數(shù)據(jù)分析(EDA)是一種統(tǒng)計(jì)方法,用于使用統(tǒng)計(jì)圖表、圖形和計(jì)算來(lái)發(fā)現(xiàn)數(shù)據(jù)中的模式、趨勢(shì)和異常值。在進(jìn)行EDA時(shí),數(shù)據(jù)處理是至關(guān)重要的,因?yàn)樗梢詭椭覀兏玫乩斫?b class='flag-5'>數(shù)據(jù)集,為進(jìn)一步
    的頭像 發(fā)表于 11-13 10:57 ?880次閱讀

    海量數(shù)據(jù)處理需要多少RAM內(nèi)存

    處理海量數(shù)據(jù)時(shí),內(nèi)存的大小直接影響到數(shù)據(jù)的讀寫(xiě)速度和整體處理能力。更多的內(nèi)存意味著可以將更多的數(shù)據(jù)緩存
    的頭像 發(fā)表于 11-11 09:56 ?1250次閱讀

    FPGA在數(shù)據(jù)處理中的應(yīng)用實(shí)例

    FPGA(現(xiàn)場(chǎng)可編程門(mén)陣列)在數(shù)據(jù)處理領(lǐng)域有著廣泛的應(yīng)用,其高度的靈活性和并行處理能力使其成為許多高性能數(shù)據(jù)處理系統(tǒng)的核心組件。以下是一些FPGA在數(shù)據(jù)處理中的應(yīng)用實(shí)例: 一、通信協(xié)議
    的頭像 發(fā)表于 10-25 09:21 ?1348次閱讀

    實(shí)時(shí)數(shù)據(jù)處理的邊緣計(jì)算應(yīng)用

    實(shí)時(shí)數(shù)據(jù)處理的邊緣計(jì)算應(yīng)用廣泛,涵蓋了多個(gè)行業(yè)和領(lǐng)域。以下是一些典型的應(yīng)用場(chǎng)景: 一、工業(yè)制造 在工業(yè)制造領(lǐng)域,邊緣計(jì)算技術(shù)被廣泛應(yīng)用于生產(chǎn)線上的設(shè)備監(jiān)控、數(shù)據(jù)處理和實(shí)時(shí)控制。通過(guò)在生產(chǎn)線上安裝
    的頭像 發(fā)表于 10-24 14:11 ?1099次閱讀

    如何在KEIL軟件中將變量定義在特定的RAM空間中

    _____________________________________________________________如何在KEIL軟件中將變量定義在特定的RAM空間中
    發(fā)表于 10-16 22:47