Arm Cortex M3 - 中断

Arm Cortex M3 - Interrupt

我对在微控制器上进行汇编编程还比较陌生, 所以我有一个很基本的问题。 我正在使用 Arm Cortex M3。

使用中断的最大优势是什么? (降低功耗或能够编写更快的代码?)

如果能提供一段在汇编中使用中断的示例代码,我将不胜感激。

如果关于使用中断还有什么我应该知道的,如果你能分享你的知识我会很高兴!

非常感谢

中断正如其名。因此,例如,您可以站在前门以防万一有人经过。或者,您可以每隔一两分钟查看一下 window,以防有人经过。或者你可以有一个门铃,只有在门铃响时才去门口,根据优先级。因此,如果您正在看电视,您可能会决定暂停节目或错过某些节目,然后走到门口看看谁在那儿。您可能正在淋浴或在浴室里忙于其他事情,假设您还不知道谁来了,您可能会选择优先于门……或者您可能在前面做院子工作,如果有人来了,您已经还有一个中断,但也类似于轮询。

所以你可以轮询,让代码不断地或每隔这么多时间单位检查外围设备以查看是否发生了什么事情。或者你可以设置一个中断,然后如果发生什么事情你会被打断并以任何方式处理它(保存一个标志说你有一个然后稍后处理它,或者立即处理它或在中间的某个地方处理)。

没有正确答案,有时轮询很好,有时更好。有时轮询不好或消耗太多时间或不够快以轮询并执行其他前台任务。同样,中断可能是好主意也可能是坏主意,这取决于。您应该对每一个都有基本的了解,从轮询开始,然后根据要解决的问题设计解决方案。仅仅设置你的第一个中断可能是相当困难的,它们通常是非常重要的,通常,在可能的情况下,无论如何最好从轮询开始,了解如何启用,并以轮询的方式查看中断(并非所有硬件都允许你这样做,但通常你可以轮询,但禁用最后一个启用,实际上不会中断)然后学习如何服务和清除中断,然后你必须确保你的服务程序足够快,不会搞乱前台任务中的其他事情,它也可能共享寄存器等资源,因此请确保在处理器设计要求时或根据处理器设计要求保留前台任务的状态。 (cortex-m3 负责保存寄存器的状态,但通常您应该理解这一点),然后在启用中断时拉动触发器。即使对于有经验的人来说,让中断服务例程工作也不容易,你可能会发现 10 次中有 9 次它第一次工作,但随后你转移到一个新的平台或芯片或其他任何东西,当你必须调试它时它不起作用,这是真正的问题,尤其是对于嵌入式微控制器,对正在发生的事情的可见性非常有限。

这就像你一边看书一边等朋友,所以你要么去window看看你的朋友来了没有,然后开门(这叫polling ) 或者继续看书并等待铃声响起(这称为中断)。因此,与其在读书期间打扰自己,不如等待中断。

但是,使用轮询还是中断是更好的解决方案取决于您的应用程序。

为了实现,我建议阅读 Joseph Yiu 写的书"The Definitive Guide to the ARM Cortex-M3"。

中断的想法背后有几个原因

i.CPU 周期和能效

现在假设您有一个处理来自 UART 外设的数据的项目,这里您有两个选择;您将连续轮询以查看是否从 UART 通道接收到任何数据,或者您将设置相应的中断,并且 cpu 将在从通道接收到数据时调用相关的中断子程序。

如前所述,使用轮询方法 CPU 必须不停地工作,这真的很愚蠢,因为与其为内部外围设备连续工作,不如轻松地做一些其他工作(比如等待TCP 接收或无法通过 IRQ 完成的事情)或简单地进入低功耗模式并等待 IRQ 启动。

ii.)任务优先级和精确度(我认为这是最重要的)

在任何编程语言中,如果您不使用异常处理,那么对这些东西进行优先排序对程序员和 CPU resources.And 来说都需要付出太多的努力,实际上比这更不可能这样做是因为随着你的程序变得越来越大,你不会在主循环中有任何 space 来做你想做的事情。例如,如果您的程序正在计算多维数组的傅里叶变换,它将简单地忽略任何其他事情。(ADC 读数、输入数据传输等)这是进行优先级排序的地方。使用中断,您实际上可以决定您可能遇到的每个场景会发生什么以及何时发生。

同样对于需要精确定时事件的任务,如果没有中断是无法完成的。即使是最简单的任务,例如每 'x' 毫秒增加一个计数器,也可能成为您遇到过的最困难的事情 :P 。大多数时候,在不使用中断的情况下做这样的事情的实验最终会发现毫秒 'x' 在某个边界之间移动。