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
- OTA后系统reboot失败的问题分析和解决
- Android OTA升级原理和流程分析(二)---update.zip差分包问题的解决
- Android OTA升级原理和流程分析(二)---update.zip差分包问题的解决
- Android OTA升级原理和流程分析(二)---update.zip差分包问题的解决
- Android OTA升级原理和流程分析(二)---update.zip差分包问题的解决
- 解决android系统进行OTA升级失败时进入recovery界面不能自动重启问题
- Linux系统下的shutdown和reboot
- 升级主板和CPU后OpenGL初始化失败问题的解决
- Android OTA升级原理和流程分析(三)---Android系统的三种启动模式
- Android OTA升级原理和流程分析(四)---Android系统Recovery模式的工作原理
- Android OTA升级原理和流程分析(三)---Android系统的三种启动模式
- Android OTA升级原理和流程分析(四)---Android系统Recovery模式的工作原理
- Android OTA升级原理和流程分析(三)---Android系统的三种启动模式
- Android OTA升级原理和流程分析(四)---Android系统Recovery模式的工作原理
- Android A/B System OTA分析(三)主系统和bootloader的通信
- Android A/B System OTA分析(四)系统的启动和升级
- Android OTA升级原理和流程分析(三)---Android系统的三种启动模式
- Android OTA升级原理和流程分析(四)---Android系统Recovery模式的工作原理
- 异常处理机制
- dedecms搜索页面列表无法调用自定义内容模式字段的解决方法
- spring实用知识点
- Nordic Collegiate Programming Contest 2016题解
- 设计分析
- OTA后系统reboot失败的问题分析和解决
- HYSBZ
- 如何使用RedisTemplate访问Redis数据结构
- HDOJ2017_字符串统计
- 数独
- leetcode dp题目:
- 范数(Norm)和谱半径(Spectral Radii)
- Remove Duplicates from Sorted Array
- cocos2dx 开启控制台