-
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.neostrada.pl!a
tlantis.news.neostrada.pl!news.neostrada.pl!not-for-mail
From: Grzegorz Kurczyk <g...@c...slupsk.pl>
Newsgroups: pl.misc.elektronika
Subject: Re: Problem lekko OT, ale w WinAVR ;-)
Date: Sat, 13 Jun 2009 03:35:54 +0200
Organization: TP - http://www.tp.pl/
Lines: 77
Message-ID: <h0v0bq$jmg$1@nemesis.news.neostrada.pl>
References: <h0qku7$a6o$1@atlantis.news.neostrada.pl>
<h0ud45$219$1@atlantis.news.neostrada.pl> <h0udur$2j2d$1@news.mm.pl>
NNTP-Posting-Host: control.slupsk.pl
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-2; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: nemesis.news.neostrada.pl 1244857530 20176 80.52.170.66 (13 Jun 2009
01:45:30 GMT)
X-Complaints-To: u...@n...neostrada.pl
NNTP-Posting-Date: Sat, 13 Jun 2009 01:45:30 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; PL; rv:1.8.1.21) Gecko/20090403
SeaMonkey/1.1.16
In-Reply-To: <h0udur$2j2d$1@news.mm.pl>
X-Antivirus: avast! (VPS 090612-0, 2009-06-12), Outbound message
X-Antivirus-Status: Clean
Xref: news-archive.icm.edu.pl pl.misc.elektronika:565312
[ ukryj nagłówki ]Użytkownik Zbych napisał:
> Tutaj akurat kompilator ma rację - może przestawiać instrukcje do woli
> póki nie wpływa to na wynik obliczeń (ani cli, ani sei nie wpływa na
> obliczenia, atomowość nie jest brana pod uwagę). Żeby kompilator nie
> wywlekał obliczeń poza sekcję krytyczną trzeba zrobić barierę na
> pamięci. Twój program powinien wyglądać tak:
>
> int GetEncoder(void) {
> asm volatile ("cli":::"memory");
> int e = *pEncoderValue;
> asm volatile ("sei":::"memory");
> return e;
> }
>
> Lepiej będzie jednak jak użyjesz makr zdefiniowanych w pliku atomic.h
>
Pamiętam, że jakaś starsza wersja (chyba z 2006) kompilowała to bez
przestawiania. Funkcja jest z biblioteki, którą napisałem dawno temu i
sprawdzałem kod wynikowy. W wersji WinAVR20090313 faktycznie pomogło
volatile przy definicji wskaźnika int *pEncoderValue. Zaskoczyło mnie,
że volatile może być tu przydatne, bo jednak bardziej służy ono do
lokalnego wyłączenia optymalizacji dotyczącej danej zmiennej, a nie do
zmiany kolejności operacji nie mających nic wspólnego z tą zmienną.
Z punktu widzenia zmiennej *pEncoderValue kod jest tak samo optymalny, a
niemalże identyczny:
int *pEncoderValue;
daje w wyniku:
int GetEncoder(void) {
151c: f8 94 cli
151e: 78 94 sei
1520: e0 91 3a 01 lds r30, 0x013A
1524: f0 91 3b 01 lds r31, 0x013B
1528: 80 81 ld r24, Z
152a: 91 81 ldd r25, Z+1 ; 0x01
152c: 08 95 ret
}
volatile int *pEncoderValue;
daje
int GetEncoder(void) {
1520: f8 94 cli
1522: e0 91 3a 01 lds r30, 0x013A
1526: f0 91 3b 01 lds r31, 0x013B
152a: 20 81 ld r18, Z
152c: 31 81 ldd r19, Z+1 ; 0x01
152e: 78 94 sei
1530: c9 01 movw r24, r18
1532: 08 95 ret
Z drugiej strony taka zmiana sekwencji rozkazów sterujących przez
kompilator wydaje mi się trochę dziwna, bo w pewnych sytuacjach ma ona
wpływ na wartość obliczeń (właśnie aby tego uniknąć blokowałem
przerwania). Idąc tym tropem kompilator mógłby "dojść do wniosku", że
sekwencję:
sbi(PORTB, 1);
sbi(PORTB, 2);
sbi(PORTB, 3);
można zamienić na:
sbi(PORTB, 3);
sbi(PORTB, 2);
sbi(PORTB, 1);
lub jeszcze optymalniej (3 takty zegara zamiast 6) na:
in r24, PORTB
ori r24, 0x0E
out PORTB, r24
bo w sumie efekt końcowy (całkowity wynik operacji) jest ten sam:
wyjścia 1,2 i 3 portu B zostały ustawione w stan wysoki. Tyle, że jeśli
te linie są sygnałami CS/CLK/DATA dla jakiegoś rejestru szeregowego, to
już reszta układu tak samo działać nie będzie. Na szczęście nigdy nie
zauważyłem aby robił takie podmianki :-)
Dzięki serdeczne za podpowiedź.
Pozdrawiam
Grzegorz
Następne wpisy z tego wątku
- 13.06.09 06:43 Grzegorz Kurczyk
- 13.06.09 07:28 Zbych
- 13.06.09 07:44 J.F.
- 13.06.09 14:35 T.M.F.
- 13.06.09 14:36 T.M.F.
- 13.06.09 14:37 T.M.F.
- 13.06.09 10:10 Grzegorz Kurczyk
- 13.06.09 10:10 Zbych
- 13.06.09 10:18 Zbych
- 13.06.09 10:31 Grzegorz Kurczyk
- 13.06.09 10:34 Grzegorz Kurczyk
- 13.06.09 10:35 J.F.
- 13.06.09 11:01 Grzegorz Kurczyk
- 13.06.09 11:24 J.F.
- 13.06.09 11:37 Grzegorz Kurczyk
Najnowsze wątki z tej grupy
- 2,5 x więcej niż Li-Ion
- Tfu! Przeklety prostokąt (czyli UPS i "sinus modyfikowany")
- Dalekopis T100 - problem z powrotem karetki
- Diody LED - oświetlenie na choinkę
- ale wiesz, że są gotowce?
- jak wykryć zapalenie żarówki?
- Cyna dylemat
- Mierniki poziomu glukozy (CGM, FGM)
- A Szwajcarzy kombinują tak: FinalSpark grows human neurons from stem cells and connects them to electrode arrays
- Kontrola nad prądem - sprawdź jak działa [apka - przyp. JMJ] eLicznik
- NETIA i hasło logowania
- Modulacja FM
- Najgorszy język programowania
- Kol. sukces po polsku: firma Szumisie sp. z o.o.
- Chińska Telefonia 6G - Chcą Nas Sterować Elektrycznie - Jak Kukiełki w Teatrze Lalek!!!
Najnowsze wątki
- 2025-12-25 Finlandia przywraca swastykę
- 2025-12-25 Skuteczność wymiaru sprawiedliwości
- 2025-12-24 Felgi
- 2025-12-24 2,5 x więcej niż Li-Ion
- 2025-12-24 No i kolejny ograniczony
- 2025-12-24 Warszawa => Młodszy Specjalista ds. wsparcia sprzedaży <=
- 2025-12-24 New York Times zagrożeniem bezpieczeństwa narodowego USA - POTUS D. Trump
- 2025-12-24 Podżeganie?
- 2025-12-24 => Senior Algorithm Developer (Java/Kotlin) <=
- 2025-12-24 otwarcie drugiej obwodnicy Trójmiasta
- 2025-12-24 Tfu! Przeklety prostokąt (czyli UPS i "sinus modyfikowany")
- 2025-12-23 Prezent dla kierowców od prezydenta Nawrockiego
- 2025-12-23 Warszawa => Asystent ds. Sprzedaży i Rozwoju Klienta <=
- 2025-12-23 Warszawa => Senior IT Recruitment Consultant <=
- 2025-12-22 czy wiedziałeś że?




7 pułapek i okazji - zobacz co cię czeka podczas kupna mieszkania na wynajem