Cześć.
Na stronie o przerwaniach zewnętrznych http://akademia.nettigo.pl/arduino_przerwania/
jest napisane coś takiego
"Zwróć uwagę na problem komunikacji w drugą stronę. Jeżeli program w loop miałby zmieniać wartość zmiennych używanych przez funkcję obsługującą przerwania, to warto zapewnić by przerwanie nie zaskoczyło programu w momencie modyfikacji zmiennej. Jeżeli jest to operacja złożona z więcej niż jednej komendy kodu maszynowego procesora, może się zdarzyć, że przerwanie zostanie wywołane "pośrodku" i jako rezultat stan zmiennej będzie błędny."
Ale z operacjami atomowymi już z czymś podobnym się spotkałem w javie
https://www.samouczekprogramisty.pl/watki-w-jezyku-java/
tu piszą
"Tutaj należy Ci się kolejne wyjaśnienie. Operacja atomowa to taka operacja, która jest niepodzielna. Operacja atomowa realizowana jest przy pomocy jednej instrukcji w bytecode (w skompilowanej klasie). Operacja value += 1 nie jest operacją atomową, jest ona równoważna z value = value + 1. Wykonanie tej operacji składa się z kilku kroków:
a)pobrania aktualnej wartości value do zmiennej tymczasowej (niewidocznej w kodzie źródłowym)5,
b)dodania 1 do zmiennej tymczasowej,
c)przypisanie powiększonej wartości do value."
Zastanawiam czy czy ta zmienna w przerwaniu będzie błędna w sensie, że np zamiast 1 będzie 99992323 czy w takim sensie błędna że nie aktualna(volatile nie pomoże w tym przypadku).(w przerwaniu tylko odczyta się zmienną globalną).
Celowo podaję że zmienna w przerwaniu nie jest modyfikowana bo jak by chyba wystąpi chyba to samo zjawisko opisane na stronie o javie.?
Na stronie o przerwaniach zewnętrznych http://akademia.nettigo.pl/arduino_przerwania/
jest napisane coś takiego
"Zwróć uwagę na problem komunikacji w drugą stronę. Jeżeli program w loop miałby zmieniać wartość zmiennych używanych przez funkcję obsługującą przerwania, to warto zapewnić by przerwanie nie zaskoczyło programu w momencie modyfikacji zmiennej. Jeżeli jest to operacja złożona z więcej niż jednej komendy kodu maszynowego procesora, może się zdarzyć, że przerwanie zostanie wywołane "pośrodku" i jako rezultat stan zmiennej będzie błędny."
Ale z operacjami atomowymi już z czymś podobnym się spotkałem w javie
https://www.samouczekprogramisty.pl/watki-w-jezyku-java/
tu piszą
"Tutaj należy Ci się kolejne wyjaśnienie. Operacja atomowa to taka operacja, która jest niepodzielna. Operacja atomowa realizowana jest przy pomocy jednej instrukcji w bytecode (w skompilowanej klasie). Operacja value += 1 nie jest operacją atomową, jest ona równoważna z value = value + 1. Wykonanie tej operacji składa się z kilku kroków:
a)pobrania aktualnej wartości value do zmiennej tymczasowej (niewidocznej w kodzie źródłowym)5,
b)dodania 1 do zmiennej tymczasowej,
c)przypisanie powiększonej wartości do value."
Zastanawiam czy czy ta zmienna w przerwaniu będzie błędna w sensie, że np zamiast 1 będzie 99992323 czy w takim sensie błędna że nie aktualna(volatile nie pomoże w tym przypadku).(w przerwaniu tylko odczyta się zmienną globalną).
Celowo podaję że zmienna w przerwaniu nie jest modyfikowana bo jak by chyba wystąpi chyba to samo zjawisko opisane na stronie o javie.?