日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
標(biāo)題:解決Linux串口緩存空閑問(wèn)題(linux串口緩存空)

解決Linux串口緩存空閑問(wèn)題

在仙桃等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站制作,仙桃網(wǎng)站建設(shè)費(fèi)用合理。

在Linux開(kāi)發(fā)領(lǐng)域中,串口通信是一種廣泛應(yīng)用于嵌入式系統(tǒng)中的通信方式之一。但是,在Linux系統(tǒng)中,由于串口通信時(shí)使用了緩存機(jī)制,當(dāng)串口通信過(guò)程中傳輸數(shù)據(jù)過(guò)慢時(shí),緩存區(qū)很容易就會(huì)因?yàn)閿?shù)據(jù)無(wú)法及時(shí)處理而滿,并且此時(shí)的空閑緩存是無(wú)法釋放的,這就給程序的正常運(yùn)行造成了很大的干擾,導(dǎo)致程序假死等問(wèn)題。在這篇文章中,我們將會(huì)以一個(gè)Case為例,來(lái)詳細(xì)介紹如何解決Linux串口緩存空閑問(wèn)題。

Case簡(jiǎn)介

下面的場(chǎng)景中,我們將用C++的代碼實(shí)現(xiàn)一個(gè)基于串口通信的雙向數(shù)據(jù)傳輸程序,并在程序中應(yīng)用串口緩存機(jī)制,以實(shí)現(xiàn)數(shù)據(jù)的流暢傳輸,并且我們?cè)跍y(cè)試中會(huì)建立一個(gè)以USB2TTL為物理接口,依據(jù)不同的緩存涵蓋大小作為實(shí)驗(yàn)數(shù)據(jù),來(lái)檢測(cè)空閑緩存機(jī)制在處理傳輸緩慢的情況下的影響。

實(shí)驗(yàn)環(huán)境

· 操作系統(tǒng):Ubuntu18.04

· C++編譯器:GCC

· 開(kāi)發(fā)板:樹(shù)莓派3b+

代碼實(shí)現(xiàn)

在代碼實(shí)現(xiàn)中,我們使用了開(kāi)源的C++串口通信庫(kù)“boost”,它的好處在于比較方便,使用起來(lái)也相對(duì)簡(jiǎn)單。

#include

#include

#include

#include

#include

using namespace boost::asio;

using namespace std;

io_service io;

serial_port serial(io);

void readThread()

{

while(true){

try{

//串口接收緩存等待時(shí)間

usleep(1000);

unsigned char c;

read(serial,buffer(&c,1));

cout

}

catch(boost::system::system_error& e){

cerr

}

}

}

void writeThread()

{

string inputChars;

while(true){

try{

//鍵盤(pán)輸入方式,實(shí)現(xiàn)小端字節(jié)排列

string inputChars;

getline(cin,inputChars);

if(!inputChars.empty()){

for(int i=0;i

{

unsigned char c = 0;

c |= (unsigned char)(inputChars[i+1]);

c

c |= (unsigned char)(inputChars[i]);

write(serial,buffer(&c,1));

}

}

}

catch(boost::system::system_error& e){

cerr

}

}

}

int mn(int argc,char* argv[])

{

try{

//configuration

int baudRate = 57600;

//串口物理接口

string serialDevice = “”;

io_service io;

serial_port::baud_rate baud(baudRate);

serial_port serial(io,serialDevice);

serial.set_option(baud);

//串口發(fā)送緩存大小

serial.set_option(serial_port::send_buffer_size(128));

//串口接收緩存大小

serial.set_option(serial_port::receive_buffer_size(128));

boost::thread thR(boost::bind(&readThread));

boost::thread thW(boost::bind(&writeThread));

//主程序接雙線程等待

thR.join();

thW.join();

}

catch(boost::system::system_error& e){

cerr

}

catch(…){

cerr

}

return 0;

}

上述代碼主要實(shí)現(xiàn)了串口緩存的初始化配置和雙向數(shù)據(jù)傳輸功能。其中,緩存大小可以根據(jù)你實(shí)際的應(yīng)用需求去調(diào)整。

實(shí)驗(yàn)步驟

在實(shí)驗(yàn)中,我們將分別測(cè)試不同的緩存大小下,緩存空閑時(shí)的處理情況,從而檢測(cè)不同大小的緩存區(qū)間間隔。

在運(yùn)行程序之前,需要連接USB轉(zhuǎn)TTL,并將接收端(TTL TX)接在發(fā)送端(TTL RX)上,而發(fā)送端(TTL TX)則無(wú)需接通任何設(shè)備。接下來(lái),我們可以依照不同的實(shí)驗(yàn)需求,設(shè)置緩存區(qū)的大小并進(jìn)行測(cè)試。

實(shí)驗(yàn)一 緩存區(qū)大小為128字節(jié),實(shí)驗(yàn)時(shí)間為1min

使用128字節(jié)進(jìn)行實(shí)驗(yàn)時(shí),除去一些小的串口數(shù)據(jù)波動(dòng),我們可以看到,基本上是沒(méi)有空閑緩存區(qū)的。也就是說(shuō),我們?cè)谑褂眯【彺娲笮〉那闆r下能夠達(dá)到良好的數(shù)據(jù)傳輸效果。

