Witam
W ostatnim czasie próbuję zapoznać się bliżej z procesorem ATxmega64B3. W ramach testów zająłem się tematem flag (czyli zmiennych bitowych), które mogą być zmieniane zarówno w pętli głównej jak i w przerwaniach. Jak wiadomo temat ten ściśle związany jest z zagadnieniem zapisu/odczytu atomowego. Ponieważ bitowy zapis/odczyt atomowy najłatwiej jest podobno uzyskać poprzez dostęp do rejestrów GPIORx (gdyż umieszczone w przestrzeni IO procesora) postanowiłem przetestować tę ścieżkę i porównać praktykę z teorią opisaną m.in w książce "Język C dla mikrokontrolerów AVR"
Postanowiłem przetestować dwa rozwiązania:
Rozwiązanie 1 - dostęp do GPIORx za pomocą makrodefinicji:
Jak widać na przedstawionych rozwinięciach tylko przy włączonej optymalizacji uzyskujemy atomowy zapis bitu do rejestru GPIOR0 (zapis za pomocą jednej instrukcji sbi). Gdy optymalizacja jest wyłączona zapis bitu do GPIOR0 wymaga dwóch operacji na rejestrze r18 (odczyt + modyfikacja). Nie jest więc to operacja atomowa.
Rozwiązanie 2 - dostęp do GPIORx za pomocą wskaźnika:
W tym rozwiązaniu otrzymałem jeszcze bardziej zaskakujące rezultaty. Zarówno przy włączonej jak i wyłączonej optymalizacji zapis bitu do rej. GPIOR0 nie jest atomowy.
Oba przykłady zaczerpnięte są z w/w książki. Mam świadomość, że książka opisuje procesory ATmega a nie ATxmega, ale wydaje mi się, że w tym temacie sa one zgodne.
Proszę o jakieś sugestie i komentarze, ponieważ jest to temat bardzo istotny. W książce przy opisie rozwiązania 2 wyraźnie pisze w ramce, że dostęp do tak zdefiniowanych flag odbywa się atomowo !!! Coś więc tutaj się nie zgadza. Być może ja robię jakiś błąd? A może w ATxmega należy postępować inaczej przy dostępie do GPIORx? Tylko dlaczego w takim razie w rozwiązaniu 1 przy włączonej optymalizacji jest OK?
Wszystkie przykłady wykonałem za pomocą najnowszej wersji środowiska ATMEL STUDIO 6.
Pozdrawiam i dziękuję z góry za opinie
W ostatnim czasie próbuję zapoznać się bliżej z procesorem ATxmega64B3. W ramach testów zająłem się tematem flag (czyli zmiennych bitowych), które mogą być zmieniane zarówno w pętli głównej jak i w przerwaniach. Jak wiadomo temat ten ściśle związany jest z zagadnieniem zapisu/odczytu atomowego. Ponieważ bitowy zapis/odczyt atomowy najłatwiej jest podobno uzyskać poprzez dostęp do rejestrów GPIORx (gdyż umieszczone w przestrzeni IO procesora) postanowiłem przetestować tę ścieżkę i porównać praktykę z teorią opisaną m.in w książce "Język C dla mikrokontrolerów AVR"
Postanowiłem przetestować dwa rozwiązania:
Rozwiązanie 1 - dostęp do GPIORx za pomocą makrodefinicji:
Kod: C / C++
Jak widać na przedstawionych rozwinięciach tylko przy włączonej optymalizacji uzyskujemy atomowy zapis bitu do rejestru GPIOR0 (zapis za pomocą jednej instrukcji sbi). Gdy optymalizacja jest wyłączona zapis bitu do GPIOR0 wymaga dwóch operacji na rejestrze r18 (odczyt + modyfikacja). Nie jest więc to operacja atomowa.
Rozwiązanie 2 - dostęp do GPIORx za pomocą wskaźnika:
Kod: C / C++
W tym rozwiązaniu otrzymałem jeszcze bardziej zaskakujące rezultaty. Zarówno przy włączonej jak i wyłączonej optymalizacji zapis bitu do rej. GPIOR0 nie jest atomowy.
Oba przykłady zaczerpnięte są z w/w książki. Mam świadomość, że książka opisuje procesory ATmega a nie ATxmega, ale wydaje mi się, że w tym temacie sa one zgodne.
Proszę o jakieś sugestie i komentarze, ponieważ jest to temat bardzo istotny. W książce przy opisie rozwiązania 2 wyraźnie pisze w ramce, że dostęp do tak zdefiniowanych flag odbywa się atomowo !!! Coś więc tutaj się nie zgadza. Być może ja robię jakiś błąd? A może w ATxmega należy postępować inaczej przy dostępie do GPIORx? Tylko dlaczego w takim razie w rozwiązaniu 1 przy włączonej optymalizacji jest OK?
Wszystkie przykłady wykonałem za pomocą najnowszej wersji środowiska ATMEL STUDIO 6.
Pozdrawiam i dziękuję z góry za opinie
