新聞中心

EEPW首頁 > 牛人業話 > 自從用上緩沖,通信不再破功

自從用上緩沖,通信不再破功

作者:天雷君時間:2020-05-11來源:電子產品世界收藏

元朝末年,黃河泛濫,瘟疫流行,加之官僚腐敗,漸至于民不聊生,老百姓為了活命只得揭竿而起。一時間,風云變幻,狼煙四起。在一眾草莽英雄中,朱元璋采納謀士朱升的九字真言:“深挖洞、廣積糧、緩稱王”,韜光養晦,積蓄力量,最終定鼎天下,平定四方。

本文引用地址:http://www.mzugvc.icu/article/202005/412945.htm

再后來,中蘇交惡時期,毛主席也振聾發聵地提出“深挖洞、廣積糧、不稱霸”的號召。

兩朝太祖都是百年一遇的政治家、軍事家,英雄所見略同,他們深知戰略儲備的力量,曉得唯有建設深厚的國家儲備,才不至于陣亡于暗暗長夜而等不來那終將來臨的天光。

就拿現在來說吧,我輩吃瓜群眾有福氣,可以好整以暇地看美國各個州的州長和特朗普在推特上罵來罵去地打嘴炮,其實這還不是因為美國聯邦政府儲備的醫療物資消耗殆盡,沒有應急的儲備造成的?

這些儲備平時躺在倉庫里睡大覺,還要付出長期維護和定期更換的高昂成本,但是它們在關鍵時刻能救命,疫情連三月,呼吸機抵萬金吶!當需求高峰期來時,這些平時沒啥用的儲備可以贏得寶貴的時間,挽救脆弱的生命!

不過,立國不到三百年的美國人哪有這種歷史感悟?

通過建立“空間”縱深,以應對時間密集型的突發需求,拿空間換時間,這就是“儲備”的意義。

在程序員的世界里,這種儲備叫做“”。今天,筆者就跟大家分享一個多年前發生在自己身上的案例,一個因為沒有使用儲備導致“數據丟失”的故事。

那正是天寒地凍的時節。

窗外狂風席卷,人影難覓,只有一面冷颼颼的月亮像瑤臺的鏡子,遠遠地掛在云端。那天,甚是高遠,似穹廬,籠蓋在一座小樓的上方。

那樓里只亮著一盞燈,亮燈的房間里只有一個人。

天高云淡,這個房間很孤單,這個人也很孤單。

這個人,就是在下!

月黑風高夜,正是捉蟲時,沒錯,別看在下枯坐已久,但腦袋卻在轉個不停,在下正在對著電腦屏幕找bug!

當時,項目組正在做一款藍牙娛樂設備,概而言之,這款設備插上U盤能放歌,接上藍牙能免提,連上手機還能用音頻流播放手機里的音樂。

現在說來這些都不算啥,但是在十余年前,那可算是個新概念。

這個設備的開發采用了雙處理器方案,概而言之,一顆主控處理器處理人機接口,主要功能是以按鍵和顯示屏的方式管理播放列表、通話和音樂播放,還有一顆藍牙單芯片處理和手機的藍牙通信,主要功能是把來電請求、通話狀態發給主控處理器,同時接收來自主控的接聽/掛斷電話指令、音樂控制指令等。

主控處理器是個32位的單片機,藍牙芯片選用CSR集成了藍牙基帶的單芯片,兩者通過SCI接口進行通信。

在下不才,在里面負責藍牙單芯片的開發。

如前所述,這兩顆單片機以SCI接口進行通信。為了更順口一些,還是說串口吧,只不過,大多數人印象中的串口是RS232,它主要用于設備間的通信,而筆者這里是同一個設備電路中的通信,沒有走RS232電平,直接走TTL電平。

就有通信協議,為了減輕主控開發人員的負擔,在下自告奮勇地承擔了協議的制定工作,卻不成想,這倒成了我后來“背鍋”的原因。

剛開始,我和負責主控芯片軟件開發的李工一邊喝著茶水磨牙拌嘴,一邊“你打你的,我打我的”地加班加點,偶有串口聯調通信,也是一切順利,萬事大吉,直到突如其來的數據丟失把這種歲月靜好打成了滿地狼藉。

那是將要起風的一天傍晚,同事們都各自歸家,游戲人間煙火去了,獨獨剩下我和李工還在苦逼地寫代碼。

北島說:如果你是一條船,漂泊就是你的命運,可別靠岸。領導說:如果你是一個工程師,加班就是你的命運,可別想著早下班。

想著那些早下班的同事,我也想到一句話:哪里有什么歲月靜好,只不過我和李工在替你們負重前行!

辦公室里萬籟俱靜,靜的有些出奇,李工在一旁眉頭緊鎖,間或捏著下巴頦子向我投來深情的一瞥,直讓人起雞皮疙瘩。我在一旁也打起了嘀咕,“這廝有事?”