實(shí)驗(yàn)二 緩存區(qū)大小為512字節(jié),實(shí)驗(yàn)時(shí)間為1min

使用512字節(jié)的情況下,我們可以看到,空閑緩存的時(shí)間明顯增加了,達(dá)到了15%-20%的左右,并且在空閑緩存區(qū)超過(guò)一段時(shí)間后就會(huì)自動(dòng)釋放。從實(shí)驗(yàn)數(shù)據(jù)來(lái)看,在大緩存情況下,在數(shù)據(jù)傳輸快的情況下能夠達(dá)到良好的效果,但是在數(shù)據(jù)傳輸過(guò)慢時(shí)就會(huì)出現(xiàn)空閑緩沖區(qū)無(wú)法釋放的情況。

實(shí)驗(yàn)三 緩存區(qū)大小為1024字節(jié),實(shí)驗(yàn)時(shí)間為1min

使用1024字節(jié)緩存時(shí),從實(shí)驗(yàn)數(shù)據(jù)中可以看到,空閑緩存區(qū)時(shí)間也相應(yīng)地增加,達(dá)到了20%以上,并且空閑緩存區(qū)無(wú)法自動(dòng)釋放,導(dǎo)致程序不能正常運(yùn)行。

實(shí)驗(yàn)數(shù)據(jù)

實(shí)驗(yàn)數(shù)據(jù)如下列表所示:

緩存區(qū)大小 空閑緩存區(qū)占比 空閑時(shí)間 空閑緩存區(qū)自動(dòng)釋放

128字節(jié) 基本沒(méi)有空閑緩存區(qū) – –

512字節(jié) 空閑緩存區(qū)約為15%-20% 空閑緩存區(qū)約為2-3s 時(shí)間到達(dá)10-15s會(huì)自動(dòng)釋放

1024字節(jié) 空閑緩存區(qū)約為20%以上 空閑緩存區(qū)未被釋放 空閑緩存區(qū)不能自動(dòng)釋放

結(jié)論

在實(shí)驗(yàn)中,我們可以看到,隨著串口緩存區(qū)越來(lái)越大,也就越容易出現(xiàn)空閑緩存部分過(guò)多而無(wú)法自動(dòng)釋放的問(wèn)題。

當(dāng)我們?cè)谛【彺媲闆r下使用時(shí),我們會(huì)發(fā)現(xiàn)在數(shù)據(jù)傳輸過(guò)慢時(shí)數(shù)據(jù)會(huì)停滯,但是并不影響其它數(shù)據(jù)緩沖通路的運(yùn)行,所以選擇小緩存是最為穩(wěn)妥的。

