Прерывания в классе

2

Я пытаюсь написать библиотеку, чтобы вычислить период службы 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 */

Спасибо, Шон

  • 0
    Вы помещаете static для функции-члена в определение класса, как вы это сделали; не повторяйте это в теле функции вне строки
  • 0
    @M.MММ, извините, я не совсем понимаю, когда вы говорите «тело функции вне линии». Не могли бы вы объяснить более подробно? Спасибо
Показать ещё 3 комментария
Теги:
arduino
arduino-uno
interrupt
interrupt-handling

1 ответ

2
Лучший ответ

В вашем файле заголовка вы объявили свои функции static, поэтому нет необходимости делать это снова в вашем.cpp файле.

Существует хороший ответ на подобный вопрос здесь для дальнейших разъяснений о том, почему.

  • 0
    На самом деле это не вопрос «повторения». Проблема в том, что ключевое слово static имеет совершенно другое значение в этом втором месте (что неприменимо для функций-членов).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню