Я пытаюсь написать библиотеку, чтобы вычислить период службы PWM, используя прерывания. Я понимаю, что член класса не является правильным форматом функции для attachInterrupt.
Тем не менее, я попытался следовать этому сообщению Вызов ISR из класса Ником Гэммоном, у которого есть работа, но, к сожалению, я все еще получаю ошибку:
не может объявить функцию-член 'static void PWMin :: risingInt()', чтобы иметь статическую связь
Может кто-нибудь, пожалуйста, осветить какой-то недостаток в моем коде или других предложениях?
Это файл cpp:
#include "PWMin.h"
PWMin::PWMin(int intPin, int* outputTime, bool direction=true){
instance = this;
this->_intPin = intPin;
this->_outputTime = outputTime;
this->_direction = direction;
pinMode(this->_intPin, INPUT);
attachInt();
}
void PWMin::attachInt(){
attachInterrupt(this->_intPin, this->_direction ? risingInt : fallingInt, this->_direction ? RISING : FALLING);
}
void PWMin::risingISR(){
this->start = micros();
this->_direction = false;
this->attachInt();
}
void PWMin::fallingISR(){
this->timeElapsed = micros() - this->start;
*_outputTime = this->timeElapsed;
this->_direction = true;
this->attachInt();
}
unsigned long PWMin::lastElapsedTime(){
return this->timeElapsed;
}
static void PWMin::risingInt(){
if(PWMin::instance != NULL){
PWMin::instance->risingISR();
}
}
static void PWMin::fallingInt(){
if(PWMin::instance != NULL){
PWMin::instance->fallingISR();
}
}
Это заголовочный файл:
#ifndef PWMin_h
#define PWMin_h
class PWMin {
public:
PWMin(int intPin, int* outputTime, bool direction);
unsigned long lastElapsedTime();
private:
static PWMin *instance;
int _intPin;
int* _outputTime;
bool _direction;
unsigned long start, timeElapsed;
void attachInt();
void risingISR();
void fallingISR();
static void risingInt();
static void fallingInt();
};
#endif /* PWMin_h */
Спасибо, Шон
В вашем файле заголовка вы объявили свои функции static
, поэтому нет необходимости делать это снова в вашем.cpp файле.
Существует хороший ответ на подобный вопрос здесь для дальнейших разъяснений о том, почему.
static
имеет совершенно другое значение в этом втором месте (что неприменимо для функций-членов).
static
для функции-члена в определение класса, как вы это сделали; не повторяйте это в теле функции вне строки