Передать шаблонную функцию в качестве параметра attachInterrupt
Итак, я хочу сделать что-то вроде этого:
template<int PIN, int CHANNEL>
void initPin() {
attachInterrupt(PIN, rising<PIN, CHANNEL>, RISING);
}
template<int PIN, int CHANNEL>
void rising() {
startTimes[CHANNEL] = micros();
attachInterrupt(PIN, falling<PIN, CHANNEL>, FALLING);
}
template<int PIN, int CHANNEL>
void falling() {
values[CHANNEL] = micros() - startTimes[CHANNEL];
attachInterrupt(PIN, rising<PIN, CHANNEL>, RISING);
}
но компилятор выдает эту ошибку
no matches converting function ‘rising’ to type ‘void (*)()’
Можно ли это сделать, или мне придется писать все функции самому?
@qwipo, 👍0
2 ответа
▲ 1
Попробуйте это:
template<int PIN, int CHANNEL> void initPin() {
attachInterrupt(PIN, rising<PIN, CHANNEL>, RISING);
}
template<int PIN, int CHANNEL> void rising() {
startTimes[CHANNEL] = micros();
attachInterrupt(PIN, falling<PIN, CHANNEL>, FALLING);
}
template<int PIN, int CHANNEL> void falling() {
values[CHANNEL] = micros() - startTimes[CHANNEL];
attachInterrupt(PIN, rising<PIN, CHANNEL>, RISING);
}
На самом деле проблема заключается в препроцессоре Arduino. Он добавляет недопустимые предварительные объявления, если шаблонные функции отформатированы как исходный код.
,
@Mikael Patel
▲ 1
Пожалуйста, посмотрите реализацию https://github.com/Yurik72/SimpleButton
Есть реализация, как назначить функцию с аргументами обработчику прерывания
,
@Yuri Kovalenko
Смотрите также:
- Почему необходимо использовать ключевое слово volatile для глобальных переменных при обработке прерываний в ардуино?
- Какие Arduino поддерживают ATOMIC_BLOCK?
- Прерывания внутри класса, связанные с функцией класса
- Альтернатива опросу флага прерывания из основного цикла?
- Используйте ISR внутри библиотеки более элегантно
- Анимация светодиодной ленты с ESP32 не работает при использовании WiFi
- Последующий вопрос о кнопке и переключателе
- Проблема конечного автомата