MTK异常处理流程

 MTK异常处理流程

 

异常处理流程里面,需要做的事情是:生成异常信息输出到屏幕或catcher中,并保存到NVRAM里面。最后根据工程模式的设定,机器会冻屏(选择冻屏是为了抓memory dump),或者重启。

 

1、CPU触发的异常处理

当CPU触发异常时,会触发Exception中断,然后跳到中断子程序。中断子程序会调用System Stack Error函数,然后再调用Fatal Error Handler处理。

 

Undef Exception--|

SWI Exception----|---Exception ISR---System Stack Error---Fatal Error Handler

Data Abort-------|

Prefetch Abort---|

 

2、Assert Error的异常处理

ASSERT是一个宏,其实都是调用kal_assert_error函数,然后再调用Assert_Common处理

 

ASSERT---kal_assert_error---Assert_Common

 

3、Fatal Error的异常处理

Fatal Error一般相当于KAL层埋的Assert语句,只是调用的函数不一样。KAL层会调用kal_fatal_error,然后再调用Fatal Error Handler

 

kal_fatal_error---Fatal Error Handler

 

assert_common与fatal_error_handler

assert_common与fatal_error_handler都是异常处理函数,其实这两个函数都很相似。不同点在于,assert_common的参数与fatal_error_handler不一样。程序员可以调用ASSERT、EXT_ASSERT、EXT_ASSERT_DUMP三个宏,出现异常的时候可以打印不同的信息。

因为异常的时候都会跳到这两个函数中执行,因此假如有Trace32等在线debug工具,可以在这两个函数中设断点。然后再看系统的信息,进行debug。

 

fatal_error_handler的流程
 

Mask all interrupts

        ↓

Restart watchdog

        ↓

Increment exception entrance count

        ↓

First entrace?-------------------→No

        ↓                         |

Release system protection          |

and raise task priority level      |

        ↓                         |

Initialze exception log            |

        ↓                         |

Output exception←-----------------|

message to catcher                

        ↓

Display exception

message to LCM

        ↓

Output log to Catcher

        ↓

First entrance?--------→No

        ↓               |

Save exception log       |

to flash disk            |

        ↓←--------------

Memory Dump Flag = ON?--------→No--------→Hung up

        ↓

System reboot silently

 

Mask all interrupts  

因为exception处理流程不想被其他程序打断,因此要把所有的中断屏蔽了

 

Restart watchdog

因为异常处理流程运行时,会独占CPU资源。其他task和isr不能运行,不能做定时喂狗的动作。因此在异常处理流程中会喂狗。

 

Increment exception entrance count

异常处理流程中有一个flag,标志这个函数进入了几次。例如,如果fatal_error_handler函数在运行过程中,又发生了异常,那么这个函数又会再进入一次。但是,只有第1次进入这个函数是记录的状态,才是最有意义的。因为如果我们解决了最先的异常,就不会出现后面的异常。

所以,只有第1次进入这个函数,异常信息才会被记录下来。

 

Release system protection and raise task priority level

防止异常处理程序在运行过程中被阻塞,因此把system protection都释放掉。把当前task的优先级设置到最高,是为了让异常处理程序独占CPU运行。否则,发生异常时的那一刻不会被如实记录下来。

 

Initialze exception log

把exception的信息写好在一个structure中

 

Output exception message to catcher

把exception的信息,根据上面的structure,输出到catcher中

 

Display exception message to LCM

把exception的简要信息输出到LCM,例如:Fatal Error(1): 305 -MMI

 

Output exception to Catcher

因为exception发生时,会第一时间先把exception信息输出到catcher中。还有一些log放在tst buffer中没有来得及刷出来。因此,在这时输出到catcher中

 

Save exception log to flash disk

NVRAM中会存储最近10次手机异常信息。假如出现异常的时候,没有连catcher。可以随后用catcher中的advanced-->retrive exception菜单读回异常信息。

如果发第11次手机异常,则会把第1条异常信息冲掉,以此类推。

 

Memory Dump Flag

在工模中的Misc菜单,有memory dump这个选项。假如打开了,则异常时不会重启,会冻屏。这时候可以用catcher的memory dump功能,把memory dump抓下来,提供给MTK分析。 

你可能感兴趣的:(exception,Flash,System,MTK,output,structure)