Chinaunix首页 | 论坛 | 博客
  • 博客访问: 186608
  • 博文数量: 38
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 424
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-19 12:41
文章分类

全部博文(38)

文章存档

2017年(2)

2016年(1)

2010年(8)

2009年(27)

我的朋友

分类: 嵌入式

2010-08-21 10:52:11

这两天遇到一个死机的问题,bug是这样引起的:
在Data abort的时候,原本用了一个死循环, 这样关不了机,必须把电池取下来,这样就导致客户操作比较麻烦.所以Boss希望改成可以按键关机. 我在dataAbort的时候扫描按键.
开始只是先找出实现关机的方法,只需要关闭电源供电的那个引脚加上关闭所有时钟就可以了:
//关电源脚
GPIO0_OUT_CLR_REG |= BIT14;
//关所有时钟
PMU_CKEN_REG &= 0;
 
接下来就是扫描关机键.关机键也是由GPIO引脚实现的, 它是一个Input引脚,不按的时候那个Bit为高,按下的时候为低.正常情况下按键关机是通过系统定时器实现的,系统定时器精度为10ms,关机键被初始化为下降延触发的FIQ中断.当按下键,产生关机键中断,改变关机键flag,当有连续200次检测到关机键被按下后,进行关机操作.
 
由于DataAbort的优先级理论上是高于FIQ和IRQ的,因此Abort的时候中断就失效了.所以只能扫描Input状态位:
int cnt = 0;
 while(1)
 {
  //ScrPrint(0, 4, 0x00, "nTest=%08x,c=%d", (GPIO1_IN_REG & BIT10), cnt);
  //xxprintf("n=%08x,cnt=%d ", (GPIO1_IN_REG & BIT10), cnt);
  MyDelayMs(10);
  if(press_powerdownkey())
  {
   cnt += 1;
   if(cnt>200)
   {
    PowerOff1();
   }
  }
  else
  {
   cnt=0;
  }
 }
 
功能上到是实现了,但是每次DataAbort按键关机的成功率不高,还是有死机的可能,而且死的那个点正好是我按下关机键的时候.
硬着头皮查原因...乱试了一通,我发现在进入DataAbort的时候我关闭所有中断,测试了50次左右每次都可以成功,这是为什么呢?难道和按键中断有关系,由于按键是FIQ中断,加一些调试,发现,在DataAbort的时候居然FIQ还能响应!!!但是IRQ是无效的,因此判断FIQ和DataAbort的优先级并不是像三星手册上说的那样.我们用的是Zilog的芯片,特性恐怕还是有差异,问题解决了,但是还是不知道为什么DataAbort和FIQ中断间发生了什么.做嵌入式开发似乎也只能跟到这一步了呵呵.
阅读(2033) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~