加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

MTK异常处理流程

发布时间:2020-12-15 06:43:31 所属栏目:百科 来源:网络整理
导读:?MTK异常处理流程 ? 异常处理流程里面,需要做的事情是:生成异常信息输出到屏幕或catcher中,并保存到NVRAM里面。最后根据工程模式的设定,机器会冻屏(选择冻屏是为了抓memory dump),或者重启。 ? 1、CPU触发的异常处理 当CPU触发异常时,会触发Exceptio
?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分析。?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读