0xA02错误导致的冻屏,死机,重启问题
0赞[DESCRIPTION]
在测试中,客户经常会开启多个任务,导致出现0xA02 错误
注:但并不是所有的0xA02 都是由以下原因导致!其它原因,请提交CR解决
例如:
进入camera拍照-设置为墙纸=>切换vidoe recorder进行录像保存-连接PC-退出,激活蓝牙,手机重启
复现步骤:
1.进入camera拍照,options=>设置为墙纸=>切换vidoe recorder进行录像保存,连接PC 弹出列表选择界面 选
择OK 。=>退出,激活蓝牙,手机重启
2.激活蓝牙,连接PC 弹出列表选择界面 选择OK 。=>退出,进入camera拍照,options=>设置为墙纸=>切换
vidoe recorder进行录像保存,手机重启
3.进入camera拍照,options=>设置为墙纸=>切换vidoe recorder进行录像保存,进入audio recorder,连接
PC,弹出列表选择界面 选择OK 。手机重启
[SOLUTION]icfans
以上述CR为例,分析如下:
1、首先,根据CR描述可以看出,在问题复现的过程中涉及到了多个task
memorydump call stack:
fs_error_internal_fatal ()
RTFSYSSetTLS ()
XInitBlock ()
FS_LockFAT ()
... ...
2、根据call stack 在函数RTFSYSSetTLS () 函数中发生fatal error 0xA02
RTFSYSSetTLS (int index, void *Value)
{
... ...
if (task_indx == FS_TCT_Index +1)
{
if (FS_TCT_Index >=FS_MAX_THREAD)
{
fs_err_internal_fatal (FS_ERR_TLS_02, (void *)FS_MAX_THREAD) ;
return
}
}
}
3、根据上面的函数可以判断由于FS_TCT_Index >=FS_MAX_THREAD导致出现fatal error ,
【结论】
因此,在遇到类似问题时, 可以通过memorycump 来确认,是否因此原因导致:
方法: 可以通过抓到的此份memorydump中,来查看FS_TCT_Index 、FS_MAX_THREAD 这两个值是多少 ,
【解决方法】
– 11B版本, 到11B.W11.37.fs_config.c中FS_MAX_THREAD 该数值是由sysgen1.pl 脚本生成的
通过修改 sysgen1.pl 中
函数: sub dispatch_threadnum()的返回值 来增加系统中MAX_THREAD的个数
– 11B.W1137之后的版本,修改方式有所变化,该数值不再通过脚本来设置
需要修改custom/system/ Template /fs_config.c中宏 : MAX_THREAD 宏定义的数值,来改变