OTA后系统reboot失败的问题分析和解决

来源:互联网 发布:mdf文件用mysql打开 编辑:程序博客网 时间:2024/06/05 15:51

问题背景:

平台:mips SOC,具体型号马赛克;
存储:norflash;
系统:Linux  (3.0.8);

问题现象:

系统OTA升级完成后reboot时,概率性失败,系统卡死。
重启方式为 system("reboot")

分析过程:

1、进行OTA压力测试,平均30左右就出现reboot失败的情况;
2、用测试代码让系统30s reboot一次;压力测试2000次无失败情况;
3、从调用 system("reboot"),改为直接调用库函数里的 reboot方法;重复步骤1、2 ,结果相同;
4,改为调用system("reboot -f");重复步骤1、2 ,结果依然;到这里,猜测问题和OTA的过程有关联,但目前尚未分析出问题真正诱因。
5、跟踪libc中reboot函数的实现;在kernel代码中从reboot的系统调用一层层深入,跟踪到架构相关的reset函数实现,加入打印,发现重启失败时此函数已调用成功;此时已经排除上层调用reboot时发生死锁,或着reboot流程中发生死锁的可能。
6、进一步在重启前打印boot选择脚的寄存器值,确认启动瞬间boot脚状态ok;
7,到这里能确认系统重启后已进入芯片的bootrom;
8,再次复现问题,抓取reset error PC的值,交由芯片方案商,确认系统死在usb boot的代码里。但这里根据boot脚状态,系统其实应该是要从norflash启动的;
进一步猜测,可能是OTA进行大量flash擦写后,flash在系统重启后,概率性状态异常;
9,根据8的分析,在reboot前加入2s延时,问题不在复现。

结论

问题原因:使用的spi接口Norflash,在进行大量擦写操作后;系统重启时,flash控制器未正确识别到flash,所以跳转到了usb启动的模式;
应对措施:reboot前加上一段小延时可以规避这个问题;但是并未从本质上解决问题本身,方案上后续回优化架构相关reset函数的实现。



阅读全文
0 0
原创粉丝点击