Каждому прерыванию нужна своя функция? - PullRequest
0 голосов
/ 13 февраля 2020

В настоящее время я планирую проект, который включает в себя несколько поворотных энкодеров, которые я хочу подключить к прерывателям, чтобы надежно получать от них входные сигналы. Я хочу, чтобы каждый кодировщик делал по существу одно и то же, но в зависимости от того, какой кодировщик включен, некоторые переменные в коде должны будут измениться.

Должен ли я написать отдельную функцию для каждого из них? Невозможно передать аргумент (в этом случае номер контакта прерывания) в вызываемую функцию из attachInterrupt, и я действительно не вижу никакой другой жизнеспособной опции, кроме как написать 5 функций (rotary1 () rotary2 () ... ), содержащий точно такой же код с измененными несколькими переменными.

Еще один вариант, о котором я подумал, - это вызвать «посредническую» функцию, которая проверяет текущий актуальный вывод, а затем вызывает поворотную функцию с этой переданной информацией. вниз, но это далеко не элегантное решение и, вероятно, сильно замедляет весь процесс. Я действительно не хочу делать отдельную проверку для того, какой кодер включен, потому что эта информация уже есть, я просто не знаю, как получить к ней доступ.

Буду признателен, если кто-то с более опыт может указать мне правильное направление, поскольку мне, как относительному новичку, так много раз писать один и тот же код много раз.

1 Ответ

0 голосов
/ 13 февраля 2020

Как вы обнаружили, вам нужно столько 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 ++

Напишите класс для представления поворотного кодировщика. Включите метод, который обрабатывает прерывание.

Вызовите этот метод с соответствующим объектом поворотного кодера из ваших 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();
}
...