时序就像脉搏,一点都错不得

  作者:光华居士 时间:2018-11-07来源:电子产品世界

浪子三唱,不唱悲歌,红尘间,悲伤事,已太多。

佛祖有云,人生八苦交煎,所谓八苦者,生、老、病、死、求不得、怨憎会、爱别离、五阴炽盛。春天百花开,秋天黄叶落,人之生老病死在所难免,但乐观主义者每每在生活的荆棘中找出一条小径来,肩住黑暗的闸门,洒下光明的福音。他们以饮食有节、起居有定、锻炼有时抵抗衰老和病痛,调素琴,阅金经,清心寡欲,也可逃过求不得、怨憎会、爱别离之折磨,但唯有这五阴炽盛,如影子随身,挥之不去。

五阴者,色、受、想、行、识。色者,肉身也,虽然微观上生灭不已,但以其变化缓慢,总让人产生青春永驻、岁月静好之错觉,只是苍天爱轮回,又曾饶过谁?受、想、行、识却都在精神层面,感受(受)时而无风无浪,如静海深流,时而大风大雨、肆意磅礴;想法(想)此起彼伏,像个五六岁的小男孩一样闹个不停;念念迁流不住(行),前赴后继;其背后的“识”也总在梦中像个画师一样,勾勒出五彩的梦境。在洒家看来,人生最苦就在这五阴炽盛了。因为,每次工作中遇到了大bug,身体都会被搞得疲惫不堪,内心诚惶诚恐,脑袋里想法一个接着一个,想闭目休息一下吧,念头还总是一个接一个地不断蹦出来,搅扰得不得安宁,真真叫一个苦啊!

1

鲁迅先生说过,“人生最苦痛的是梦醒了无路可以走。做梦的人是幸福的,倘没有看出可走的路,最要紧的是不要去惊醒他。”我在子夜时分悄然醒来,一时竟不知身在何处。重庆的夜异常寂静,月色如洗,爬过窗台,倾泻了一地,在朦胧的月光中,好像罩着一层轻纱,温柔地抚慰着喧嚣了一天后沉沉入睡的大地。我躺在宾馆的床上,脑袋空空,心中一片茫然,反复咀嚼着鲁迅先生的这句话。折腾一天,好不容易睡着,本该好好休息了,偏偏五阴炽盛起来,搅了清梦不说,偏偏“梦醒了无路可以走”,岂非是先生所言“人生最苦痛的”?

自从接了这个BCM的活,两度寒暑,时间不长不短,却也光顾重庆多次了。调试、测试、路试、试产、量产,一步步走来,步步惊心。自上回修改路试出现的问题之后,已经过去一年有余了,洒家做的这款BCM也终于量产装车了。都说好事多磨,这不,装车数量过了千台,却偏偏又出了问题!

问题的表现形式倒也干脆,就是开了几天车之后,不知道为了什么,再打转向灯时就会出现倍频闪烁的情况,但是它来得也快去得也潇洒,停车锁门关窗办点事之后,再次行车期间,这个故障就又莫名其妙地消失了。奇也怪了个哉!

正常情况下,点火开关处于ON档,车灯组合开关拨到转向位置,转向灯就按照固定频率闪烁起来,亮了又灭,灭了又亮,仿佛无声地诉说着尘世的轮回。倍频闪烁倒也不是毫无来由,空穴来风,BCM在转向灯闪烁期间检测各个转向灯的工作电流,如果检测出“掉灯”故障,就将转向灯以正常闪烁频率的两倍闪烁。不消说,肯定是误检测出了掉灯故障,才会触发“倍频”闪烁的。可是,转向灯开关检测和转向灯电流检测的时序是固定的,现在的程序设计保证了只有在转向灯闪烁的点亮期间才会检测转向灯电流,不可能出现转向灯灭掉期间检测转向灯电流的情形,所以,按理不会出现“误检测”掉灯故障。我又翻了翻代码,确认了这个问题。

转向灯开关信号来自LIN总线上的组合开关节点,根据LIN报文长度和波特率可以计算得出,检测出有效转向灯开关信号的时刻大概都是在(60 *n)+ 6ms的位置,而BCM同时以50ms为周期循环进行转向灯的电流检测,先根据转向灯的亮灭状态设置ADC检测通道,在转向灯亮时使能相应端口的ADC检测,考虑到驱动芯片的电流回馈引脚需要一定的准备时间,因此在设置了ADC检测通道之后,间隔2ms后进行实际转换,检测时间大概都是在(50 * m)+2ms的位置,显然,只要(50 * m)时刻转向灯是点亮状态,(50 * m)+2ms也是点亮状态。

基于这个“无懈可击”的判断,我过早地做出了这次故障和时序无关的结论,当然也造成了我“梦醒了无路可以走”的苦痛。

2

自个儿研发期间没有测出来这个问题,路试人员也不明所以,显然,“不是国军无能,而是共军太狡猾。”这次出了事被揪过来,战战兢兢地鼓捣半天,我同样没有复现出这个故障来。

