8. 异常
芯片在运行代码时,由于软件 / 硬件状态出错,当该错误状态未在硬件 / 软件 程序设计覆盖的容错范围时,就会引起系统处于未知状态的异常。在触发异常后,会有两种后果:一、系统复位;二、进入系统异常中断函数并死循环住;
备注
用户可以通过配置 config_asser 来选择触发异常后是系统复位还是进入系统异常中断函数卡死。
!["系统异常触发后果选择"](../_images/config_asser.png)
系统异常触发后果选择
8.1. 异常分析
用户在触发异常后,可以观察异常信息里的 reti 和 rets 的地址,在下载目录里的sdk.lst文件查看对应地址的代码是出现在那里。
下面例子为SDK操作了一个指向空白地址的指针给他赋值导致的cpu写空白地址异常。(其他异常分析均可类似分析)
分析异常信息
![]()
异常信息
2. 在下载目录里的sdk.lst文件查找 rets 和 reti 的位置 (若分析该两处地址分析不出具体异常原因,可查看异常信息里的cpu的运行地址来反推异常位置)
![]()
异常信息在sdk.lst位置
3. 追踪到SDK具体异常位置。 SDK操作了一个指向空白地址的指针给他赋值导致的cpu写空白地址异常。
![]()
异常位置
备注
有一些异常信息往往不在具体异常代码那一行,而是在附近
8.2. 常见异常
常见异常信息有:
pc_limit:程序跑飞,指CPU的PC指针跑到了不允许操作的地址;
misalign_err:非对齐访问,指CPU访问内存数据时,寻址指针要求地址4字节对齐访问;
cpu read / write hmem excption : cpu读 / 写空白地址访问异常,指CPU读/写了内存里的空白地址;
watchdog time out : 看门够异常,指系统未在看门狗规定范围时间内进行清狗操作。
更多异常信息和demo例子可查看下方链接的《系统异常信息》部分: