在进行嵌入式系统调试时,经常会遇到各种原因进入到硬件故障中难以自拔,这时候往往令人无从下手,因为导致硬件故障的原因有很多,有时候可能是一个指针或是一个标识符的问题,有时候又或是外设时钟的配置问题,亦或是中断的入口函数所致等等等,在此给大家简单罗列的几列常见的导致硬件故障的原因,欢迎大家补充拍砖,谢谢,话不多说,请评阅:
1、非法存储器访问
这也是最常见的问题是访问非法的存储器区域。
2、非对齐数据访问
如果我们直接操作一个指针,或者使用汇编代码,就会生成试图执行非对齐访问的代码,如果错误指令为存储器访问指令,就应该确定传输用的地制止是否是对齐的。
3、从总线返回错误
如果外设没有被初始化,或者时钟没有被使能,那么该外设可能会返回错误的响应,在有些不大常见的情况下,外设只能接收32位的传输,对字节或半字传输会返回错误响应。
4、异常处理中的桟被破坏
如果程序在中断处理执行后崩溃,还可能会引起桟帧被破坏,由于局部变量存储在桟空间中,如果异常处理中定义的数组在使用时超过了数组的大小,异常桟帧可能就会被破坏了,结果就是,异常退出后程序可能崩溃。
5、程序在某些C函数中崩溃
请检查是否为桟和堆预留了足够的空间,如:Keil中NXP LPC111X的堆空间默认为0字节,如果程序中使用了malloc、printf等C函数,那么就需要修改堆的大小了。
这个问题的另一个可能的原因是,连接器没有使用正确的C库函数,连接器通常会详细的告知用户使用了哪些库函数,有些情况下,可以检查这些信息。
6、意外的试图切换至ARM状态
进入硬件错误后,如果压入栈的XPSR的T位为0,那么这个错误就是由于切换至ARM状态引起的,引起这个错误的可能原因有很多,如非法函数指针,向量表中向量的最低位不为1,异常处理时桟帧被破坏或者连接器没有使用正确的C库等。
7、在错误的优先级上执行SVC
如果SVC指令的执行发生在SVC处理中,或者其他和SVC异常优先级相同或更高的异常处理中,就会引起错误,如果在NMI处理和硬件错误处理中使用SVC,则会导致锁定。