Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1310193
  • 博文数量: 478
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4833
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-28 11:12
文章分类

全部博文(478)

文章存档

2019年(1)

2018年(27)

2017年(21)

2016年(171)

2015年(258)

我的朋友

分类: Android平台

2016-03-18 11:57:35

[DESCRIPTION]
有时候我们在做BSP开发的时候或者把一个项目的代码移植到另一个项目的时候可能会遇到无法开机的情况。这其中有一类是这样的,抓uart log会发现总是在开机30s左右的时候系统就重启了。
如果看到的情况是这样的,那么很有可能是某个driver卡住了,或者做了固件升级的功能并且用了比较长的时间。
 
[KEYWORD]
重启, 30s, 不开机, 固件升级, 看门狗, 看门狗超时, watchdog,
 
 
[SOLUTION]
首先介绍一下我们的watchdog机制:
1. watchdog的timeout周期是30s; 而watchdog kicker会每20s kick一次watchdog。
2. 开机后watchdog kicker会做初始化,并且初始化20s后watchdog kicker会进行第一次kick watchdog的动作。
3. 所以如果10s内watchdog kicker不能起来初始化的话,那么在30s的时候hardware watchdog就会timeout,然后系统就重启了。
 
怎么去排查这样的问题呢?主要检查两点:
1. 是否有客制化的driver,在这些driver里面是否有耗时过长的操作,可以结合uart log来进行检查。
2. 检查是否有做固件升级的功能,通常log里面也可以看到这样的蛛丝马迹。
 
如果是有固件升级功能,那么建议在升级的过程中每做一部分就kick一次watchdog,避免耗时过长而造成系统重启。如下:
void firmware_update_sample()
{
    //update 10%
    .........
    //kick watchdog
    .........
    //update 20%
    .........
    //kick watchdog
    .........
    .........
    //kick watchdog
    .........
    //update 100%
}
kick watchdog的方法请参考以下FAQ:
  • ID: FAQ09188 如何在代码中Kick Watchdog呢?
对于user版本无法抓取UART log的case请参考以下FAQ:
 
阅读(1024) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~