每个中断都需要自己的功能吗?

Does every interrupt need its own function?

我目前正在计划一个包含多个旋转编码器的项目,我想将其连接到中断引脚以可靠地从它们获取输入。 我希望每个编码器都做基本相同的事情,但取决于打开哪个编码器,代码中的一些变量将不得不改变。

我是否必须为它们中的每一个编写一个单独的函数?不可能将参数(在本例中为中断引脚编号)从 attachInterrupt 传递给被调用函数,除了编写 5 个函数(rotary1() rotary2()... ) 包含完全相同的代码,但更改了几个变量。

我想到的另一个选择是调用一个 "intermediary" 函数来检查当前相关的 pin,然后使用向下传递的信息调用旋转函数,但这远不是一个优雅的解决方案,并且可能会大大减慢整个过程。我真的不想单独检查正在打开哪个编码器,因为此信息已经存在,我只是不知道如何访问它。

如果有更多经验的人能在这里为我指明正确的方向,我将不胜感激,因为即使作为一个相对初学者,多次编写相同的代码对我来说也是非常错误的。

正如您所发现的,您需要与引脚一样多的 ISR。但是您不需要复制其中的代码。

注意:根据您的算法,您可能需要多个处理函数,例如,如果您使用编码器的两个输入来中断。

C 方式

编写一个单独的函数,它可以接受尽可能多的参数。

使用适当的参数从您的 ISR 调用此函数。

void handleInterrupt(int which) {
    // do whatever you like to do with "which"
}

void interruptServiceRoutine1() {
    handleInterrupt(1);
}

void interruptServiceRoutine2() {
    handleInterrupt(2);
}

void interruptServiceRoutine3() {
    handleInterrupt(3);
}

C++ 方式

写一个class表示一个旋转编码器。包括处理中断的方法。

使用您的 ISR 中的相应旋转编码器对象调用此方法。

class RotaryEncoder {
public:
    void handleInterrupt();
};

void RotaryEncoder::handleInterrupt() {
    // do whatever you like to do
}

RotaryEncoder rotaryEncoder1;
RotaryEncoder rotaryEncoder2;
RotaryEncoder rotaryEncoder3;

void interruptServiceRoutine1() {
    rotaryEncoder1.handleInterrupt();
}

void interruptServiceRoutine2() {
    rotaryEncoder2.handleInterrupt();
}

void interruptServiceRoutine3() {
    rotaryEncoder3.handleInterrupt();
}