软件中断与函数

电器工程 手臂 stm32 中断
2022-01-11 14:24:02

在使用 MCU 大约 3 年后,我仍然不知道软件中断有什么用?我用STM32做过几项工作,但我从未使用过软件中断。事实上,这对我来说是一个大问题:

为什么当我们可以使用一个简单的函数来完成一项任务时,我们应该使用软件中断?软件中断和函数有什么区别?

每次你喜欢时,你都可以调用一个函数(你为你的工作编写的)。使用软件中断而不是简单的函数应该有一些好处。我不确定,但我认为软件中断有一个好处:您可以为软件中断分配优先级,然后您可以为软件中断赋予更高的优先级以避免硬件中断破坏您的任务。

3个回答

函数和软件中断之间的主要区别是所谓的上下文

  • 函数在主程序的上下文中运行。
  • 中断在中断处理程序的上下文中运行。

在一个简单的系统上,这可能没有真正的区别,并且软件中断可以简单地用作提供在 ROM 中硬编码的库例程的便捷方式——您不需要知道每个例程的地址,只需要知道 ID 代码和主要入口点。这使您的代码更具可移植性。

然而,在更复杂的系统上,软件中断可能在完全不同的环境中运行,称为内核上下文通常,您的应用程序将在对资源的访问受限的受保护用户上下文中运行。只有在内核上下文中运行时,您才能执行更复杂的任务——实际上有些系统甚至限制了可以执行的指令,因此您需要一种机制来触发内核上下文中的代码——为此使用中断。

软件中断可用于以较低优先级完成中断任务。时序关键代码通常被赋予高中断优先级以避免过多的延迟。一旦完成了时序关键部分,可能会有额外的任务对主循环来说可能过于时序关键,但没有那么关键到阻止其他高优先级中断。触发较低优先级的软件中断可以实现这一点。

例如,假设您有多个步进电机,每个电机都有自己的计时器。定时器中断被赋予高优先级以最小化步进抖动。最关键的时序任务可能很简单,例如设置或清除阶跃脉冲或推进相位输出。可能需要额外的功能,例如计算加速斜坡、传感器处理等。由于这需要每一步都处理,因此从 main() 处理它可能不合适,因为主循环时间可能太长。这些附加任务可以由较低优先级的软件中断处理,以免增加其他高优先级步进通道的延迟。

软件中断和函数有什么区别?

一个函数会立即从它被调用的地方被调用,并且如果从一个中断中调用它不会改变当前的中断优先级。软件中断是一种中断触发器,当它的优先级上升时会导致该中断被调用。如果在高优先级中断的末尾插入函数调用,则该函数将包含在该高优先级中。通过触发低优先级软件中断然后从高优先级中断返回,该功能以新的(低)优先级被调用。

为了扩展 Majenko 的答案,软件中断用于实现操作系统,特别是系统调用接口。这意味着应用程序不需要与操作系统链接来进行函数调用,并且上下文切换允许操作系统限制对硬件的访问并利用受保护的内存之类的东西。

如果您不使用操作系统并且控制 MCU 上的所有代码,则可能不需要使用软件中断。(尽管正如 Tut 提到的,它们可以有其他用途。)

x86 上的LinuxMS-DOS系统调用接口使用软件中断,因此我将链接到这些作为示例。