Kodzę w tym arduino ide. Da się jakoś w loop() czekać na przerwanie ? Chcę wysyłać szit jak nastąpi zmiana stanu GPIO ale nie chcę żeby CPU ciągle sprawdzało jakąś zmienną volatile. Wysyłanie w funkcji do obsługi przerwania odpada ze względów oczywistych.
@Scallar: jeśli nie chcesz ani czekać na flagę ani wysyłać z przerwania to musisz użyć RTOSa i wybudzać z poziomu przerwania wątek, który ci wyśle dane.
@Scallar: może zaraz linuxa musi postawić ( ͡°͜ʖ͡°) Zrób w obsłudze przerwania zmienną pomocniczą a w pętli loop sprawdzaj czy się zmieniła, obsłuż przerwanie i zresetuj zmienną. Btw w uproszczeniu RTOS robi to samo tylko systemowo. Jeśli to wysyłanie jest na jakimś nowszym procku możesz spróbować zrobić to przetrwaniu po DMA
chcę wysyłać szit jak nastąpi zmiana stanu GPIO ale nie chcę żeby CPU ciągle sprawdzało jakąś zmienną volatile
@Scallar Rozwiazanie ze zmienna zadziala ale pamietaj o 2 rzeczach, wyrazenia obslugujace zmienna musza byc koniecznie atomiczne inaczej wyjda bzdury. Druga rzecz jest taka ze procesor dalej bedzie caly czas sprawdzal wartosc
@JohnReese: fajnie, że się podzieliłes opinią ale powiedz może czemu? Nie jest znany protokół ani warstwa sprzętowa, czasem jest to bardzo efektywne rozwiązanie jeśli jest zrobione mądrze.
Atomowe, a nie atomiczne swoją drogą. Nie rozumiem tylko po co te atomowe operacje? Jeśli przyjdzie kolejne przerwanie i wywoła się kolejne to w zależności od mechanizmu albo poprzednie będzie przerwane albo to odrzucone. Tak czy siak będzie dobrze póki nie robi złożonych operacji
@Dirrack: Zalozmy na przyklad ze w obsludze przerwan zliczasz przerwania a w loop wykonujesz kod tyle razy ile bylo przerwan wiec najpierw przepisujesz wartosc zmiennej a potem zerujesz ja:
x = interruptcount; interruptcount = 0;
Jesli dojdzie do przerwania pomiedzy tymi linijkami kodu to program to przerwanie calkowice zignoruje.
@JohnReese: widzę, że wiesz, że dzwoni ale nie wiesz, w którym kościele ( ͡°͜ʖ͡°)
Jesli dojdzie do przerwania pomiedzy tymi linijkami kodu to program to przerwanie calkowice zignoruje.
No właśnie zignoruje zawsze, niezależnie od tego czy są to operacje atomowe czy nie. Rzeczywiście, gdyby liczył i dekrementował licznik miało by to znaczenie i mogłoby powodować problemy ze zliczeniem.
No właśnie zignoruje zawsze, niezależnie od tego czy są to operacje atomowe czy nie. Rzeczywiście, gdyby liczył i dekrementował licznik miało by to znaczenie i mogłoby powodować problemy ze zliczeniem.
Nie twierdze ze autor cos takiego robi tylko podalem przyklad o co mi chodzilo. Popraw mnie jesli sie myle ale gdyby obie linijki mozna bylo wykonac jedna instrukcja to problem by nie istnial. Porblem jest taki ze tak sie nie
Da się jakoś w loop() czekać na przerwanie ?
Chcę wysyłać szit jak nastąpi zmiana stanu GPIO ale nie chcę żeby CPU ciągle sprawdzało jakąś zmienną volatile.
Wysyłanie w funkcji do obsługi przerwania odpada ze względów oczywistych.
#esp8266 #arduino #embedded #arduinoide
@Dirrack: Nie szedl bym ta droga.
@Scallar Rozwiazanie ze zmienna zadziala ale pamietaj o 2 rzeczach, wyrazenia obslugujace zmienna musza byc koniecznie atomiczne inaczej wyjda bzdury. Druga rzecz jest taka ze procesor dalej bedzie caly czas sprawdzal wartosc
Atomowe, a nie atomiczne swoją drogą. Nie rozumiem tylko po co te atomowe operacje? Jeśli przyjdzie kolejne przerwanie i wywoła się kolejne to w zależności od mechanizmu albo poprzednie będzie przerwane albo to odrzucone. Tak czy siak będzie dobrze póki nie robi złożonych operacji
@Dirrack: Zalozmy na przyklad ze w obsludze przerwan zliczasz przerwania a w loop wykonujesz kod tyle razy ile bylo przerwan wiec najpierw przepisujesz wartosc zmiennej a potem zerujesz ja:
x = interruptcount;
interruptcount = 0;
Jesli dojdzie do przerwania pomiedzy tymi linijkami kodu to program to przerwanie calkowice zignoruje.
A tak poza tym to
No właśnie zignoruje zawsze, niezależnie od tego czy są to operacje atomowe czy nie. Rzeczywiście, gdyby liczył i dekrementował licznik miało by to znaczenie i mogłoby powodować problemy ze zliczeniem.
Nie twierdze ze autor cos takiego robi tylko podalem przyklad o co mi chodzilo. Popraw mnie jesli sie myle ale gdyby obie linijki mozna bylo wykonac jedna instrukcja to problem by nie istnial. Porblem jest taki ze tak sie nie
https://kevinstadler.github.io/notes/esp8266-deep-sleep-light-sleep-arduino/