每个中断都需要自己的功能吗?
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();
}
我目前正在计划一个包含多个旋转编码器的项目,我想将其连接到中断引脚以可靠地从它们获取输入。 我希望每个编码器都做基本相同的事情,但取决于打开哪个编码器,代码中的一些变量将不得不改变。
我是否必须为它们中的每一个编写一个单独的函数?不可能将参数(在本例中为中断引脚编号)从 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();
}