系统遇到哪些异常时,会导致系统重启
系统遇到哪些异常时,会导致系统重启
Q:
系统遇到哪些异常时-会导致系统重启
以 MPSOC 平台为例,在异常中断处理流程中,如果检测到如下错误,那么会系统重启:
1、发现中断点处于内核态,那么会执行重启;
2、如果由系统任务触发中断处理流程,那么会执行重启;
3、如果当前是关键错误,或当前处于中断嵌套状态中时,那么会执行重启;(ESR_EL1 寄存器的 EXC_SERROR_INT 位指示当前是否处于关键错误)
4、当前异常处理流程处于中断嵌套状态时,会执行重启
5、当出现 invalid 异常时,会执行重启;(该 invalid 异常由硬件触发异常中断)
6、当发现被中断的任务出现堆栈溢出时,会执行重启。
更多扩展知识见:
参考文章:缺页中断后,系统被重启(任务被kill)
参考文章:处理器包含多级中断系统,BSP部分该如何设计?
Related Articles
缺页中断后,系统被重启(任务被kill)
Q:系统发生缺页中断后打印了一些调试,系统就重启或者任务被 kill 了? 由于 SylixOS 操作系统为了保持硬实时操作系统的特性,所以内核与应用程序没有严格的隔离,缺页中断如果发生在内核被锁定或者中断中,则操作系统不能正确处理,这里需要应用程序开发者与驱动开发人员注意。 更多扩展知识见: 参考文章:处理器包含多级中断系统,BSP部分该如何设计? 参考文章:系统遇到哪些异常时,会导致系统重启
应用程序崩溃,没有输出任何信息,如何定位?
Q:应用程序崩溃,但没有输出任何信息,如何定位呢? 1,考虑是否栈溢出或者函数调用栈被破坏。 2,如何验证是否是栈溢出导致的呢? 在 SylixOS 上可以通过Shell 命令 调大调用栈。 //比如通过如下命令,将栈调大一倍,默认栈大小是65535shstack 120000 也有可能是栈变量等被改写,这就需要结合代码进行分析。 在嵌入式系统中,函数中最好不要定义太大的局部变量,这很容易导致栈溢出,并浪费很多时间来定位无明显提示信息的程序 Crash。 更多扩展知识见: ...
开发中常见故障类型
Q:开发中常见故障类型 在开发过程中经常出现的故障类型主要包括如下几种: 1、栈溢出 2、空指针访问 3、内存泄漏 4、数组越界 5、系统资源泄漏 6、死锁 7、优先级反转 8、位扩展和除零等错误 9、Bus Error 10、Not Found Symbol 11、使用for循环延时被优化 以上故障原因经常出现在开发或排故过程中,其解决方法可参考如下方案: 更多扩展知识见: 可以使用 Crash Trap 调试,使用方式详见《RealEvo-IDE 使用手册》第5章 ...
如果系统出现了异常,如何处理?
Q:如果系统出现了异常,如何处理? 使用以下几个 shell 命令快速定位是否为系统问题: “ps” 查看 kernel 线程是否正常; “tp” 查看有无死锁; “ints” 查看中断; “top” 查看 cpu 的使用情况; “ss” 查看当前堆栈情况(达到临界值时会报警,溢出时会造成系统崩溃) 若程序运行时设备直接重启 检查 /etc/startup.sh 脚本中是否设置了 “shstack 120000” 语句,检查 shell 任务线程栈空间大小 查看系统/应用程序状态,有如下几种: ...
编译器优化导致的问题排故
Q:编译器优化导致的问题排查方法 当 release 版本功能异常,而 debug 版本功能正常,很可能是编译器优化导致的问题。 1、首先根据代码功能大致缩小问题范围,然后可以借助 #pragma GCC optimize("O0") 这个宏来逐步注释缩小范围。 当然也可通过反汇编直接根据分析。 2、也可以通过 __attribute__((optimize("O0"))) 来禁止编译器对函数优化,如 static void rdGmacReg() ...