车厂技术人员是个老相识了,长着一对像小孩子一样的招风大耳朵,忽闪着两只因为年轻而显得格外有神的眼睛,站在两步开外,看着我在那里忙得焦头烂额,观摩许久,便把双手插在口袋里,悠悠地说:“光华居士,看来你的人品格外好,你一来,你家的BCM就老实了。”

“咳,咳,”听着他充满善意的戏谑,心虚的我竟然不知所措起来。“也许吧。”

“吃饭去吧,请你吃重庆小面!”这位仁兄倒是一副好心情。看着他那张没心没肺的笑脸,心中就像压了一块石头的我多少也坦然了些,便跟在他那矫健的步伐后面,亦步亦趋地去了。

傍晚的饭店乱哄哄的,夹杂着嘈杂的说话声和哧溜哧溜的吃饭声的空气中,飘荡着一股淡淡的牛肉汤味道和浓浓的辣椒气味。找地坐定,这位仁兄便打开了话匣子,“我从库房里提出这台故障车以后也测试了一下,刚开始也没有发现转向灯快闪的故障,中间出现过几回,再后来又消失了。看来,想测出来故障还得靠运气。”他半开玩笑似地说。

测了小半天仍然不得要领的我一边无精打采地吃着面,一边不经意地问道。“之前那些故障车是用户测出来的还是你们自个测出来的?”

“我们自己测出来的,用户还没有反馈过这个问题。可能是因为这个故障是偶发性的,即使出现了,用户也不一定能注意得到,而且出现过之后又会莫名其妙消失,所以也没当成回事。”在被热腾腾的面条蒸汽模糊了的脸庞上,他那两片肥肥的亮油油的嘴唇格外引人注目。

‘为什么没早点测出来?’我心里不禁嘀咕道,全然忘记了这雷本该自己来背。“故障消失是发生在车辆休眠又唤醒之后?”我突然想起来自己这小半天一直是开着门,车辆都没有进过低功耗状态。

“对对对,还真是这样,出现故障之后,总是消除不掉,锁了车,过了一段时间又回来,故障就消失了。”他咽下一块牛肉,又急又快地回答我。

几根面条歪歪扭扭地躺在碗中,绿油油的香菜若有若无地点缀在清汤里,看着面前的清汤寡水,我也心思澄明起来,肯定是低功耗改变了转向灯开关检测和转向灯电流检测的时序,使得设置ADC通道时转向灯还是亮的,但是2ms后就已经是灭的了,对,肯定是这样,我模模糊糊地回想着代码。

弯弯的月牙好像跨过了一条看不出的界限,把夕阳挤进了山的那一边,被微风撕碎的几片白云也换上了青灰色的衣裳。本着多年的经验,我已然可以确定低功耗对时序的改变,心情大好的我一抹嘴,站起身来,掏出一张红色大票,拍在桌子上,“我请客!”

3

回到宾馆,打开电脑,直奔低功耗处理程序,一切都了然了。

休眠程序实际上是一个睡眠-临时唤醒-睡眠-临时唤醒。。的循环,睡眠24ms,临时唤醒2ms,如果在临时唤醒模式期间,唤醒条件有效,BCM退出休眠,否则,再次进入休眠,如此往复。

临时唤醒期间,所有软件定时器共用的计时基准Timer_ticked也在累加,它每次硬件定时器中断都会累加1,累加到255后再回到0。显然,假设退出休眠时,转向灯电流检测定时器已经计满,而转向灯开关检测定时器还未计满,比如在56ms的位置,退出休眠后转向灯电流检测定时器便会因为计满清零,而丧失了和转向灯开关检测定时器的同步,它们之间错位的幅度为6ms。结果就造成可能出现转向灯开关检测程序在设置ADC通道时转向灯处于点亮状态,而2ms后转向灯灭掉的状态,这就会导致“误检测”出掉灯故障,从而出现无故倍频闪烁的情况。

问题找到了,修改也很简单,在ADC转换中断服务程序中,添加对转向灯亮灭状态的判断。只有在转向灯亮时,才将ADC结果寄存器中的值赋值给存放转向灯反馈电流的变量,如此这般即可。

第二天,阳光和煦,春风送暖,问题解决地及时而且准确,给车厂技术人员解释一番,提交了整改报告后,他们也就高高举起,轻轻落下,放我们一马了,只需要把库房里的库存都刷新程序就可以了。那么多件,一件件地刷程序是个不小的体力活,但是,不罚款,也不影响正常装车,这就应该烧高香了不是?要啥自行车啊!

后记

嵌入式系统的正常运转,在于各个模块的密切配合,除了在空间(体现为RAM空间中的信号量、事件、全局变量等)上共通有无之外,还需要在时间上准确而无误。正所谓,时序就是嵌入式系统的脉搏,一点都错不得。

关键词:

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章


用户评论

请文明上网,做现代文明人
验证码:
查看电脑版