<listing id="62mou"><object id="62mou"></object></listing>
    <output id="62mou"><pre id="62mou"><dd id="62mou"></dd></pre></output>
  1. 新闻中心

    EEPW首页 > 牛人业话 > 千错万错,都是中断和堆栈惹的祸!

    千错万错,都是中断和堆栈惹的祸!

    作者:光华居士时间:2018-09-07来源:电子产品世界收藏
          要命的?#25910;?/span>

    四月的重庆已然百花盛开,春回大地,大自然又恢复了勃勃的生机,燕子挥舞着银光闪闪的翅膀,在湛蓝而悠远的天空中无拘无束地飞翔着,时而快速扇动着翅膀冲上天空,时而展开双翼低低滑翔。在吸饱了四月新雨的潮气的湿润空气中,小草显得格外清新,绿油油地,就像一汪春水,在春风的吹拂下,荡起粼粼的水波。草地不远处的停车场上,两位面容憔悴、因睡眠不足而眼角发黑的工程师紧张而激烈地讨论着,在?#28251;?#32780;幽静的试验场里,他们的声音格外引人注目。

    本文引用地址:http://www.09140960.com/article/201809/391649.htm

    “是不是因为汽车行驶过程中,电磁环境的?#25159;?#36896;成总线数据中某些位发生了变化,所以才造成无缘无?#24335;?#38145;车门的情况?”同?#32511;?#36215;肿胀的眼皮,带着询问的神情,小心翼翼地问我。

    ?#23433;?#20250;的,总线的协议里本身就有CRC校验,如果数据位出错,报文中的CRC校验是通不过的,这时CAN控制器会提示错误的。”这次?#25910;?#21457;生在产品功能验证已经通过,量产前的实车路试过程中,如果问题解决地慢,可能需要重新路试,第二次路试的所有费用都得我们来?#20572;?#25152;以我的心情怎么也好不起来,于是我口气生硬地回答他。

    我们做的产品是车身控制器,俗称BCM,这次路试出现的?#25910;?#29616;象极其明了,就是在开车过程中,?#25381;?#20219;何操作的情况下,突然解锁或者突然闭锁,或者突然后背门解锁了,来了两天,?#24674;泵挥姓业?#24341;发?#25910;?#30340;原因,弄得我茶饭不思,苦?#39057;?#20102;极点。

    “找车厂路试人?#20445;?#25105;再跟他上车跑一下,观察一下现象吧!”做为这次产品代码的开发主力人?#20445;?#25105;的任务是解决问题,同事的任务是和车厂人?#36125;?#20132;道,给我做好服务,所以我不客气地支使起这位同事来。

    雨后新晴的空气显得格外清新,微风拂面,带来一丝丝凉意,停产场的?#27833;?#22788;还有一些?#25381;写?#24178;的水窝,倒映着碎成一片片金箔的阳光。尽管倍感煎熬,目前?#28304;?#22312;水深火热之中,但是我坚信,正如冬去春来大地回春一样,我也会柳暗花明峰回路转的。

    ?#25910;显?#29616;

    路试人员是个年轻小伙儿,看着很精神,也颇为健谈,上车不久,便主动搭话和我谈了起来。

    “前些天?#24674;?#19979;雨,你们过来这两天才放晴。”他手握着方向盘,?#28304;?#31245;稍转向我这边,笑意随着他那年轻而又清脆的声音一起传了过来。

    “你们发现?#25910;?#30340;时候是在下雨天?”心思仍然扑在?#25910;显?#22240;上的我,突然警觉起来。“是不是天晴的时候不发生这种?#25910;希俊?/p>

    “大概是吧,记不太清了。”他淡淡地回应道。

    ‘是不是因为下雨,天气比较潮湿,机械锁?#24378;?#23494;封性做得不好,造成机械解闭锁开关那里会出现解闭锁信号呢?’我的?#28304;?#39134;速?#20439;?#30528;,默默在心里盘算着。‘应该不会,即便路试车的机械锁密封不好,也是只会误解锁,怎么会误闭锁呢?再说,后背门解锁信号来自于PEPS从CAN总线上发过来的指令,和天气也没啥关系。’我随即否决了这种判断。

    前方路口红灯,路试小伙儿娴熟地减速、停车,按下了电子手刹,我看了看这辆车,随口问起这辆车的配?#32654;矗珽PS、自动挡、电子手刹、PEPS、阳光雨量传感器、自动天窗、车窗防?#26657;?#27604;我们当时测试BCM时的试验车配置高。’我不禁暗暗想到。

    ‘咯噔’,一声清脆的解锁声,划破空气直冲我的耳膜,“你按中控那里的解锁键了?还是按遥控钥匙上的解锁键了?”一?#25159;?#34880;冲上了我的胸?#29275;?#29228;上了我的脸庞,我带着紧张的神情,急切地问道。

    ?#25034;挥?#21834;,我什么都没动,”路试小伙儿脸上挂着意味深长的微笑,“之前就是这样子的,莫名其妙就解锁了,有时是莫名其妙闭锁,有时开着开着车,就听到后背门打开了,当时吓了我一跳!”他盯着我的眼睛,加重语气说道。

    问题复现了!我的心砰砰跳着,现在可是个大晴天,艳阳高照,这下怪不到下雨天气?#39134;?#20102;吧。骄傲的太阳高高在上,透过前挡风玻璃,慷慨地将金线似的阳光洒满在我的身上。

    车辆又缓缓开动了,路试小伙儿显然知道我在?#20102;跡?#25152;以?#25381;写?#25200;我。宜人的春风透过车窗,抚摸着我的头发,我茫然地望着窗外,恍惚间,竟似?#24674;?#36523;在何处。

    ‘为什么之?#23433;?#35797;那么多次,都?#25381;?#20986;现这种偶发的?#25910;?#21602;?’我烦恼地思考着。‘之前的测试还是很充分的,我测完让同事测,同事测完又让测试人员测,最后又找车厂的技术人员来测,测的?#38382;?#22815;多了吧,我每次都在现场观察,也没出现过这种摸不着头脑的现象啊!’

    ‘要说测试条件有什么区别的话,那就是之前?#20302;?#22312;那里,而现在是开了起来。可是,这款BCM的功能和车开还是?#20302;?#22522;本没关系,难道车开起?#26149;?#20572;在那里真有什么区别吗?’想到这里,我不禁?#34892;?#30528;急起来。

    “把车靠边停一下,接上OBD,我看看总线数据吧。因为之?#23433;?#35797;BCM时,车厂不让我们自己开车,我们基本上都是停着车测试的。我突然想到,是不是开起来总线上报文数据比停车状态要多?”我给路试小伙儿解释道,同时又因为和无关人员解释而感到懊恼。

    ?#25910;?#23450;位

    车辆打着右转向,缓缓地停在了路边,我在方向盘下面摸索着?#19994;絆BD口,接上OBD线,另一边接上我的笔记本,打开监控软件,把两路CAN总线和一路LIN总线都监控起来。

    ‘恩,比之前的报文好像是多了一些!’我模模糊糊地想到,‘也难怪,这辆车的配置全,CAN节点多,之前那辆车?#25381;蠩SP,是手动挡,也?#25381;蠺CU,而且不带天窗。’我突然感觉,?#36824;?#24322;?#25910;?#23576;封的大门正在缓缓开启。

    “开起来吧,小伙儿,”我的心情突然明朗起来,带着轻松而明快的语气对他说。“我看看总线报文。”

    路边的?#21543;?#36805;速向后退去,汽车已经驶上了高速,我的大脑也开始高速?#20439;?#36215;来。

    ‘之前的测试车配置低,CAN/LIN节点少,在固定的时间内触发的?#38382;?#20063;少,现在这个路试车,CAN/LIN节点多,触发?#38382;?#22810;,这就是测试条件的真正区别!’由于胜利在望,我的心开始安定下来,有条不紊地分析着问题。‘单位时间内?#38382;?#36234;多,对CPU而言负荷就越重,中断服务例程的执行时间是一定的,中断?#38382;?#36234;多,就越可能出现中断嵌套的问题,而中断嵌套时会消耗,嵌套层?#23545;?#28145;,消?#33041;?#22823;,由于大小是固定的,而且堆栈空间和变量空间都是在RAM的线性空间里,一旦堆栈越界,就会改变它所临近的变量空间中的内容!这些内容发生了?#25381;?#35813;发生的变化,当然会导致诡异的?#25910;希?#20063;许这次无?#24335;?#38145;和闭锁只是表现比较明显的?#25910;希?#36824;有一些隐患已经埋下,只是?#25381;?#26292;露出来而已!’

    ‘问题就在这里,’我继续欣喜地思考着,越来越感觉到喜悦在内心激荡不已。‘路试车中断?#38382;?#22810;,造成了堆栈越界,堆栈越界,造成了无?#24335;?#38145;闭锁的?#25910;希erfect,这逻辑链条,完美!’

    ?#25910;?#35299;决

    回到停车场,同事正端着平板电?#32536;?#22312;那里,带着耳机,笑意盈盈,显然正在?#20004;?#22312;电影的世界里。?#21561;?#25105;回来了,他迎上来,张口就问:?#23433;?#21040;?#25910;?#20102;吗?你感觉可能是什么原因?”

    “?#29275;收?#22797;现了,而且已经?#19994;?#21407;因了。”

    “哦?什么原因?”他两眼放光,不自然地笑着。

    “以后再说吧,我先把问题解决了再说。”我?#34892;?#25034;恼怎么把这个同事也带来了,还?#32654;?#36153;我的时间和他解释这些事情,全然忘记了住宿、吃饭、找车厂人员都是这位老?#25351;?#30340;。

    我打开源码,仔细阅读了各个中断的服务程序,却觉得无从下手,因为每个中断服务程序里都?#25381;?#20887;余代码,?#35805;?#27861;进行精简,所以,降低中断服务程序的执行时间这条路是走不通了。

    此路不通,?#24050;?#36895;转向,仔细分析了各个中断的优先级,这些中断的优先级都是在之前写代码的过程中按照添加代码的顺序随手设定的,由于之?#23433;?#35797;没出过岔子,所以尽管是“随手设定?#20445;?#20063;没爆过?#20303;?#29616;在回头一看,问题?#32479;?#22312;这里。

    我这款BCM里用了不少中断,像定时中断、CAN中断、LIN中断都是经常发生的,而且CAN中断的频?#39318;?#20026;频?#20445;?#20294;是我之前?#31383;?#23427;的中断优先级设置得很低,结果就导致CAN中断被各个优先级更高的中断随意抢占,由于它频繁发生且被随意抢占,导致CPU大量时间都用在中断服务程序的切换导致的堆栈入栈和出栈上,不仅?#23548;?#25928;?#24335;?#20302;,而且会导致堆栈越界问题。如果把CAN中断优先级调高,这个频繁发生的中断就不会被抢占,不仅提高了CPU的执行效率,而且避免了堆栈越界。

    按照这个思路,?#19994;?#25972;了CAN中断的优先级,再次上车测试了两天,?#25910;?#28040;失了。。。

    由于问题解决地还算及时,描述?#25910;显?#22240;和解决方案的文档写得也清晰明确,因此这次路试继续进行,?#25381;?#20877;里程清零重新路试了。在回程的途中,笔者百感交集,在这些复?#24189;?#21517;的情感中,竟有?#24674;?#23490;寞感在心底滋生,我突然想起《美人鱼》中?#39034;?#21809;的那句歌词:“无敌是多么,多么寂寞~”



    关键词: CAN 中断 堆栈

    评论

    技术专区

    关闭