软件中断与功能


10

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

为什么当我们可以使用简单功能执行任务时,应该使用软件中断吗?软件中断和功能之间有什么区别?

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


1
我认为使用中断的主要目的是,您可以在等待其他事情发生时以及时机并非总是恒定的时候继续执行其他重要任务。我还认为,在大多数情况下,这比轮询更快。
MrPhooky 2015年

1
@MrPhooky您正在谈论的是硬件中断。OP正在谈论软件中断。
brhans 2015年

Answers:


19

功能和软件中断之间的主要区别是上下文

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

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

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


1
同样,中断可以任意中断程序的进程,因此系统可以执行其他操作(例如,硬件中断)。您的程序不需要考虑到这一点,因为从您的程序的角度来看,函数的状态从发生中断时起就保持不变。在较旧的系统上,这是TSR(终止/驻留)通过挂起计时器/时钟中断来编程模拟多任务的方式。即使没有IOPL级别,也可以使系统时钟保持最新状态。
phyrfox 2015年

4
也许还应注意,这些“软件中断”也称为“同步中断”,因为从代码的角度来看,应用程序代码确切地知道发生这种中断的时间和原因,而不是“异步中断”。应用程序,基本上可以随时以不请自来的方式发生。
JimmyB

@HannoBinder:我认为OP正在谈论将中断请求发布到Cortex-M3矢量中断控制器;如果高优先级中断的代码发布了较低优先级的中断,则该请求将被推迟到所有更高优先级的中断完成后再进行。
supercat 2015年

12

可以使用软件中断以较低的优先级完成中断任务。定时关键代码通常被赋予较高的中断优先级,以避免过多的延迟。一旦时序关键部分完成,对于主循环来说,可能还有其他一些时序上过于关键的任务,但并不重要,以至于无法阻止其他高优先级中断。触发较低优先级的软件中断即可完成此操作。

例如,假设您有多个步进电机,每个步进电机都有自己的计时器。优先考虑定时器中断,以最大程度地减少阶跃抖动。最严格的时序任务可能只是设置或清除步进脉冲或提前相位输出一样简单。可能需要其他功能,例如计算加速斜率,传感器处理等。由于此步骤需要每一步进行处理,因此可能不适合从main()处理,因为主循环时序可能太长。这些其他任务可以由较低优先级的软件中断处理,以免增加其他高优先级步进通道的延迟。

软件中断和功能之间有什么区别?

无论从何处调用函数,都将立即调用该函数,并且如果从中断调用,则该函数不会更改当前中断优先级。软件中断是一个中断触发器,当优先级出现时,它将导致调用该中断。如果在高优先级中断的末尾插入了函数调用,则该函数将包含在该高优先级中。通过触发优先级较低的软件中断,然后从优先级高的中断返回,可以在新的优先级(较低)下调用该功能。


2
另一个常见的模式可能是具有一个100KHz的中断来处理对时序要求严格的任务,并且还需要一个1kHz的计时器滴答声,但是没有两个单独的计时器可用。100kHz中断例程无需花费很多时间,if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1; 另一个中断就可以完成它的工作,并且在短暂禁用中断的情况下,将100加到timer_count中即可。即使1kHz例程要花费10us以上的时间来执行,也不会干扰100kHz例程。
supercat 2015年

以类似的方式,我在简单的系统(没有完整的RTOS)中将软件中断用作伪调度程序,其中硬件要求由ISR处理,但回调函数和其他响应于更改的冗长任务执行硬件状态被委托给软件中断。
Evil Dog Pie'Apr

您基本上已经描述了“下半部分”的变体。您是否也将其称为“软件中断”?这与Majenko的答案有完全不同的含义,并且该问题标记为ARM-该体系结构实际上具有SWI(软件中断)指令。
domen 2015年

3
@domen我不确定您需要哪种参考。它被称为“软件中断”,因为这是用来实现它的。在ARM的上下文中,OP特别引用了STM32,并提供了指向RM0008参考手册的链接。这不是ARM核心参考手册。RM0008涵盖的唯一“软件中断”是EXTI_SWIER(软件中断事件寄存器),无论实际的硬件引脚是否用于中断,该寄存器都可用于生成软件中断。我没有亲自使用SWI(SWC)指令。
Tut 2015年

谢谢!最好在答案中包含一些此类信息,以弄清楚是哪个“软件中断”。
domen 2015年

7

为了扩展Majenko的答案,软件中断用于实现操作系统,尤其是系统调用接口。这意味着应用程序无需与操作系统链接即可进行功能调用,并且上下文切换允许OS限制对硬件的访问并利用受保护的内存等功能。

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

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


1
并且在许多情况下,操作系统使用软中断,它们被包装在函数中以简化生活。
hildred

1
我仍然为DOS编程(也是全新的),并且对int 21处理程序非常熟悉。我几乎需要I / O的所有事情都由DOS ISR处理。
R Drast 2015年

请注意,为Linux引用的页面是从1993-1996年开始的。
CVn 2015年

我用最新的链接替换了该链接。
亚当·豪恩
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.