【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次,發文人進小黑屋喔~

評論