这两天遇到一个死机的问题,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中断间发生了什么.做嵌入式开发似乎也只能跟到这一步了呵呵.
阅读(2084) | 评论(0) | 转发(0) |