在使用MCU大约三年后,我仍然不知道软件中断的用途是什么?我已经用STM32做过几项工作,但从未使用过软件中断。确实,这对我来说是一个大问题:
为什么当我们可以使用简单功能执行任务时,应该使用软件中断吗?软件中断和功能之间有什么区别?
每次您喜欢时,都可以调用一个函数(为工作编写的函数)。使用软件中断而不是简单的功能应该会带来一些好处。我不确定,但是我认为软件中断有好处:您可以为软件中断分配优先级,然后可以为软件中断赋予更高的优先级,以避免硬件中断破坏您的任务。
在使用MCU大约三年后,我仍然不知道软件中断的用途是什么?我已经用STM32做过几项工作,但从未使用过软件中断。确实,这对我来说是一个大问题:
为什么当我们可以使用简单功能执行任务时,应该使用软件中断吗?软件中断和功能之间有什么区别?
每次您喜欢时,都可以调用一个函数(为工作编写的函数)。使用软件中断而不是简单的功能应该会带来一些好处。我不确定,但是我认为软件中断有好处:您可以为软件中断分配优先级,然后可以为软件中断赋予更高的优先级,以避免硬件中断破坏您的任务。
Answers:
功能和软件中断之间的主要区别是上下文。
在简单的系统上,这可能并没有真正的区别,并且软件中断可以简单地用作提供在ROM中进行硬编码的库例程的便捷方式-您不需要知道每个例程的地址,只需知道ID代码和主要入口点。这使您的代码更具可移植性。
但是,在更复杂的系统上,软件中断可能在完全不同的环境(称为内核上下文)中运行。通常,您的应用程序将在受保护的用户上下文中运行,该上下文对资源的访问受到限制。只有在内核上下文中运行时,您才能执行更复杂的任务-实际上某些系统甚至限制了可以执行的指令,因此您需要一种机制来在内核上下文中触发代码-为此使用中断。
可以使用软件中断以较低的优先级完成中断任务。定时关键代码通常被赋予较高的中断优先级,以避免过多的延迟。一旦时序关键部分完成,对于主循环来说,可能还有其他一些时序上过于关键的任务,但并不重要,以至于无法阻止其他高优先级中断。触发较低优先级的软件中断即可完成此操作。
例如,假设您有多个步进电机,每个步进电机都有自己的计时器。优先考虑定时器中断,以最大程度地减少阶跃抖动。最严格的时序任务可能只是设置或清除步进脉冲或提前相位输出一样简单。可能需要其他功能,例如计算加速斜率,传感器处理等。由于此步骤需要每一步进行处理,因此可能不适合从main()处理,因为主循环时序可能太长。这些其他任务可以由较低优先级的软件中断处理,以免增加其他高优先级步进通道的延迟。
软件中断和功能之间有什么区别?
无论从何处调用函数,都将立即调用该函数,并且如果从中断调用,则该函数不会更改当前中断优先级。软件中断是一个中断触发器,当优先级出现时,它将导致调用该中断。如果在高优先级中断的末尾插入了函数调用,则该函数将包含在该高优先级中。通过触发优先级较低的软件中断,然后从优先级高的中断返回,可以在新的优先级(较低)下调用该功能。
if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1;
另一个中断就可以完成它的工作,并且在短暂禁用中断的情况下,将100加到timer_count中即可。即使1kHz例程要花费10us以上的时间来执行,也不会干扰100kHz例程。
为了扩展Majenko的答案,软件中断用于实现操作系统,尤其是系统调用接口。这意味着应用程序无需与操作系统链接即可进行功能调用,并且上下文切换允许OS限制对硬件的访问并利用受保护的内存等功能。
如果不使用操作系统,而是控制MCU上的所有代码,则可能不需要使用软件中断。(尽管如Tut所述,它们还可以有其他用途。)