【Semidrive X9E】偶尔设置仪表屏背光失败分析

本篇博文分析一个偶现的问题,X9E 偶尔会出现设置屏幕背光失败问题,软件版本是 X9 PTG4.0,硬件环境是 X9E 平台。在看本篇文章前需要对 Semidrive 的核间通信原理有基本了解。


一、问题现象

在 X9E 方案测试的时候偶然发现,开机时有小概率屏幕不亮的问题,查看 R5 的 log 发现一直重复打印 rpmsg-ipcc/3 no enough rxbuf, need flow control 这句日志,后续复现还出现了 R5 panic 现象,如下图:


二、问题分析

1. 屏幕不亮是因为屏幕的背光值是通过核间通信从 A 核发消息到 R 核控制的,控制背光使用的核间通信 endpoint 是 rpmsg-ipcc-rpc,具体如下图,根据上图 log 可以判断是核间通信出现了问题,所以 R 核没有接收到 A 核控制背光的命令,而背光的默认值是 0,因此屏幕不亮。



2. R 核打印 rpmsg-ipcc/3 no enough rxbuf, need flow control 是因为 Safety 与 AP1 之间的 rpmsg-ipcc 通道上存在许多节点(endpoint),这些节点共享 rpmsg 通道的 buffer pool,如果某个节点出现阻塞或处理不及时的情况,可能会导致 buffer pool 资源被该节点全部消耗,那么后续这条通道接收消息时就会因为缺少 rxbuf 而失败,故意在背光的 callback 接口添加阻塞,能复现到同样问题。
3. 除了 endpoint 阻塞外,还有可能是因为其他高优先级线程一直占用 cpu,使得控制背光的 callback 线程得不到调度。


三、解决方案

1. 为了避免核间通信节点出现阻塞的情况,把调节背光的 callback 接口的锁去掉,后续修改核间通信架构为每个节点创建独立的 buffer pool,并在 rpmsg 通道收到数据向节点分发时,从每个节点私有的 buffer pool 中分配 rxbuf,避免因共享 buffer pool 资源而可能出现通信失败的问题。
2. 其他高优先级线程目前有可能会出现阻塞的是 disp_client 线程,修改了该接口不会进入阻塞状态。
3. 经过如上修改后,经过压力测试没有再复现出该问题。


四、参考文档

1.《SemiDrive_高性能车载处理器核间通信应用指南_Rev0.6.pdf》

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论