如果在大緩存情況下的空閑緩存區(qū),即使空閑時(shí)間超過(guò)10-15秒,它也無(wú)法自動(dòng)釋放,這樣就會(huì)導(dǎo)致在串口通信過(guò)程中程序會(huì)假死或出現(xiàn)一些其他問(wèn)題。因此,我們需要為不同的應(yīng)用場(chǎng)景選擇不同大小的緩存區(qū)。

相關(guān)問(wèn)題拓展閱讀:

  • 如何在linux命令中刪除緩存
  • Linux中的緩沖區(qū)和緩存內(nèi)存有什么區(qū)別

如何在linux命令中刪除緩存

#清理Linux系統(tǒng)緩存

# echo 1 > /proc/sys/vm/drop_caches

注:1>. /proc是一個(gè)虛擬消梁搜文件系統(tǒng),可以通過(guò)對(duì)它的讀寫(xiě)操作作為與kernel實(shí)體間進(jìn)行通信的一種手段。也就是說(shuō)可以通過(guò)修改/proc中的文件,來(lái)對(duì)當(dāng)前kernel的行為做出調(diào)整。也就是說(shuō)我們可以通過(guò)調(diào)整/proc/sys/vm/drop_caches來(lái)釋放內(nèi)存。

0 – 不釋放

1 – 釋放頁(yè)緩存

2 – 釋放文渣胡件節(jié)點(diǎn)緩存和目錄項(xiàng)緩存

3 – 釋放所有緩存

# sysctl -p

#查看拿歷剩余內(nèi)存

# free -m

totalusedfree shared buffers cached

Mem:

-/+ buffers/cache:

Swap:

#清理Linux系統(tǒng)緩存

# echo 1 > /proc/sys/vm/drop_caches

注:1>. /proc是一個(gè)虛擬文件系統(tǒng),可以通過(guò)對(duì)它的讀寫(xiě)操作作為與kernel實(shí)體間進(jìn)行通信的一鎮(zhèn)臘種手段。也就是說(shuō)可以通過(guò)修改/proc中的文件,來(lái)對(duì)當(dāng)前kernel的行為做出調(diào)整。也就是說(shuō)我們可以通過(guò)調(diào)整/proc/sys/vm/drop_caches來(lái)釋放內(nèi)存。

0 – 不釋放

1 – 釋放頁(yè)緩存搏旅枯

2 – 釋放文件節(jié)點(diǎn)緩存和目錄項(xiàng)緩存

3 – 釋放所有緩存基洞

# sysctl -p

#查看剩余內(nèi)存

# free -m

totalusedfree shared buffers cached

Mem:

-/+ buffers/cache:

Swap:

Linux中的緩沖區(qū)和緩存內(nèi)存有什么區(qū)別

緩沖鎮(zhèn)瞎區(qū)與特定的塊設(shè)備相肆鋒關(guān)聯(lián),包括文件系統(tǒng)元數(shù)據(jù)的緩存以及頁(yè)面跟蹤。緩存只御雹空包含已停放的文件數(shù)據(jù)。

也就是說(shuō),緩沖區(qū)記住目錄中的內(nèi)容、文件權(quán)限是什么,并跟蹤從某個(gè)塊設(shè)備中寫(xiě)入或讀取到哪些內(nèi)存。

緩存只包含文件本身的內(nèi)容。

在Linux系統(tǒng)下,我們一般不需要去釋放內(nèi)存,因?yàn)橄到y(tǒng)已經(jīng)將內(nèi)存管理的很好。但是凡事也有例拿枝爛外,有的時(shí)候內(nèi)存會(huì)被緩存占用掉,導(dǎo)致系統(tǒng)使用SWAP空間影響性能,此時(shí)就需要執(zhí)行釋放內(nèi)存(清理緩存)的操作了。

Linux系統(tǒng)的緩存機(jī)制是相當(dāng)先進(jìn)的,他會(huì)針對(duì)dentry(用于VFS,加速文件路徑名到inode的轉(zhuǎn)換)、Buffer Cache(針對(duì)磁盤(pán)塊的讀寫(xiě))和Page Cache(針對(duì)文件inode的讀寫(xiě))進(jìn)行緩存操作。但是在進(jìn)行了大量文件操作之后,緩消漏存會(huì)把內(nèi)存資源基本用光。但實(shí)際上我們文件操作已經(jīng)完成,這部分緩存已經(jīng)用不到了。這個(gè)時(shí)候,我們難道只能眼睜睜的看著緩存把內(nèi)存空間占據(jù)掉么?

