Ok w takim razie podam ci prościej tylko w narzeczu AVR GCC
- zobacz:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
innymi słowy - pomyśl sobie, jeśli robisz jakieś obliczenia, które wykonywane są w co najmniej kilku cyklach zegarowych, a w tym czasie może dojść do przerwania, które operuje na jednej ze zmiennych, to mogłoby dojść do katastrofy. Tu masz taką zmienną ed, która jest zmieniana w przerwaniu, więc można byłoby to najprościej zapisać tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
no ale tu jesteśmy ZAWSZE akurat pewni że w trakcie działają przerwania, co by jednak było gdyby te przerwania w różnych miejscach programu były włączane/wyłączane itp .....
to mogłoby się okazać, że dobra - wyłączyłeś je na czas obliczeń
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ale jak teraz dasz sei() to na SIŁĘ włączasz znowu globalne - a może w tym czasie one nie były włączone ? i nie mają być bo tak wynika z kontekstu programu ? to co ? to będzie BUM!
i dlatego ja skorzystałem ze sprzętowego rejestru SREG, który przechowuje sprzętową flagę globalnego zezwolenia na przerwania, a zatem, najpierw sobie zapamiętuję wartość tego rejestru SREG w zmiennej sreg
sreg = SREG;
następnie zatrzymuję przerwania (nie ważne czy były włączone czy nie)
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
robię obliczenia
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i teraz nie daję sei() tylko przywracam wartość sprzętowego rejestru SREG sprzed operacji
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
dzięki temu jeśli wcześniej była ustawiona flaga zezwolenia na globalne przerwania to znowu zostanie przywrócona - to samo zresztą robi rozkaz sei()
ale jeśli jej (tej flagi) nie było ustawionej - to nic się nie stanie a ja nie wymuszę niechcący takiego zezwolenia.
i DOKŁADNIE to samo robi konstrukcja:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
mechanizm tego jest identyczny jak ja napisałem z tą zmienną sreg i rejestrem SREG
co jest w rejestrze SREG ?
no nie przesadzaj wystarczy spojrzeć do noty PDF - przecież jest opisany bit po bicie