1

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

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

假设我正在查看端口 2(引脚输入)是否按下按钮。

#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 中断关闭时,微控制器是否都按顺序执行?

4

2 回答 2

2

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

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

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

于 2013-10-29T00:06:20.740 回答
1

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

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

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

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

于 2013-10-29T00:48:50.100 回答