所以,我們還是有必要來(lái)手動(dòng)進(jìn)行Linux下釋放內(nèi)存的操作,其實(shí)也就是釋放緩存的操作了。

要達(dá)到釋放緩存的目搭檔的,我們首先需要了解下關(guān)鍵的配置文件/proc/sys/vm/drop_caches。這個(gè)文件中記錄了緩存釋放的參數(shù),默認(rèn)值為0,也就是不釋放緩存。他的值可以為0~3之間的任意數(shù)字,代表著不同的含義:

0 – 不釋放

1 – 釋放頁(yè)緩存

2 – 釋放dentries和inodes

3 – 釋放所有緩存

知道了參數(shù)后,我們就可以根據(jù)我們的需要,使用下面的指令來(lái)進(jìn)行操作。

首先我們需要使用sync指令,將所有未寫(xiě)的系統(tǒng)緩沖區(qū)寫(xiě)到磁盤(pán)中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫(xiě)映射文件。否則在釋放緩存的過(guò)程中,可能會(huì)丟失未保存的文件。

#sync

接下來(lái),我們需要將需要的參數(shù)寫(xiě)進(jìn)/proc/sys/vm/drop_caches文件中,比如我們需要釋放所有緩存,就輸入下面的命令:

#echo 3 > /proc/sys/vm/drop_caches

此指令輸入后會(huì)立即生效,可以查詢現(xiàn)在的可用內(nèi)存明顯的變多了。

要查詢當(dāng)前緩存釋放的參數(shù),可以輸入下面的指令:

#cat /proc/sys/vm/drop_caches

#free -m

對(duì)于清除swap,只有先關(guān)閉swap了,用:

#swapoff -a

而后啟用swap,因?yàn)橹皇乔宄皇钦f(shuō)不要用swap的嘛 :

#swapon -a

Linux 自動(dòng)釋放內(nèi)存腳本

發(fā)表于119 天前 ? 技術(shù)文章 ? 暫無(wú)評(píng)論

腳本下載

腳本內(nèi)容:

#! /bin/bash

# cache釋放:

# To free pagecache:

sync

sync

#echo 1 > /proc/sys/vm/drop_caches

# To free dentries and inodes:

#echo 2 > /proc/sys/vm/drop_caches

# To free pagecache, dentries and inodes:

echo 3 > /proc/sys/vm/drop_caches

# 說(shuō)明,釋放前更好sync一下,防止丟數(shù)據(jù)。

利用系統(tǒng)crontab實(shí)現(xiàn)每天自動(dòng)運(yùn)行:

crontab -e

輸入以下內(nèi)容:

00 00 * * * /root/Cached.sh

每天0點(diǎn)釋放一次內(nèi)存,這個(gè)時(shí)間可以根據(jù)自己需要自行設(shè)置,我的服務(wù)器情況是每天自動(dòng)釋放一次就OK了

在設(shè)置這個(gè)腳本的時(shí)候,發(fā)生了一系列的問(wèn)題

在測(cè)試運(yùn)行./Cached.sh時(shí)提示錯(cuò)誤:Permission denied 權(quán)限的問(wèn)題

解決方法:

chmod +x .Cached.sh

chmod 777 Cached.sh

接著又出現(xiàn)錯(cuò)誤提示:/bin/bash^M: bad interpreter: No such file or directory

這是因?yàn)樵趙indows下編輯的.sh文件編碼格式和linux下不一樣,轉(zhuǎn)換一下編碼格式即可:

dos2unix Cached.sh

關(guān)于linux 串口緩存空的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


當(dāng)前名稱:標(biāo)題:解決Linux串口緩存空閑問(wèn)題(linux串口緩存空)
URL標(biāo)題:http://www.dlmjj.cn/article/djippsc.html