您的位置 首页 元件

自从用上缓冲,通讯不再破功

元朝末年,黄河泛滥,瘟疫流行,加之官僚腐败,渐至于民不聊生,老百姓为了活命只得揭竿而起。一时间,风云变幻,狼烟四起。在一众草莽英雄中,朱元璋采纳谋士朱升的九字真言:“深挖洞、广积粮、缓称王”,韬光养晦

元朝末年,黄河众多,瘟疫盛行,加之官僚糜烂,渐至于生灵涂炭,老百姓为了活命只得揭竿而起。一时刻,风云变幻,狼烟四起。在一众草莽英雄中,朱元璋采用谋士朱升的九字真言:“深挖洞、广积粮、缓称王”,韬光养晦,积储力气,终究定鼎全国,平定四方。

再后来,中苏交恶时期,毛主席也振聋发聩地提出“深挖洞、广积粮、不称雄”的召唤。

两朝太祖都是百年一遇的政治家、军事家,英雄所见略同,他们深知战略储藏的力气,知道唯有建造深沉的国家储藏,才不至于阵亡于暗暗长夜而等不来那终将降临的天光。

就拿现在来说吧,我辈吃瓜大众有福气,能够好整以暇地看美国各个州的州长和特朗普在推特上骂来骂去地打嘴炮,其实这还不是由于美国联邦政府储藏的医疗物资耗费殆尽,没有应急的储藏形成的?

这些储藏平常躺在仓库里睡大觉,还要支付长时刻保护和定时替换的昂扬本钱,但是它们在关键时刻能救命,疫情连三月,呼吸机抵万金呐!当需求高峰期来时,这些平常没啥用的储藏能够赢得名贵的时刻,抢救软弱的生命!

不过,立国不到三百年的美国人哪有这种前史感悟?

经过树立“空间”纵深,以应对时刻密集型的突发需求,拿空间换时刻,这便是“储藏”的意义。

在程序员的国际里,这种储藏叫做“缓冲”。今日,笔者就跟咱们共享一个多年前发生在自己身上的事例,一个由于没有运用储藏导致“数据丢掉”的故事。

那正是冰天雪地的时节。

窗外暴风席卷,人影难觅,只需一面冷飕飕的月亮像瑶台的镜子,远远地挂在云端。那天,甚是高远,似穹庐,笼盖在一座小楼的上方。

那楼里只亮着一盏灯,亮灯的房间里只需一个人。

天高云淡,这个房间很孑立,这个人也很孑立。

这个人,便是鄙人!

月黑风高夜,正是捉虫时,没错,别看鄙人枯坐已久,但脑袋却在转个不断,鄙人正在对着电脑屏幕找bug!

其时,项目组正在做一款蓝牙文娱设备,概而言之,这款设备插上U盘能放歌,接上蓝牙能免提,连上手机还能用音频流播映手机里的音乐。

现在说来这些都不算啥,但是在十余年前,那可算是个新概念。

这个设备的开发采用了双处理器计划,概而言之,一颗主控处理器处理人机接口,首要功用是以按键和显示屏的方法办理播映列表、通话和音乐播映,还有一颗蓝牙单芯片处理和手机的蓝牙通讯,首要功用是把来电恳求、通话状况发给主控处理器,一起接纳来自主控的接听/挂断电话指令、音乐控制指令等。

主控处理器是个32位的单片机,蓝牙芯片选用CSR集成了蓝牙基带的单芯片,两者经过SCI接口进行通讯。

鄙人不才,在里面担任蓝牙单芯片的开发。

如前所述,这两颗单片机以SCI接口进行通讯。为了更顺口一些,仍是说串口吧,只不过,大多数人印象中的串口是RS232,它首要用于设备间的通讯,而笔者这里是同一个设备电路中的通讯,没有走RS232电平,直接走TTL电平。

串口通讯就有通讯协议,为了减轻主控开发人员的担负,鄙人毛遂自荐地承当了协议的拟定作业,却不成想,这倒成了我后来“背锅”的原因。

刚开始,我和担任主控芯片软件开发的李工一边喝着茶水磨牙争吵,一边“你打你的,我打我的”地加班加点,偶有串口联调通讯,也是一切顺畅,万事大吉,直到出人意料的数据丢掉把这种年月静好打成了满地狼藉。

那是即将起风的一天黄昏,搭档们都各自归家,游戏人间烟火去了,独独剩余我和李工还在苦逼地写代码。

北岛说:假如你是一条船,流浪便是你的命运,可别泊岸。领导说:假如你是一个工程师,加班便是你的命运,可别想着早下班。

想着那些早下班的搭档,我也想到一句话:哪里有什么年月静好,只不过我和李工在替你们负重前行!

