打印
[技术讨论]

高温耐久中发现的CPU卡死原因和解决

[复制链接]
192|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
[url=home.php?mod=space&uid=760190]@21小跑堂 #申请原创#[/url]
去年在做一个项目中,高温测试过程中出现温度卡死以及诊断卡死的现象,在分析问题的原因后,认为是fusa和sysmgr两个线程同时卡死,导致出现SOC温度信息不上报,以及摄像头诊断信息不上报。针对两个线程卡死分析其原因。
⼀、fusa和sysmgr线程卡死原因分析
1、fusa和sysmgr两个线程的联系
fusa线程和sysmgr线程是两个不相关的线程,负责不同的功能,没有密切的联系,但是两者之间仅有⼀处联系,就是在sysmgr读取SOC温度后,会对温度进⾏滞回滤波处理,如果温度超过115度sysmgr会通过testlibmq给fusa发送⼀个“temperatureupper”,如果温度低于110度,sysmgr会通过MQ给fusa发送⼀个“temperaturelower”。


1、sysmgr温度线程会实时监控SOC温度,并对温度进⾏滞回滤波处理。
2、在执⾏滞回滤波处理后,会根据config.ini⽂件中设置的上限115和下限110摄⽒度通过testlibmq进⾏发送对应的诊断信息。
3、在发送完诊断信息后sysmgr温度线程会将温度通过mq发送给spi_server。
4、spi_server会将信息进⾏保存,然后通过spi发送给MCU。
5、MCU会将收到的信息通过can总线发送给PC。

2、sysmgr卡死温度读取线程卡死问题分析:
1) 1:
        a. 如果fusaproc线程出现卡死,不处理testlibmq,testlibmq队列会被很多进程持续塞满
2) 2
a.sysmgr温度线程通过testlibmq发送诊断信息给fusa,如果fusaproc卡死,testlibmq队列满了,sysmgr发送失败,
3) 3
a.sysmgr温度线程发送的testlibmq失败,sysmgr获取温度线程被堵塞,不能继续运⾏,导致SOC温度不更新

3、fusaproc线程卡死原因分析
fusa线程主要负责接收摄像头发过来的信息,然后将信息转发给diag线程,再由diag线程转发给spi_server,spi_server会转发给MCU,MCU转发给PC。
流程图例:
1) 感知软件会将感知信息testlib通过testlibmq发送给fusa进程,fusa线程在收到感知信息发来的testlib。
2) fusa线程会将testlibmq,进⾏故障等级分类,然后把结果通过sfmumq发送给diag线程。
3) 如果fusa线程出现发送的sfmumq队列满了,则会强制收⼀帧sfmumq,然后继续发送。

问题分析:
fusa线程处理各个模块(sysmgr,感知等)发来的testlibmq,进⾏等级分类,然后通过sfmumq发给diag,diag进制开始消费(接收)sfmumq。

fusa发送的sfmumq达到最⼤的时候,fusa线程会强制消费(接收)⼀个sfmumq信息,空出⼀个mq,⽤来保证后续的正常发送。此时fusa线程既是是sfmumq⽣产者,⼜是sfmumq的消费者。

如果在fusa线程尝试消费⼀条sfmumq时,diag进程也在同时已经把sfmumq消费完毕,这时候会导致fusa线程尝试消费的sfmumq队列为空,fusa会卡死!!!


[size=17.0000pt]4、结论
1) fusaproc线程在sfmumq队列满的时,会强制接收⼀帧mq数据。但是如果此时sfmumq数据都被diag线程接收了,fusa线程便没有sfmumq消息可收,fusa线程被阻塞,⼀直卡在等待接收sfmumq的队列内。最终fusaproc不再循环回来处理testlibmq,testlibmq也会被塞满。
2) 导致sysmgr获取温度的线程⽆法通过testlibmq给fusa发送温度诊断信息,sysmgr获取温度的线程也就不能继续往下执⾏,导致sysmgr获取温度线程的卡死。

这也就是为什么问题会出现在110度和115度的原因(sysmgr会在⾼于115度,低于110时发送诊断消息给fusaproc)
⼆、问题的处理
1、针对fusa发送testlib后会等待⾃⼰给⾃⼰发的⼀个mq的修改
        由于fusa在发送sfmumq时,此处既是sfmumq的⽣产者,⼜是sfmumq的消费者,但是在发送给diag线程⼜是sfmumq的消费者,两处可能会发⽣同时消耗的情况,因此去掉fusaproc强制消费的代码,让fusa在发送sfmumq数据的时候,不会去强制消费sfmumq数据。
        fusa只是sfmumq的⽣产者,不在是消费者,只有diag线程是消费者,从⽽避免偶然出现fusa被卡死的情况。然后可以循环回来处理testlibmq。

2、删除不必要的其他不必要的mq发送
fusa_error_send函数中,也存在其他不必要的mq(没有消费者的mq),删除这部分的mq的发送,也防⽌fusa进程的阻塞

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

293

帖子

1

粉丝