Embedded 什么是陷阱?

Embedded 什么是陷阱?,embedded,cpu,microcontroller,processor,hardware-traps,Embedded,Cpu,Microcontroller,Processor,Hardware Traps,处理器数据表中列出了许多不同类型的陷阱,例如总线故障、内存管理故障、使用故障和地址错误 他们的目的是什么?如何将它们用于故障处理?简单地说,它们允许您在处理器中发生故障时执行代码。它们有时被操作系统用于错误恢复。微处理器具有针对各种故障情况的陷阱。它们是同步中断,允许运行的操作系统/软件对错误采取适当的操作。陷阱中断程序流并设置寄存器位以指示故障。调试器断点也使用陷阱实现 在典型的计算环境中,操作系统负责处理由用户进程触发的CPU陷阱。让我们考虑当我运行以下程序时发生了什么: int main(

处理器数据表中列出了许多不同类型的陷阱,例如总线故障、内存管理故障、使用故障和地址错误


他们的目的是什么?如何将它们用于故障处理?

简单地说,它们允许您在处理器中发生故障时执行代码。它们有时被操作系统用于错误恢复。

微处理器具有针对各种故障情况的陷阱。它们是同步中断,允许运行的操作系统/软件对错误采取适当的操作。陷阱中断程序流并设置寄存器位以指示故障。调试器断点也使用陷阱实现

在典型的计算环境中,操作系统负责处理由用户进程触发的CPU陷阱。让我们考虑当我运行以下程序时发生了什么:

int main(void)
{
    volatile int a = 1, b = 0;
    a = a % b; /* div by zero */
    return 0;
}
显示了一条错误消息,“我的盒子”仍在运行,好像什么都没发生。在这种情况下,我的操作系统处理故障的方法是杀死有问题的进程,并用错误消息
浮点异常
通知用户

内核模式下的陷阱问题更大。如果操作系统本身存在故障,那么它就不需要采取纠正措施。对于系统进程,没有底层保护。这就是为什么有故障的设备驱动程序会导致真正的问题

在裸机上工作时,如果没有操作系统的舒适保护,情况与上述情况非常相似。实现连续和正确操作的首要目标是使用断言和更高级别的错误处理程序,在触发任何陷阱之前捕获所有潜在的陷阱条件将陷阱视为最后一道防线,这是一道你不想故意掉入的安全网。

为陷阱处理程序定义行为是值得考虑的,即使它们“永远不会发生”。当事情以意想不到的方式出错时,它们将被执行,在最极端的情况下,可能是由于宇宙射线改变了RAM。不幸的是,对于错误处理程序应该做什么,没有单一的正确答案

代码完成,第二版:

最合适的错误处理方式取决于错误发生的软件类型,通常有利于更正确或更健壮。严格地说,这些术语彼此处于天平的两端。正确意味着永远不要返回不准确的结果;没有结果总比不准确的结果好。健壮性意味着总是尝试做一些可以让软件保持运行的事情,即使这会导致有时不准确的结果

很明显,我的操作系统的故障处理在设计时考虑到了健壮性;我可以执行有缺陷的代码,在不破坏系统的情况下做几乎任何事情。仅为稳健性而设计意味着尽可能尝试恢复,如果所有其他操作都失败,则重置。如果您的产品是玩具,这是一种合适的方法


安全关键型应用程序需要更多的偏执,应该支持正确性;当检测到故障时,写入错误日志,关闭。我们不希望我们的放射治疗装置从无效的垃圾值中选择剂量水平。

陷阱本质上是处理器在检测到指令流中的异常情况时强制执行的子例程调用。(一些处理器将它们变成中断,但这主要是将更多的上下文推到堆栈上;如果陷阱包括用户和系统地址空间之间的切换,这会变得更有趣)

这对于处理很少发生但需要解决的情况非常有用,例如除以零。通常,在执行除法指令之前,有一对额外的指令来测试除数是否为零是无用的开销,因为除数永远不会为零。因此,架构师让处理器与实际除法并行执行此检查,作为除法指令的一部分,如果除数为零,则使处理器陷入一个除法为零的例程。另一个有趣的例子是非法的内存地址;显然,您不想在使用每个地址之前编写一个测试来检查它

通常存在各种潜在的故障条件,处理器根据设计将针对每种不同类型的故障将控制权传递给不同的陷阱例程(通常设置为向量)

一旦处理器具有陷阱功能,CPU架构师就会发现许多用途。一个常见的用途是调试器断点和陷阱到操作系统以执行操作系统调用。

ARMv7-M(不要与ARM7或ARMv7-A混淆)Cortex-M3技术参考手册,它也可能是新ARM ARM(ARM架构参考手册)的一部分 有一节描述这些故障中的每一个

现在,为什么和什么可能是问题的根源。原因通常是你有机会康复。想象一下,你的机顶盒或电话碰到了其中一个,你想让它挂起来还是尽可能地恢复?除非您预期会出现这些故障(在本文中,您不应该出现这些故障,x86系统和它们的一些故障是完全不同的情况),否则,如果您存活足够长的时间,能够碰到其中一个故障,您很可能会触发自己(软件试图通过重置处理器/系统来自杀)。你可以浏览这个长长的列表,试着找到可以恢复的。除以零,异常处理程序如何知道导致这种情况的数学错误是什么?一般来说,这是不可能的。未对齐的加载或存储,处理程序如何知道代码试图做什么,比如除以零,这可能是一个软件错误。未定义的指令,代码进入杂草和执行的数据最有可能在这一点上你已经太fa了