果然,李工帶著斟酌的語氣開口了,“天雷君,你定的協議莫不是有問題?感覺丟數據呢!”

原來,從今天下午起,李工做通話管理那部分程序時,有時候得不到正確順序的數據。比方說,手機來電話了,用戶直接在手機上接通了,藍牙芯片這邊本來會按順序發過來“來電請求、接通等待、接通通話”,可是有的時候,沒有“來電請求”就直接把“接通等待”這個報文發過來了。

而通話管理程序實際上是一個狀態機,按照這幾條報文跳轉通話狀態,現在報文次序不對,狀態機自然就亂套了。

問題是顯然的,原因似乎也是呼之欲出的。按李工的說法,是藍牙鏈路的射頻通信干擾了,導致報文里的數據出錯,按照李工的提議,應該修改串口通信協議,每條報文應該連發兩次,這樣才能保證出錯的幾率大大降低。

那時我還年輕,慣于把別人甩的鍋自覺地戴在自己頭上。于是,我默默地收起內心的驕傲,采納了他的意見。

不曾想,待我把報文發送改成連發兩次后,問題出現的幾率似乎更高了??!

于是,李工給我判了刑,要求大改通信協議,然后就拂袖回家了。

我嘗遍世間冷暖炎涼,但依然愿在薄情的世界里深情地活著——這才是生活。

李工走后,偌大的辦公室只剩下我一個人了。

月亮漸漸爬上樹梢,寒風在窗外咆哮,月亮很孤單,我也很孤單。

我孤獨地看著李工留給我的代碼,在這蕭殺的寂靜里,捕捉著不知藏身何處的bug。

是的,“嚴于律人、寬以待己”的我可沒覺得自己有哪里不對,‘通信協議有什么好改的?’我一邊在鼻尖哼著氣,一邊看李工寫的代碼。

在李工的程序里,是通過中斷接收串口發送的字節,然后在一個單獨的任務解析報文的,解析出一條完整的報文后,再根據報文的含義向其它相應的任務里發消息。

我看了看李工為串口報文解析任務設定的優先級,居然是最低的!

其實,當時我也不知道該怎么設置任務的優先級,但是,聯想到之前李工指控我通信協議有問題的情景,我就是覺得:怎么能夠把這么‘重要’的任務設置成最低的優先級呢?

我一邊在鼻孔哼著氣,一邊改了任務的優先級。三下五除二,再調試一把,還別說,果然好多了,測了好幾遍,沒問題!

既如此,我釋然了。根本不是通信協議的事兒,而是報文一股腦地發過來時,主控這邊處理報文不及時,導致“來電請求”報文還沒解析完時,其中的數據就被破壞了。

于是,我恍然了。任務優先級設置不同,會導致這么明顯的差異,這實際上也給我敲響了警鐘:任務優先級不要隨便動!

可是,我又再度默然了。我這么貿然地改了優先級,是不是可能會有很多其它功能出現莫名其妙的故障呢?于是,我一個激靈,默默地把優先級改了回去。

歲月如水,撥動著墻上的鐘表指針,也撥動著我的心弦。

看著眼前剩下的半杯水,我生起了哲學的深思:“人生,過一天少一天,可是我們并不急著把這一輩子過完;水杯,喝一口少一口,可是我們并不想著一口氣喝光。壽命、水杯都是一種型的容器,讓我們可以安步當車,不疾不徐?!?/span>

那串口接收豈非也是如此?只要給它一個足夠的,即便短時期內來了好幾條報文,也不妨礙我們一條一條地處理了!

開了竅的我,帶著興奮的心情,在李工的代碼里實現了一個環形緩沖器。拿出512個字節,開個數組,建立兩個索引,分別標記讀取位置和寫入位置,這些索引到了512后自動歸零。剛開始時,自然是寫入索引大于讀取索引,數據就這樣魚貫而入魚貫而出。

慢慢地,只要寫入索引的回零次數不大于(讀取索引回零次數+1),即使出現了數據堆積,只要假以時間,也能準確無誤地把數據消費完。而一旦出現寫入索引回零次數大于讀取索引回零次數+1,就表示數據出現了溢出,此時調大緩沖區的大小即可。

問題就這么順利地解決了,自從用上了緩沖,后面的通信便沒有再破過功。

至于李工,他看完被我改造過的代碼,再次給我投來深情的一瞥。我回以嫣然一笑,對著他帥氣的臉龐吐出兩句詩:桃花潭水深千尺,不及我跟李工情吶!



關鍵詞: 串口通信 緩沖

評論


相關推薦

技術專區

關閉
下载优部怎么才能赚钱 好运彩3基本走势图 江苏快三彩乐乐 时时彩软件免费下载基地 广东11选5开市通知 理财平台跑路了怎么办 越南河内5分彩靠谱吗 保利配资 山东十一选五免费计划 青海省十一选五开奖结果 安徽快3三同号444遗漏