是否应该始终定义所有陷阱?


18

我现在在dsPIC 30F4013中看到过两种情况,由于未定义陷阱,控制器正在复位。为什么首先要提出这些陷阱仍然是一个谜,但这不是我的直接问题。我开始认为始终定义所有陷阱是一个好的编程习惯,即使永远不要出现陷阱,因此我至少会得到一条清晰的错误消息,而不是随机重置。这是我不知道的标准做法吗?我应该考虑这种做法是否有弊端?


4
不能回答您的问题,但是前一阵子,我在dsPIC和PIC24系统上遭受了此类症状。在我的情况下,陷阱是由代码位引起的,在这些代码中,我将指针解引用为16位值,并且这些指针本身具有奇数(不偶数)值,因为它们指向的是循环通讯缓冲区-而且我以前没有知道16位值是从奇数还是偶数边界开始的一种方式。XC16编译器无法保护您免受此处硬件的困扰。我最终为这些函数编写了一个包装宏,该宏强制2个8位指针取消引用。
brhans 2016年

Answers:


13

我的非正式规则是:

  1. 如果启用了中断,则应该具有处理该中断的代码。
  2. 如果您不为中断编写代码,请禁用它。
  3. 如果无法禁用它,请为其编写代码。

即使没有该规则,数据表也会明确回答您的问题:

如果用户在发生陷阱错误情况时不打算采取纠正措施,则必须使用仅包含RESET指令的默认处理程序的地址加载这些向量。另一方面,如果调用包含无效地址的向量之一,则会生成地址错误陷阱。

来源,第8.3节,第一个注释)

鉴于您无法屏蔽陷阱,因此您必须处理它们。如果您不希望以特定方式处理陷阱,则适当的方法是执行RESET指令。


对。我有一个标准模块,其中包含所有陷阱的目标。
Olin Lathrop

16

是的,这是个好主意-唯一的缺点是额外的代码大小,您必须决定如何处理陷阱(在串行端口上发送消息?打开“ FAILED”灯?静默重启?等)


4
我通常只是让处理器在无限的NOP / GOTO循环中运行。这样,堆栈就不会从陷阱中损坏,并且在调试时,我有机会对其进行拆解并弄清楚发生了什么。我不经常收到陷阱,但是80%的时间是一个奇怪的地址陷阱,通常是因为垃圾被作为指针加载了。有时,堆栈指针会损坏并产生奇数地址陷阱。由于堆栈不再存在,因此更难调试。幸运的是,这确实很少见。
奥林·拉斯罗普
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.