答案 0 :(得分:3)
就像门铃或电话在你家里响起一样,你停止正在做的事情,处理中断,然后,理想情况下,回到你正在做的事情。
与处理器(msp430或其他)相同。有各种方法可以中断处理器。我在你的uart中有一个新字节,一个定时器已经超时,一个gpio引脚已经改变了状态等等。你已经配置为在发生处理时中断处理器的东西。
就像门铃一样。硬件必须有一种方法来停止并保存一些内容以记住它正在做什么,找出中断是什么并处理它,然后回到它正在做的事情。处理器通常在指令之间完全中断它们将完成当前指令(使用piplines" current"有点模糊)。然后根据中断和处理器的设计,有一些硬件和软件达成一致的地方(硬件规定和程序员使用),这样软件可以告诉处理器代码在哪里处理所有中断或特定的中断的味道,取决于处理器的设计方式。一个常见的解决方案是中断向量表,通常是程序员设置的地址列表,指向处理这些事件或中断中的每一个的代码,程序员和硬件都知道特定的中断会导致特定的地址在内存空间中读取,硬件假定该地址是该中断的代码。
因此处理器得到一个中断,它保存了机器的状态,至少是程序计数器,并且可以根据设计还保存状态寄存器和gprs,但程序员通常负责保存gprs等如所须。然后硬件基于中断/事件从地址读取,通常该地址包含处理程序的地址,例如0xFFF8可能是中断处理程序的地址(不知道没有查找msp430)。所以0xFFF8不是代码的位置,而是该地址的数字是代码可能是0xD008的地方。这取决于处理器架构,但是当您完成处理中断时,您需要告诉处理器它可以返回到被中断的内容。通常这是中断指令的特殊返回,但不同的处理器有不同的解决方案。
优先级(如果有的话)由硬件设计决定,像msp430那样简单的东西可能不会(不确定)手头有优先级方案,而不是先到达这里的人。并且该方案可能是在你退出处理程序之前,你检查是否有其他人在你处理那个打断你的人时进来了。如果设计中存在优先级方案,那么它只是重复过程保存状态(中断或前台代码中断)通常使用向量表找到处理程序的入口点。当最高优先级处理程序完成时,它返回并且控制返回到下一个更高优先级的事物,并最终返回到forground任务(假设没有其他任何东西出现)。
一般来说,isr不需要破坏前台任务正在使用的任何东西,如果需要保留gprs的状态,保留状态寄存器的状态,不要弄乱前台任务使用的堆栈或内存等。理想情况下,保持精益和平均,不要浪费很多时间。向量表就是填写代码重置处理程序中断处理程序等的入口点地址的地方。
答案 1 :(得分:2)
中断处理程序(也称为中断服务例程或ISR)是在发生需要CPU注意的事件(I / O)时运行的一段代码。中断事件通常是异步的,因此必须为事件注册处理程序。
例如,在串行通信的情况下,需要处理的USCI外设(为UART配置)接收数据。在这种情况下,USCI外设将发出中断,CPU将从中断处理程序开始执行(由中断向量寻址)。矢量位于固定位置,并在设备的数据表中列出。当到达中断处理程序的末尾时,CPU将返回到它停止的位置(或服务另一个中断)。数据表/用户指南将解释中断的默认优先级。
使用IAR Embedded Workbench IDE的典型中断处理程序如下所示:
// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1OUT ^= 0x01;
// P1.0 = toggle
P1IFG &= ~0x10;
// P1.4 IFG cleared
}
可以进一步阅读here。