Wpis z mikrobloga

#arduino #esp32 #cpp #programowanie

Na desktopie piszę tak i mi działa (inb4 stdio.h w C++, nie ma to znaczenia dla przykładu)

#include
template
void handler(void)
{
  printf("handler %d\n", p);
}

void call(void (*f)(void))
{
  f();
}

int main()
{
  call(handler<8>);
  return 0;
}

Na ESP32 w Arduino (inb4 pisanie w arduino - projekt już w tym jest napisany, nie zależy to ode mnie) dostaję

error: no matches converting function 'ButtonInterruptHandler' to type 'void (*)()'
attachInterrupt(pin, ButtonInterruptHandler, FALLING);

note: candidate is: template void ButtonInterruptHandler()
void ButtonInterruptHandler(void)

Może jest jakiś lepszy sposób? Muszę wiedzieć z którego pinu idzie przerwanie.
  • 12
@zwei: jakiś przedpotopowy kompilator? (po błędach wygląda jak gcc ale może jakaś wersja z XIX wieku albo opcji typu -std=c++11 mu brakuje). na moje oko powinno działać, ale jak chcesz handler a nie doktoryzować się czemu nie robi, to może po prostu:

void handler8() {
handler<8>();
}

itp. dla poszczególnych pinów. jak ich masz 100, to

#define PIN_HANDLER(pin) void handler ## pin() { handler(); }
(sklejanie tokenów przez ## nie do
@zwei: podobno preprocessor arduino psuł te deklaracje jeśli nie były w jednej linii i to wystarczało żeby to naprawić. a nie masz czasem wyboru w IDE którego standardu c++ chcesz użyć? już nie pamiętam czy była taka opcja
@zwei: Arudino avr kompiluje z avr-g++ gdzie chyba obecnie działa coś jak c++11. (mogę się mylić). Ale to na 100% kompilator C++.
Arduino due wywołuje gcc, to znaczy projekt jest kompilowany jak projekt w C (99?). (Due ma cortexa m3). Podejrzewam więc, że esp32 na arduino ide śmiga w C. Ale to tylko takie moje nocne widzimisię.