Kod o którym mówimy w C wygląda następująco
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
co daje nam taki wynik po skompilowaniu:
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
w linii 70 pobieramy aktualną wartość portu do rejestru r24, wykonujemy operacje na rejestrze i dopiero w 74 zapisujemy wynik z rejestru do portu. Robimy ponownie to samo w 76 ..7a a następnie skaczemy (wracamy) do 70. I tak w kółko.
Gdy przerwanie wyzwoli się nam po pobraniu wartości z portu w 70 ale przed 74 oraz po 76 ale przed 7a, to wpiszemy do portu wartość już nie aktualną, bo przerwanie nam przecież ją zmieniło i powinna być inna.
Przerwanie przed 72, 74, 78, 7a powoduje problem a przerwanie przez 70, 76, 7c nie powoduje. Ale jak widać szansa na problem to 4/7, czyi ponad 57%
Jak damy delay, który ma do wykonania np. 993 instrukcji w swoim przebiegu, to szansa wystąpienia problemu to 4/1000, czyli 0,4%
I już tego nie zauważamy. Choć problem jest nadal. Dlatego ten delay to maskowanie problemu i sposób na prezentację przyczyny problemu a nie jego rozwiązanie.
Oczywiście dla rozwiązania należy użyć operacji w ATOMIC_BLOCK.
--
Pozdrawiam,
Robert
------------------------ [ Dodano po: 5 minutach ]Cytuj:
Oczywiście macie racje.
Ja się tu męczę a to już nie trzeba udowadniać