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