工作室里万籁俱静,静的有些出奇,李工在一旁眉头紧闭,间或捏着下巴颏子向我投来厚意的一瞥,直让人起鸡皮疙瘩。我在一旁也打起了嘀咕,“这厮有事?”

公然,李工带着酌量的口气开口了,“天雷君,你定的串口通讯协议莫不是有问题?感觉丢数据呢!”

本来,从今全国午起,李工做通话办理那部分程序时,有时分得不到正确次第的数据。比方说,手机来电话了,用户直接在手机上接通了,蓝牙芯片这边本来会按次第发过来“来电恳求、接通等候、接通通话”,但是有的时分,没有“来电恳求”就直接把“接通等候”这个报文发过来了。

而通话办理程序实际上是一个状况机,依照这几条报文跳转通话状况,现在报文次第不对,状况机天然就乱套了。

问题是显着的,原因好像也是呼之欲出的。按李工的说法,是蓝牙链路的射频通讯搅扰了串口通讯,导致报文里的数据犯错,依照李工的提议,应该修正串口通讯协议,每条报文应该连发两次,这样才干确保犯错的几率大大下降。

那时我还年青,惯于把他人甩的锅自觉地戴在自己头上。所以,我默默地收起心里的自豪,采用了他的定见。

不曾想,待我把报文发送改成连发两次后,问题呈现的几率好像更高了!!

所以,李工给我判了刑,要求大改通讯协议,然后就拂袖回家了。

我尝遍人间冷暖冷暖,但仍然愿在不念情义的国际里厚意地活着——这才是日子。

李工走后,偌大的工作室只剩余我一个人了。

月亮逐渐爬上树梢,北风在窗外吼怒,月亮很孑立,我也很孑立。

我孤单地看着李工留给我的代码,在这萧杀的幽静里,捕捉着不知藏身何处的bug。

是的,“严于律人、宽以待己”的我可没觉得自己有哪里不对,‘通讯协议有什么好改的?’我一边在鼻尖哼着气,一边看李工写的代码。

在李工的程序里,是经过中止接纳串口发送的字节,然后在一个独自的使命解析报文的,解分出一条完好的报文后,再依据报文的意义向其它相应的使命里发消息。

我看了看李工为串口报文解析使命设定的优先级,居然是最低的!

其实,其时我也不知道该怎样设置使命的优先级,但是,联想到之前李工指控我通讯协议有问题的情形,我便是觉得:怎样能够把这么‘重要’的使命设置成最低的优先级呢?

我一边在鼻孔哼着气,一边改了使命的优先级。三下五除二,再调试一把,还甭说,公然好多了,测了好几遍,没问题!

既如此,我豁然了。底子不是通讯协议的事儿,而是报文一股脑地发过来时,主控这边处理报文不及时,导致“来电恳求”报文还没解析完时,其间的数据就被破坏了。

所以,我恍然了。使命优先级设置不同,会导致这么显着的差异,这实际上也给我敲响了警钟:使命优先级不要随意动!

但是,我又再度默然了。我这么轻率地改了优先级,是不是或许会有许多其它功用呈现不可思议的毛病呢?所以,我一个激灵,默默地把优先级改了回去。

年月如水,拨动着墙上的挂钟指针,也拨动着我的心弦。

看着眼前剩余的半杯水,我生起了哲学的沉思:“人生,过一天少一天,但是咱们并不急着把这一辈子过完;水杯,喝一口少一口,但是咱们并不想着一口气喝光。寿数、水杯都是一种缓冲型的容器,让咱们能够缓步代车,不疾不徐。”

那串口接纳岂非也是如此?只需给它一个满足的缓冲,即便短时期内来了好几条报文,也不阻碍咱们一条一条地处理了!

开了窍的我,带着振奋的心境,在李工的代码里完成了一个环形缓冲器。拿出512个字节,开个数组,树立两个索引,别离符号读取方位和写入方位,这些索引到了512后主动归零。刚开始时,天然是写入索引大于读取索引,数据就这样鱼贯而入鱼贯而出。

慢慢地,只需写入索引的回零次数不大于(读取索引回零次数+1),即便呈现了数据堆积,只需假以时刻,也能准确无误地把数据消费完。而一旦呈现写入索引回零次数大于读取索引回零次数+1,就表明数据呈现了溢出,此时调大缓冲区的巨细即可。

问题就这么顺畅地处理了,自从用上了缓冲,后边的通讯便没有再破过功。

至于李工,他看完被我改造过的代码,再次给我投来厚意的一瞥。我回以嫣然一笑,对着他英俊的脸庞吐出两句诗:桃花潭水深千尺,不及我跟李工情呐!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/114418.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部