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分析。? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |