要命的毛病
四月的重庆已然百花盛开,春回大地,大自然又康复了勃勃的活力,燕子挥舞着银光闪闪的翅膀,在湛蓝而悠远的天空中自由自在地翱翔着,时而快速摇动着翅膀冲上天空,时而翻开双翼低低滑翔。在吸饱了四月新雨的潮气的湿润空气中,小草显得分外新鲜,绿莹莹地,就像一汪春水,在春风的吹拂下,荡起粼粼的水波。草地不远处的泊车场上,两位面庞瘦弱、因睡眠不足而眼角发黑的工程师严重而剧烈地讨论着,在空阔而幽静的实验场里,他们的声响分外有目共睹。
“是不是因为轿车行进过程中,电磁环境的搅扰形成CAN总线数据中某些位产生了改动,所以才形成平白无故解锁车门的状况?”搭档抬起肿胀的眼皮,带着问询的神态,小心谨慎地问我。
“不会的,CAN总线的协议里自身就有CRC校验,假如数据位犯错,CAN报文中的CRC校验是通不过的,这时CAN控制器会提示过错的。”这次毛病产生在产品功用验证现现已过,量产前的实车路试过程中,假如问题处理地慢,或许需求重新路试,第2次路试的一切费用都得咱们来掏,所以我的心境怎样也好不起来,所以我口气僵硬地答复他。
咱们做的产品是车身控制器,俗称BCM,这次路试呈现的毛病现象极端明晰,便是在开车过程中,没有任何操作的状况下,忽然解锁或许忽然闭锁,或许忽然后背门解锁了,来了两天,一向没有找到引发毛病的原因,弄得我茶饭不思,苦闷到了极点。
“找车厂路试人员,我再跟他上车跑一下,调查一下现象吧!”做为这次产品代码的开发主力人员,我的使命是处理问题,搭档的使命是和车厂人员打交道,给我做好服务,所以我不客气地指使起这位搭档来。
雨后新晴的空气显得分外新鲜,和风拂面,带来一丝丝凉意,停产场的坑洼处还有一些没有吹干的水窝,倒映着碎成一片片金箔的阳光。虽然倍感折磨,现在仍处在水深火热之中,可是我深信,正如冬去春来大地回春相同,我也会山穷水尽山穷水尽的。
毛病再现
路试人员是个年青小伙儿,看着很精力,也较为善谈,上车不久,便主动搭腔和我谈了起来。
“前些天一向下雨,你们过来这两天才放晴。”他手握着方向盘,脑袋稍稍转向我这边,笑意跟着他那年青而又洪亮的声响一同传了过来。
“你们发现毛病的时分是鄙人雨天?”心思依然扑在毛病原因上的我,忽然警惕起来。“是不是天晴的时分不产生这种毛病?”
“大概是吧,记不太清了。”他淡淡地回应道。
‘是不是因为下雨,气候比较湿润,机械锁那块密封性做得欠好,形成机械解闭锁开关那里会呈现解闭锁信号呢?’我的脑袋飞速工作着,静静在心里盘算着。‘应该不会,即便路试车的机械锁密封欠好,也是只会误解锁,怎样会误闭锁呢?再说,后背门解锁信号来自于PEPS从CAN总线上发过来的指令,和气候也没啥联系。’我随即否决了这种判别。
前方路口红灯,路试小伙儿娴熟地减速、泊车,按下了电子手刹,我看了看这辆车,随口问起这辆车的装备来,EPS、主动挡、电子手刹、PEPS、阳光雨量传感器、主动天窗、车窗防夹,‘比咱们其时测验BCM时的实验车装备高。’我不由暗暗想到。
‘咯噔’,一声洪亮的解锁声,划破空气直冲我的耳膜,“你按中控那里的解锁键了?仍是按遥控钥匙上的解锁键了?”一股热血冲上了我的胸膛,爬上了我的脸庞,我带着严重的神态,急迫地问道。
“没有啊,我什么都没动,”路试小伙儿脸上挂着意味深长的浅笑,“之前便是这姿态的,不可思议就解锁了,有时是不可思议闭锁,有时开着开着车,就听到后背门翻开了,其时吓了我一跳!”他盯着我的眼睛,加剧口气说道。
问题复现了!我的心砰砰跳着,现在可是个大晴天,艳阳高照,这下怪不到下雨气候头上了吧。自豪的太阳居高临下,透过前挡风玻璃,大方地将金线似的阳光洒满在我的身上。
车辆又慢慢开动了,路试小伙儿显着知道我在深思,所以没有打扰我。迷人的春风透过车窗,抚摸着我的头发,我茫然地望着窗外,模糊间,竟似不知身在何处。
‘为什么之前测验那么屡次,都没有呈现这种偶发的毛病呢?’我烦恼地思考着。‘之前的测验仍是很充沛的,我测完让搭档测,搭档测完又让测验人员测,最后又找车厂的技术人员来测,测的次数够多了吧,我每次都在现场调查,也没呈现过这种摸不着头脑的现象啊!’
‘要说测验条件有什么差异的话,那便是之前车停在那里,而现在是开了起来。可是,这款BCM的功用和车开仍是车停根本没联系,莫非车开起来和停在那里真有什么差异吗?’想到这儿,我不由有些着急起来。
“把车靠边停一下,接上OBD,我看看总线数据吧。因为之前测验BCM时,车厂不让咱们自己开车,咱们根本上都是停着车测验的。我忽然想到,是不是开起来总线上报文数据比泊车状况要多?”我给路试小伙儿解说道,一起又因为和无关人员解说而感到沮丧。
毛病定位
车辆打着右转向,慢慢地停在了路旁边,我在方向盘下面探索着找到OBD口,接上OBD线,另一边接上我的笔记本,翻开监控软件,把两路CAN总线和一路LIN总线都监控起来。
‘恩,比之前的报文好像是多了一些!’我模模糊糊地想到,‘也难怪,这辆车的装备全,CAN节点多,之前那辆车没有ESP,是手动挡,也没有TCU,并且不带天窗。’我忽然感觉,被怪异毛病尘封的大门正在慢慢敞开。
“开起来吧,小伙儿,”我的心境忽然明亮起来,带着轻松而明快的口气对他说。“我看看总线报文。”
路旁边的风光敏捷向后退去,轿车现已驶上了高速,我的大脑也开端高速工作起来。
‘之前的测验车装备低,CAN/LIN节点少,在固定的时刻内触发中止的次数也少,现在这个路试车,CAN/LIN节点多,触发中止次数多,这便是测验条件的真实差异!’因为胜利在望,我的心开端安靖下来,有条有理地剖析着问题。‘单位时刻内中止次数越多,对CPU而言负荷就越重,中止服务例程的履行时刻是必定的,中止次数越多,就越或许呈现中止嵌套的问题,而中止嵌套时会耗费仓库,嵌套层级越深,仓库耗费越大,因为仓库巨细是固定的,并且仓库空间和变量空间都是在RAM的线性空间里,一旦仓库越界,就会改动它所接近的变量空间中的内容!这些内容产生了不应该产生的改动,当然会导致怪异的毛病,或许这次无故解锁和闭锁仅仅体现比较显着的毛病,还有一些危险现已埋下,仅仅没有露出出来罢了!’
‘问题就在这儿,’我持续欢喜地思考着,越来越感觉到高兴在心里激荡不已。‘路试车中止次数多,形成了仓库越界,仓库越界,形成了无故解锁闭锁的毛病!Perfect,这逻辑链条,完美!’
毛病处理
回到泊车场,搭档正端着平板电脑等在那里,带着耳机,笑意盈盈,显着正在沉浸在电影的国际里。看到我回来了,他迎上来,张口就问:“测到毛病了吗?你感觉或许是什么原因?”
“嗯,毛病复现了,并且现已找到原因了。”
“哦?什么原因?”他两眼放光,不自然地笑着。
“今后再说吧,我先把问题处理了再说。”我有些沮丧怎样把这个搭档也带来了,还得糟蹋我的时刻和他解说这些工作,全然忘记了住宿、吃饭、找车厂人员都是这位老兄干的。
我翻开源码,仔细阅读了各个中止的服务程序,却觉得无从下手,因为每个中止服务程序里都没有冗余代码,没办法进行精简,所以,下降中止服务程序的履行时刻这条路是走不通了。
此路不通,我敏捷转向,仔细剖析了各个中止的优先级,这些中止的优先级都是在之前写代码的过程中依照增加代码的次序顺手设定的,因为之前测验没出过差错,所以虽然是“顺手设定”,也没爆过雷。现在回头一看,问题就出在这儿。
我这款BCM里用了不少中止,像守时中止、CAN中止、LIN中止都是常常产生的,并且CAN中止的频率最为频频,可是我之前却把它的中止优先级设置得很低,成果就导致CAN中止被各个优先级更高的中止随意抢占,因为它频频产生且被随意抢占,导致CPU很多时刻都用在中止服务程序的切换导致的仓库入栈和出栈上,不只实践功率下降,并且会导致仓库越界问题。假如把CAN中止优先级调高,这个频频产生的中止就不会被抢占,不只提高了CPU的履行功率,并且避免了仓库越界。
依照这个思路,我调整了CAN中止的优先级,再次上车测验了两天,毛病消失了。。。
因为问题处理地还算及时,描绘毛病原因和处理方案的文档写得也清晰明确,因而这次路试持续进行,不必再路程清零重新路试了。在回程的途中,笔者悲喜交集,在这些杂乱难名的情感中,竟有一种孤寂感在心底繁殖,我忽然想起《美人鱼》中邓超唱的那句歌词:“无敌是多么,多么孤寂~”