1、注册信息到期:打开LicenseManagement窗口中,查看有没有注册信息,或者注册信息变红,就有几率进入调试卡死。
2、有中文路径:软件对中文路径支持不太好,最好还是使用全英文路径。
3、退出调试模式前清除断点:在中文路径下,退出调试时,只要工程有断点,必定卡死,如果退出调试时清除所有断点,就没问题。
当前使用的是Arm cortext M33,keil编译环境。测试用例如下:
keil跑一下,死机了。 peripherals - core peripherals - Fault Reports NS ,可以看到以下信息:
解决问题,需要先推一下异常前的现场,以确定异常发生的位置:
Arm Cortex M在进入异常之前,会将异常前寄存器压栈,包含硬件自动入栈和软件入栈:
压栈顺序搞明白了,那么下面就去栈空间里找到保存的 lr 、 pc 等重要信息。
先确定一下是从 handler 模式还是 thread模式 进入的异常,这时,需要查看进入异常时的 EXEC_RETURN 的 bit2 来确定:
图1 已经是异常ISR又做了一次跳转,所以要看 EXEC_RETURN 的值,需要在MM FAULT的ISR函数打个断点,再跑一下:
EXEC_RETURN = 0xFFFFFFBC ( 图2 箭头指向),其 bit2 = 1,那说明是在 thread模式 发生了异常,现场信息都保存在了 PSP 指向的栈中。
psp = 0x2008D8C0 ,内存如下。因为我们在已进入 MemManage_Handler 就断点了,所以,没有执行主动压栈的部分,当前栈中只有硬件自动压栈的8个寄存器(下图红色框处,从右到左,依次是 psr,pc,lr,r12,r3,r2,r1,r0 ):
通过 addr2line 和符号表可以很容易定位到异常点(xxx_demo.c的369行):
死机原因如下:第一:电脑系统老化,也就是系统文件版本过于低,对于新版软件的兼容及支持不足造成兼容性卡机,可以重做系统解决。
第二:还有电脑后台运行项目过多,启动项目过多,造成内存不足引起死机现象,利用优化软件进行查杀无用后台运行程序,关闭开机启动项目。
第三:电脑物理内存不足,内存条因老化或电压问题造成不稳定引起死机,可以更换内存解决。
第四:CPU进程超负荷,超出CPU所能承载最大造成因运行数据处理失败造成死机,重做系统,或打开进程管理器将没用进程关闭结束。
第五:夏天天气温度高,机器内部排风不通畅, 使用率过高造成cpu温度升高,死机,可以利用辅助散热工具进行散热,检查CPU处硅胶是否良好,涂抹硅胶。自己判断下相对进行处理。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)