如果我为一个中断创建多个ISR会发生什么?

时间:2013-10-18 21:37:56

标签: c interrupt interrupt-handling

在我的所有IDE都重新安装时,我有或多或少的理论问题......

所以我主要使用MSP430,而且我很好奇如果我为一个中断向量创建多个ISR会发生什么。

假设我正在观看按下按钮的Port2(引脚输入)。

#pragma vector = PORT2_VECTOR
__interrupt void Port2_ISR_1 (void)
{
    if (BUTTON1_DOWN)
    {
       g_temp = 1234;
    }
}

现在如果我在同一个PORT2_VECTOR对应的地方添加另一个怎么办?

#pragma vector = PORT2_VECTOR
__interrupt void Port2_ISR_2 (void)
{
    if (BUTTON2_DOWN)
    {
       g_temp = 2345;
    }
}

它们对应于按下的不同按钮,但对应于相同的中断向量。当编译器编译时,如果它们属于同一个向量,它是否将服务例程放在一起?当PORT2中断熄灭时,微控制器是否按顺序执行?

2 个答案:

答案 0 :(得分:2)

如上所述,这取决于实现;然而,到目前为止,我从未遇到过支持多个中断服务程序的微控制器。

大多数常见微控制器系列实现的标准行为是:一个向量=一个服务例程。

此外,正如其他用户在评论中指出的那样,您的代码会在链接时触发重复的符号错误。

答案 1 :(得分:1)

你可以写出尽可能多的ISR。但是,中断向量表(IVT)是中断和ISR地址之间的一对一对应关系。因此,当您的程序加载时,只有一个地址可以写入任何特定中断的IVT条目。没有处理器或中断控制器允许每个中断有多个ISR地址。

处理器中断向量表由与程序链接的C运行时程序(“crt0”)初始化。 Here是AVR微处理器的示例crt0。如您所见,此crt0实现使用全局符号将值分配给中断向量表条目。这意味着链接器应检测多个ISR符号。

一些crt0实现,包括一些用于MSP430的实现,将IVT从符号位置复制到IVT的硬件位置0xFFE0到0xFFFE。对于这种类型的crt0,编译器需要检测多个ISR,因为它构建了IVT并为crt0设置了符号。

您使用的crt0取决于编译器配置,除非您专门覆盖它,例如,在GCC中通过在GCC_EXEC_PREFIX环境变量中指定自定义目录名称来覆盖它。

相关问题