Прерывания в классе
- Войдите на сайт для отправки комментариев
Сб, 01/08/2020 - 11:50
Я пытаюсь создать класс, который работает с клавиатурой. Я понимаю, что член класса не является правильным форматом функции. Ну все таки я последовал примеру http://www.gammon.com.au/forum/?id=12983. Если присваивать переменной значение в функции pressKey() то выводит ошибку при компиляции collect2: error: ld returned 1 exit status *** [.pio/build/esp32doit-devkit-v1/firmware.elf] Error 1
#ifndef MYKEY_H #define MYKEY_H #include <Arduino.h> #include <PCF8574.h> //#include "board_tr02.h" class MyKey { #define ENTER_KEY 1 #define BACK_KEY 2 #define UPP_KEY 0 #define DOWN_KEY 3 static MyKey *instance; public: MyKey(uint8_t interapt_pin); MyKey(); uint8_t isUpp(); uint8_t isDown(); uint8_t isEnter(); uint8_t isBack(); private: PCF8574 *inExtender; bool _flagInterapt; uint8_t _pressStat; static void intteraptKeys(); void pressKey(); } ; #endif MyKey::MyKey(uint8_t interapt_pin){ this->_flagInterapt = true; inExtender = new PCF8574(0x21, interapt_pin, intteraptKeys); inExtender->pinMode(DOWN_KEY, INPUT_PULLUP); inExtender->pinMode(UPP_KEY, INPUT_PULLUP); inExtender->pinMode(ENTER_KEY, INPUT_PULLUP); inExtender->pinMode(BACK_KEY,INPUT_PULLUP); inExtender->begin(); } MyKey::MyKey(){ // now interrapt this->_flagInterapt = false; inExtender = new PCF8574(0x21); inExtender->pinMode(DOWN_KEY, INPUT_PULLUP); inExtender->pinMode(UPP_KEY, INPUT_PULLUP); inExtender->pinMode(ENTER_KEY, INPUT_PULLUP); inExtender->pinMode(BACK_KEY,INPUT_PULLUP); inExtender->begin(); } void MyKey::pressKey(){ this->_pressStat =true; } void MyKey::intteraptKeys(){ if(MyKey::instance != NULL) MyKey::instance->pressKey(); }
Метод экземпляра нельзя вызывать в качестве обработчика прерывания. Создайте обработчик вне класса, а уже в нем вызывайте метод через указатель на экземпляр
Не совсем понял, создал вне класса все рано не коммпилится
Instanse сделайте глобальной и волатильной, присваивайте ей указатель на текущий экземпляр в конструкторе или отдельном методе
Ищите примеры в гугле, я счас в электричке еду, неудобно код набирать:)
В классе статически объявляется прерывание, которое вызывает обработчик, принадлежащий к правильному экземпляру.
Я запарился иже искать, не знаю может плохо ищу, вот пример https://overcoder.net/q/1944963/%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B2-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B5, но пучему то у меня не работает.
src/MyKey.h:63:36: error: passing 'volatile MyKey' as 'this' argument discards qualifiers [-fpermissive]
Ну здравствуйте, запарился он:) В чем тогда цимес написания кода, если не сидеть ночами долбясь головой в стенку, разбираясь почему код не работает?
Судя по коду. Вы невнимательно читаете, что вам пишут
В классе статически объявляется прерывание, которое вызывает обработчик, принадлежащий к правильному экземпляру.
наверно так правильнее, но я просто описываю обработчик и указатель на экземпляр " снаружи" класса... и все работает
А зачем было объявлять указатель волатильным? Зачем тебе вообще класс, если у тебя только один экземпляр?
Почему обязательно один? Иногда несколько. Тогда создаю массив указателей на экземпляры и вызываю их по очереди.
Неправильно?
Я говорю про код в примере.
Дайте ссылку на примерчик :) плиз
Самый большой идиотизм это прикручивать кнопки к аппаратному прерыванию. Не я понимаю если на клавиатуру кинуть дополнительный МК,а потом связывать по прерыванию.
дык там микросхема PCF8574 она подключена по I2C если небудет прерывания мне приходится все время опрашивать и занимать I2C шину
тем более воткните внутрь прерывания запустить метод tick, или run для класса. Пусть опросить и вызовет нужный обработчик.
Ну где-то подобное. #4
И сколько раз ты отпросишь ? Я говорю мне свободная I2C нужно так как там много устройств сидят, все время опрашивать микруху не целесообразно, ладно мы отходим от темы тут проблема в коде, которая не хочет компилится
Вопрос закрыт
Ну если вопрос закрыт. то 35 и 44 вызывают утечку памяти. Но если память течет, то сидя на берегу можно увидеть
труп проплывающего врагакрах системыПипец, в instanсe весь класс копируем ради изменения одного флага?
Гасан, с указателями у вас все плохо?
да Вы батенька экстремал )))
Ну если вопрос закрыт. то 35 и 44 вызывают утечку памяти. Но если память течет, то сидя на берегу можно увидеть
труп проплывающего врагакрах системыНе забывайте это контроллер а не программа на ПК, объект создается один раз никакой утечки не будет. ну чтобы успокоить вашу душу добавлю деструктор
пс: http://adatum.ru/pcf8574-kak-legko-uvelichit-chislo-pinov-na-arduino.html последняя программа
пс: http://adatum.ru/pcf8574-kak-legko-uvelichit-chislo-pinov-na-arduino.html последняя программа
Вот именно при включении и отключении прерывании а я не собираюсь отключать и включать
Гасан, что спорить то? Вы для чего сюда пришли - ведь чтобы учиться. Значит слушайте, что вам говорят.
Я понимаю если мне скажут где ошибка почему покажут как делать , а тут просто воздух гоняют одни воздуханы
Ошибки вам давно указали. Не копируйте весь класс по значению, используйте ссылки. Или вы ждете, что кто-то код за вас напишет?