mstar因裝置讀不到導致,待機重啟問題
使用mstar 648開發出現待機失敗重啟問題,根據分析是因為某個I2c裝置未正確讀取導致關機時有個執行緒無法關閉導致無法正常待機
首先待機失敗log
os : [TSP_DBG]TSP ISR Proc End!!!
01-01 20:01:36.793 1557 1557 I tvos : player get EV_SIGNAL_UNSTABLE event = 536875042
01-01 20:01:36.793 1557 1557 I tvos : [AutoTest][SourceChange][player finalize END][96823]
01-01 20:01:36.793 1557 1557 I tvos : [ERROR] MSrv_Picture::SetPictureSetting, enInputSrc = 44
01-01 20:01:36.793 1338 1734 E IPlayerImplClient: Send NOTIFY_CALLBACK
01-01 20:01:36.793 1557 1557 I tvos : EV_SIGNAL_UNSTABLE = 536875042
01-01 20:01:36.793 1557 1557 I tvos : Send NOTIFY_CALLBACK
01-01 20:01:36.793 3020 3034 E PlayerImpl_JNI: notifyCB event = 536875042
01-01 20:01:36.793 3020 3034 D PlayerImpl_JNI: Signal status: SIGNAL_UNSTABLE
01-01 20:01:36.825 1557 1557 I tvos : ******Amplifier_RT9113B_SWMute(0)
01-01 20:01:36.826 1557 1557 I tvos : 9113Bwrite fail = 6
01-01 20:01:36.828 1557 1557 I tvos : error: Input type source number is too large!!!
01-01 20:01:36.828 1557 1557 I tvos : [AutoTest][SourceChange][SetInputSourceCmd END][96857]
01-01 20:01:36.828 1557 1557 I tvos : mapi_str::addStrThreadItem ptid=0xd60ff460 m_StrThreadItems.size()=7,this=0xcbf678, name=SSSoundSuspend
01-01 20:01:36.828 1557 1557 I tvos : ******Amplifier_RT9113B_SWMute(1)
01-01 20:01:36.829 1557 1557 I tvos : 9113Bwrite fail = 6
01-01 20:01:36.833 1557 1557 I tvos : mapi_str::removeStrThreadItem ptid=0xd98bf460 m_StrThreadItems.size()=6,this=0xcbf678, name=AudioMonitor
01-01 20:01:36.833 1557 1557 I tvos : [[utopia]] Start HAL_AUDIO_DeAllocateVars g_bInitShmFlag=1
01-01 20:01:36.833 1557 1557 I tvos : [[utopia]] HAL_AUDIO_DeAllocateVars ClientCounter=3
01-01 20:01:36.833 1557 1557 I tvos : [[utopia]] End HAL_AUDIO_DeAllocateVars g_bInitShmFlag=0
01-01 20:01:36.868 1557 1557 I tvos : IRQ 209 polling thread destroyed
01-01 20:01:36.868 1557 1557 I tvos : IRQ 209 polling fd closed!!
01-01 20:01:36.868 1557 1557 I tvos : mapi_str::removeStrThreadItem ptid=0xd3fff460 m_StrThreadItems.size()=5,this=0xcbf678, name=CECMonitor
01-01 20:01:36.868 1557 1557 I tvos : [CEC] MSrv_CEC::Finalize()
01-01 20:01:36.873 1557 1557 I tvos : mapi_str::removeStrThreadItem ptid=0xd40ff460 m_StrThreadItems.size()=4,this=0xcbf678, name=Dont Need Delay
01-01 20:01:36.937 1557 1557 I tvos : IRQ 142 polling thread destroyed
01-01 20:01:36.937 1557 1557 I tvos : IRQ 142 polling fd closed!!
01-01 20:01:36.937 1557 1557 I tvos : mapi_str::removeStrThreadItem ptid=0xd60ff460 m_StrThreadItems.size()=3,this=0xcbf678, name=SSSoundSuspend
01-01 20:01:36.974 1557 1557 I tvos : mapi_str::removeStrThreadItem ptid=0xd41ff460 m_StrThreadItems.size()=2,this=0xcbf678, name=Need Delay SrcD
01-01 20:01:36.984 1557 1557 I tvos : mapi_str::removeStrThreadItem ptid=0xeda38460 m_StrThreadItems.size()=1,this=0xcbf678, name=Picture Monitor
01-01 20:01:36.984 1338 1338 F HDCP2X : [HDCP2X] Enter HDCP2_SuspendHDMI() function ((HDCP2_SuspendHDMI:702))
01-01 20:01:36.984 1338 1338 F HDCP2X : [HDCP2X] Leave HDCP2_SuspendHDMI() function ((HDCP2_SuspendHDMI:708))
01-01 20:01:36.984 1557 1557 I tvos : mapi_str::waitforAllThreadSuspend begin m_StrThreadItems.size()=1,m_StrThreadItemSuspendNum=0,this=0xcbf678,pthread_self()=0xf63c3210,getpid()=1338
01-01 20:01:36.984 1557 1557 I tvos : mapi_str::waitforAllThreadSuspend continue thread ptid=0xe2eac460, name=InitSSoundthrea
01-01 20:01:37.037 1557 1557 I tvos : mapi_str::waitforAllThreadSuspend continue m_StrThreadItems.size()=1,m_StrThreadItemSuspendNum=0,this=0xcbf678,pthread_self()=0xf63c3210,getpid()=1338
01-01 20:01:37.037 1557 1557 I tvos : mapi_str::waitforAllThreadSuspend continue thread ptid=0xe2eac460, name=InitSSoundthrea
01-01 20:01:37.090 1557 1557 I tvos : mapi_str::waitforAllThreadSuspend continue m_StrThreadItems.size()=1,m_StrThreadItemSuspendNum=0,this=0xcbf678,pthread_self()=0xf63c3210,getpid()=1338
01-01 20:01:37.090 1557 1557 I tvos : mapi_str::waitforAllThreadSuspend continue thread ptid=0xe2eac460, name=InitSSoundthrea
01-01 20:01:37.122 1557 1557 I tvos : [INFO] Change to Voltage: 1150 mV (0x30)
從log可以看出執行removeStrThreadItem時AudioMonitor項出現失敗問題
removeStrThreadItem方法程式碼
supernova\MStarSDK\src\str\mapi_str.cpp
void mapi_str::removeStrThreadItem()
{
pthread_t ptid = pthread_self();
char name[32];
int intPTHChk;
prctl(PR_GET_NAME,(unsigned long)name);
intPTHChk = PTH_RET_CHK(pthread_mutex_lock(&m_mutex));
ASSERT(intPTHChk == 0);
for (vector<ST_STR_THREAD_ITEM>::iterator it=m_StrThreadItems.begin(); it!=m_StrThreadItems.end();)
{
if (it->ptid == ptid)
{
it = m_StrThreadItems.erase(it);
printf("mapi_str::removeStrThreadItem ptid=%p m_StrThreadItems.size()=%d,this=%p, name=%s\n", (void*)ptid, m_StrThreadItems.size(), this, name);
}
else
{
++it;
}
}
intPTHChk = PTH_RET_CHK(pthread_mutex_unlock(&m_mutex));
ASSERT(intPTHChk == 0);
}
從程式碼可以看出當出現問題時m_StrThreadItems陣列並未能刪除問題執行緒記錄
接著檢視mapi_str::waitforAllThreadSuspend 列印log處程式碼
void mapi_str::waitforAllThreadSuspend()
{
printf("mapi_str::waitforAllThreadSuspend begin m_StrThreadItems.size()=%d,m_StrThreadItemSuspendNum=%u,this=%p,pthread_self()=%p,getpid()=%d\n", m_StrThreadItems.size(), m_StrThreadItemSuspendNum, this, (void*)pthread_self(), getpid());
while(m_StrThreadItems.size() != m_StrThreadItemSuspendNum)
{
for (unsigned int i = 0; i < m_StrThreadItems.size(); i++)
{
printf("mapi_str::waitforAllThreadSuspend continue thread ptid=%p, name=%s\n", (void *)m_StrThreadItems[i].ptid, m_StrThreadItems[i].name.c_str());
}
for(int i=0;i<50;i++)
{
if(m_StrThreadItems.size() == m_StrThreadItemSuspendNum)break;
usleep(1000);
}
printf("mapi_str::waitforAllThreadSuspend continue m_StrThreadItems.size()=%d,m_StrThreadItemSuspendNum=%u,this=%p,pthread_self()=%p,getpid()=%d\n", m_StrThreadItems.size(), m_StrThreadItemSuspendNum, this, (void*)pthread_self(), getpid());
}
printf("mapi_str::waitforAllThreadSuspend complete m_StrThreadItems.size()=%d,m_StrThreadItemSuspendNum=%u,this=%p,pthread_self()=%p,getpid()=%d\n", m_StrThreadItems.size(), m_StrThreadItemSuspendNum, this, (void*)pthread_self(), getpid());
}
檢視程式碼發現,啥都沒幹只是列印,阻塞時間?難道是在等有其他地方執行緒去把執行緒結束刪除?分析這邊應該就是導致系統待機失敗,阻塞時間過長其他地方出現問題直接重啟了
這時就有幾種修改方法,第一種解決釋放不了執行緒問題,第二種解決這個啥都不幹在這阻塞的程式碼
明顯第二種會簡單很多新增程式碼:
void mapi_str::waitforAllThreadSuspend()
{
printf("mapi_str::waitforAllThreadSuspend begin m_StrThreadItems.size()=%d,m_StrThreadItemSuspendNum=%u,this=%p,pthread_self()=%p,getpid()=%d\n", m_StrThreadItems.size(), m_StrThreadItemSuspendNum, this, (void*)pthread_self(), getpid());
while(m_StrThreadItems.size() != m_StrThreadItemSuspendNum)
{
for (unsigned int i = 0; i < m_StrThreadItems.size(); i++)
{
printf("mapi_str::waitforAllThreadSuspend continue thread ptid=%p, name=%s\n", (void *)m_StrThreadItems[i].ptid, m_StrThreadItems[i].name.c_str());
}
for(int i=0;i<50;i++)
{
if(m_StrThreadItems.size() == m_StrThreadItemSuspendNum)break;
usleep(1000);
m_StrThreadItems.clear();
}
printf("mapi_str::waitforAllThreadSuspend continue m_StrThreadItems.size()=%d,m_StrThreadItemSuspendNum=%u,this=%p,pthread_self()=%p,getpid()=%d\n", m_StrThreadItems.size(), m_StrThreadItemSuspendNum, this, (void*)pthread_self(), getpid());
}
printf("mapi_str::waitforAllThreadSuspend complete m_StrThreadItems.size()=%d,m_StrThreadItemSuspendNum=%u,this=%p,pthread_self()=%p,getpid()=%d\n", m_StrThreadItems.size(), m_StrThreadItemSuspendNum, this, (void*)pthread_self(), getpid());
}
重新升級,驗證問題成功解決,不過第二種雖然簡單但是會不會引起什麼問題呢?理論來說待機時候這個沒影響,但是最優的解決方法還是第一種
相關文章
- 因為跨域問題導致的無法讀取 response header跨域Header
- MySQL 5.6因為OOM導致資料庫重啟MySqlOOM資料庫
- 記一次 Mac 意外重啟導致的 Homestead 問題Mac
- Android之點選Home鍵後再次開啟導致APP重啟問題AndroidAPP
- 關於沒有熔斷降級導致服務重啟問題
- 【ASK_ORACLE】因process用盡導致的rac重啟的解決方法Oracle
- Oracle RAC啟動因CTSS導致的異常Oracle
- [轉帖]JFR 定位因為 SSL 導致 CPU Load 飈高的問題
- Scala版本與Java版本不匹配導致的找不到主類問題Java
- hpwin10找不到啟動裝置怎麼辦_hpwin10找不到啟動裝置如何解決Win10
- LightDB/Postgresql 記錄客戶端啟動版本問題導致啟動失敗問題SQL客戶端
- 解決一次gitlab因異常關機導致啟動失敗Gitlab
- Oracle 12c因bug導致ORA-04031問題處理過程Oracle
- 因壞道問題導致的硬碟故障如何進行資料恢復?硬碟資料恢復
- 從專案管理角度看因防疫導致的孕婦流產問題專案管理
- 從原始碼分析JSONObject因版本差異導致toString格式異常問題原始碼JSONObject
- 【YashanDB知識庫】EXP導致主機卡死問題
- 記一次dlopen使用問題導致Framework重啟,tombstones、pmap與反彙編分析(上)Framework
- 使用interface化解一場因作業系統不同導致的編譯問題作業系統編譯
- 記錄一次因 mysql 欄位取名不規範導致的問題MySql
- ANALYZE導致的阻塞問題分析
- Electron安裝過程深入解析(讀完此文解決Electron安裝失敗導致的無法啟動,無法打包的問題)
- 手機藍芽搜尋不到裝置怎麼辦 藍芽裝置刪除後搜尋不到藍芽
- Win10系統下因DistributedCOM錯誤1001導致電腦自動重啟怎麼辦Win10
- 解決 allure.dynamic.parameter 不生效問題 或者 allure 報告中因為引數導致排版的問題
- [重慶思莊每日技術分享]-linux 系統 修改核心引數導致不能啟動的問題Linux
- 神奇的DEBUG:因為異常導致MongoDB容器無法啟動MongoDB
- 因為一個小小的Integer問題導致阿里一面沒過,遺憾!阿里
- 記php-fpm重啟導致的一個bugPHP
- iOS8 自定義UITabBar (使用popToViewController導致的UITabBarButton重疊的問題)iOSUItabBarViewController
- mtd裝置驅動(待學習)
- 微軟修復了導致 Outlook 啟動時崩潰的問題微軟
- Atlas VPN:2021年全球76%的公司遭遇因技術問題導致的業務中斷
- MySQL Case-時間問題導致MySQL例項批次當機MySql
- 案例分享-full gc導致k8s pod重啟GCK8S
- MongoDB例項重啟失敗探究(大事務Redo導致)MongoDB
- 分散式鎖導致的超賣問題分散式
- MySQL8.0 view導致的效能問題MySqlView