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

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

[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”。

27126772358504e05.png (74.33 KB )

下载附件

2024-12-30 13:54 上传

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温度不更新

990346772359f8a96c.png (87.25 KB )

下载附件

2024-12-30 13:54 上传

3、fusaproc线程卡死原因分析

fusa线程主要负责接收摄像头发过来的信息,然后将信息转发给diag线程,再由diag线程转发给spi_server,spi_server会转发给MCU,MCU转发给PC。

流程图例:

46824677235aaedfd4.png (49.27 KB )

下载附件

2024-12-30 13:54 上传

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会卡死!!!

89435677235bcf1724.png (70.71 KB )

下载附件

2024-12-30 13:55 上传

[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)

90893677235cd6261b.png (30.23 KB )

下载附件

2024-12-30 13:55 上传

⼆、问题的处理

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进程的阻塞

相关文章