异常处理流程里面,需要做的事情是:生成异常信息输出到屏幕或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分析。