機加工網(wǎng)站南通seo網(wǎng)站優(yōu)化軟件
引言?
在嵌入式中,不可避免地會遇到數(shù)據(jù)的收發(fā)。
其實,數(shù)據(jù)的收發(fā)有很多情況。
總體上,分為數(shù)據(jù)的收和發(fā):
其中,數(shù)據(jù)發(fā)送是一個主動的行為,我們對要發(fā)送數(shù)據(jù)的數(shù)量特點等都是知道的,比如我們通過串口發(fā)送數(shù)據(jù),這時候,使用常規(guī)發(fā)送方式,或者結(jié)合使用DMA都是可以的;
相較而言,數(shù)據(jù)的接收就會麻煩一些,因為接收數(shù)據(jù),對于用戶來說是一個被動響應(yīng)的行為。接收數(shù)據(jù)也有很多種情況:
1、接收定長數(shù)據(jù);
2、接收不定長數(shù)據(jù);
3、接收的數(shù)據(jù)是隨機到來的,比如串口屏的觸摸發(fā)送鍵值到下位機,這種情況下,觸摸行為是沒有任何規(guī)律的,數(shù)據(jù)之間發(fā)送的間隔一般也比較長;
4、一直不斷地接收大量數(shù)據(jù),比如單片機需要一直接收串口數(shù)據(jù);
5、接收數(shù)據(jù)后透傳出去;
6、接收數(shù)據(jù)保存起來,等待上層應(yīng)用訪問;
以上幾種情況分別如何處理呢?
以串口為例:
首先,不管是哪種情況,只要是底層接收數(shù)據(jù),就一定要使用緩沖技術(shù),為什么呢?
這是因為底層數(shù)據(jù)接收的速度很快,而我們處理數(shù)據(jù)的速度沒那么快,如果只是簡單的一兩個語句來處理,比如給變量賦個值,做個簡單的判斷,沒什么問題,如果語句多了,比如printf,也有可能來不及處理,關(guān)于這點可以參考這篇文章:
基于串口的BLE模組CC2640R2使用總結(jié)_路溪非溪的博客-CSDN博客
那么,這些情況的緩沖有何區(qū)別呢?
1、接受定長數(shù)據(jù)相對簡單,使用普通串口接收或者DMA都可以;
2、接收不定長數(shù)據(jù),就需要使用串口中斷+空閑中斷或者DMA+空閑中斷,仍然參考:
基于串口的BLE模組CC2640R2使用總結(jié)_路溪非溪的博客-CSDN博客
3、接收數(shù)據(jù)隨機到來,因為數(shù)據(jù)接收沒那么快,一次可能只接受一兩幀數(shù)據(jù),所以不需要太大的緩沖區(qū);具體參考:F103串口和DMA配合使用總結(jié)_路溪非溪的博客-CSDN博客
4、這個情況就需要相對大一些的緩沖區(qū),因為數(shù)據(jù)來得比較快,可能還來不及處理就被覆蓋了,具體參考這篇文章:F103串口和DMA配合使用總結(jié)_路溪非溪的博客-CSDN博客
5、接收數(shù)據(jù)后透傳出去,這個基本都是底層的傳輸,所以接收緩沖后,就可以發(fā)出去,這個參考:基于串口的BLE模組CC2640R2使用總結(jié)_路溪非溪的博客-CSDN博客
6、接收數(shù)據(jù)保存起來供上層使用,這里就有個問題,底層接收數(shù)據(jù)保存起來,上層處理速度沒那么快,就需要考慮一些問題,緩沖區(qū)設(shè)置多大合適呢?多久處理一次呢?
以上提到的就是緩沖區(qū)的用法,用來解決快速的數(shù)據(jù)接收和慢速的數(shù)據(jù)處理之間不匹配的問題,具體看這張圖就能理解了:
其實,這里比較麻煩的也是比較常見的情況就是上面幾種情況的綜合:
接受不定長數(shù)據(jù)+不斷接收數(shù)據(jù)幀+保存起來供上層使用。
具體參考:F103串口和DMA配合使用總結(jié)_路溪非溪的博客-CSDN博客
串口空閑中斷+DMA可以解決前兩個問題,再就是接收的數(shù)據(jù)需要放在一個緩沖區(qū)里面,上層應(yīng)用需要時就來拿這個數(shù)據(jù)。
考慮這種場景:
電路中有連續(xù)的電壓,單片機通過AD采樣數(shù)據(jù),注意,這時候連續(xù)的數(shù)據(jù)就被離散化了,只要采樣率滿足采樣定理,就能無失真地還原出原有信號的樣子。
假如我們要采的是正弦信號的RMS值,那么就是個恒定的直流量,其中有一些波動是很正常的事情。此時,數(shù)據(jù)接收后緩存起來,緩存一些數(shù)據(jù)后做個均值濾波等等處理,然后得到一個比較穩(wěn)定的值,再將這個值存在一個變量中,此時,這個變量其實刷新的速率也是很快的。到這里,其實是底層的事情。
現(xiàn)在,我上層需要將這些數(shù)據(jù)拿來顯示在屏幕上,如果來一個數(shù)據(jù)我們就顯示一個數(shù)據(jù),那么,就強迫上層跟著下層的速度,首先跟不跟得上不說,上層這么快顯示數(shù)據(jù)沒有什么必要,增加數(shù)據(jù)發(fā)送的負(fù)擔(dān)不說,我們?nèi)搜垡沧R別不過來,如果底層1s刷新1000個點,那我1秒去拿10個數(shù)據(jù)來顯示也可以,也就是在定時器中,每隔100ms去拿一個數(shù)據(jù),最好調(diào)整下這個間隔以適配我們?nèi)搜鄣挠^察視覺,而且,如果不這樣,底層有時因為其他干擾數(shù)據(jù)發(fā)送時快時慢,我們上層顯示也會時快時慢,如果定時去取值顯示,就不會受底層速度的干擾,從而實現(xiàn)了底層快速和上層慢速的隔離,各司其職,用緩沖區(qū)作為“中介”。
就像這樣拿數(shù)據(jù)顯示:
另外還有一點,如果我發(fā)數(shù)據(jù)給串口屏太多太頻繁,可能會影響到同時發(fā)送的其他數(shù)據(jù)從而造成卡頓。
這里面有一點值得注意,就是,如果這樣顯示,那不就是有很多數(shù)據(jù)沒有拿到?首先,這里拿的是個RMS值,理想上是個恒定值,而且本來就是滿足采樣定理所采集到的離散值,從連續(xù)到離散,本來也有很多數(shù)據(jù)沒采到,但是不影響效果。
到底什么是緩沖技術(shù)呢??
緩沖區(qū)可以說是計算機中的一個連接站,用于連接計算機中高速、低速運行的部件。
作用:緩沖通常用于臨時存儲數(shù)據(jù),以平衡不同速度的數(shù)據(jù)傳輸過程之間的差異。它可以用來解決數(shù)據(jù)傳輸速度不匹配的問題。
工作原理:緩沖區(qū)是一個存儲區(qū)域,用于暫時保存數(shù)據(jù),待數(shù)據(jù)傳輸速度對齊后再將數(shù)據(jù)發(fā)送出去。在數(shù)據(jù)傳輸過程中,如果數(shù)據(jù)接收速度較快,數(shù)據(jù)會被存儲在緩沖區(qū)中。
數(shù)據(jù)處理: 緩沖區(qū)通常不會對數(shù)據(jù)進(jìn)行處理或修改,它只是臨時存儲數(shù)據(jù)的容器。
可以參考這個總結(jié):
緩沖是兩種不同速度設(shè)備之間的傳輸信息時平滑傳輸過程的常用手段。
引入緩沖技術(shù)的原因:
1、? 為了進(jìn)一步緩和CPU和I/O設(shè)備之間速度不匹配的矛盾。
2、? 提高CPU與I/O設(shè)備之間的并行性。
3、? 為了減少中斷次數(shù)和CPU的中斷處理時間。如果沒有緩沖,慢速I/O設(shè)備每傳一個字節(jié)就要產(chǎn)生一個中斷,CPU必須處理該中斷。如果用了緩沖技術(shù),則慢速的I/O設(shè)備將緩沖區(qū)填滿時,才向CPU發(fā)出中斷,從而減少了中斷次數(shù)和CPU的中斷處理時間。
4、? 為了解決DMA或通道方式下數(shù)據(jù)傳輸?shù)钠款i問題。DMA或通道方式都適用于成批數(shù)據(jù)傳輸,在無緩沖的情況下,慢速I/O設(shè)備只能一個字節(jié)一個字節(jié)的傳輸信息,這造成DMA方式或通道方式數(shù)據(jù)傳輸?shù)钠款i。緩沖區(qū)的設(shè)置適應(yīng)了DMA或通道方式的成批數(shù)據(jù)傳輸方式,解決了數(shù)據(jù)傳輸?shù)钠款i問題。
這里順便提一下,另外還有個概念叫緩存,注意區(qū)分:
作用: 緩存用于存儲已經(jīng)計算過或獲取過的數(shù)據(jù),以便在后續(xù)訪問時能夠更快地獲取數(shù)據(jù),從而提高系統(tǒng)的響應(yīng)速度。
工作原理: 緩存會將經(jīng)常訪問的數(shù)據(jù)復(fù)制到更快的存儲介質(zhì)中,如內(nèi)存,以便在后續(xù)訪問時無需再從原始數(shù)據(jù)源獲取。這樣能夠減少數(shù)據(jù)訪問時間,提高性能。
數(shù)據(jù)處理:緩存中的數(shù)據(jù)通??梢愿鶕?jù)需要進(jìn)行處理,以滿足特定的訪問要求。例如,可以將數(shù)據(jù)庫查詢結(jié)果存儲在緩存中,以減少數(shù)據(jù)庫訪問頻率。
實際應(yīng)用:Web瀏覽器使用緩存來存儲已經(jīng)訪問過的網(wǎng)頁,以便下次訪問同一網(wǎng)頁時能夠更快地加載。
兩者主要區(qū)別如下:
用途不同:緩沖主要用于平衡數(shù)據(jù)傳輸速度差異,而緩存主要用于提高數(shù)據(jù)訪問速度。
數(shù)據(jù)處理:緩沖不對數(shù)據(jù)進(jìn)行處理,只是暫時存儲,而緩存可以對數(shù)據(jù)進(jìn)行處理以滿足特定需求。
存儲介質(zhì):緩沖通常用于暫時存儲數(shù)據(jù),存儲在相同或類似的介質(zhì)上,而緩存通常將數(shù)據(jù)存儲在更快的存儲介質(zhì)中,如內(nèi)存。
數(shù)據(jù)類型:緩沖可以用于各種數(shù)據(jù)類型,包括傳輸中的數(shù)據(jù),而緩存通常用于經(jīng)常被訪問的數(shù)據(jù)。
總之,緩沖和緩存在數(shù)據(jù)處理中有著不同的作用和機制,了解它們的區(qū)別有助于更好地理解在不同情況下如何使用它們來優(yōu)化數(shù)據(jù)傳輸和訪問性能。
環(huán)形緩沖區(qū)?
可直接參考:
【數(shù)據(jù)結(jié)構(gòu)】環(huán)形緩沖區(qū)介紹,原理講解+代碼實現(xiàn)。(內(nèi)核__嵌入式__c語言數(shù)組)