Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 18 lis 2024, o 22:47


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
 Tytuł: ATOMIC_BLOCK
PostNapisane: 28 lis 2013, o 11:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 sty 2013
Posty: 80
Lokalizacja: Trzciniec
Pomógł: 0

Jaka jest zasada umieszczania operacji w bloku ATOMIC_BLOCK? Czy jeżeli w programie występują przerwania to na każdej zmiennej powyżej uint8_t?

_________________
Zło dobrem zwyciężaj.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 11:08 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27308
Lokalizacja: Szczecin
Pomógł: 1041

panbosman napisał(a):
Jaka jest zasada umieszczania operacji w bloku ATOMIC_BLOCK? Czy jeżeli w programie występują przerwania to na każdej zmiennej powyżej uint8_t?


Na każdej ? ;) a jaki w tym widzisz sens ?

na takiej, która może być również zmieniana w przerwaniu ... bo wtedy może dojść do rozjechania się jej wartości ....

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 12:13 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Ja to widzę tak.
Każda zmienna występująca zarówno w przerwaniu i poza przerwaniami volatile oraz wszystkie działania z udziałem takich zmiennych realizowane w więcej niż jednym rozkazie w bloku ATOMIC_BLOCK. To drugie dotyczy również zmiennych uint8_t jeżeli są zaprzęgnięte do operacji coś więcej niż proste zapisanie do portu. Poprawcie, jeśli się mylę.


Autor postu otrzymał pochwałę

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 12:25 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27308
Lokalizacja: Szczecin
Pomógł: 1041

perlon napisał(a):
Poprawcie, jeśli się mylę.


Nie mylisz się

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 12:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 sty 2013
Posty: 80
Lokalizacja: Trzciniec
Pomógł: 0

Cytuj:
realizowane w więcej niż jednym rozkazie

Są gdzieś opisane takie rozkazy(nie atomowe)?

_________________
Zło dobrem zwyciężaj.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 12:56 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27308
Lokalizacja: Szczecin
Pomógł: 1041

panbosman napisał(a):
Są gdzieś opisane takie rozkazy(nie atomowe)?


tak w asemblerze, jak zajrzysz do pliku *.lss po kompilacji

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 13:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 sty 2013
Posty: 80
Lokalizacja: Trzciniec
Pomógł: 0

Piszcie do mnie bardziej łopatologicznie bo nie kumam.
Widzę, że z tym całym programowaniem to jak z wyjściem do lasu. Wchodzi się a tu coraz więcej drzew, krzaczory i chce się do domu. To chyba tylko dla twardzieli.

ps.
Oczywiście, że zajrzałem do pliku .lss.
Jak wrócę do domu to poczytam sobie coś na ten temat, a na razie maliny z kolcami.

Dla przykładu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

a w main.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to powinien być ATOMIC_BLOCK dla tego w main.c ?

_________________
Zło dobrem zwyciężaj.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 13:50 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27308
Lokalizacja: Szczecin
Pomógł: 1041

Wiesz można iść do lasu i przejść go za pierwszym razem bez łażenia po malinach z kolcami ? po co się rzucać od razu na dżunglę ?

to tak jakbyś chciał od razu w jedną noc, w jedną sesję nauczyć się wszystkiego od razu - no przy takim podejściu to nie dziwię się, że może się odechcieć .... Zasada uczenia jest dość prosta - małymi kroczkami panie , małymi kroczkami

Zostaw więc na razie atomic_block i asemblera - tylko zajmij się zrozumieniem podstaw , tego co się dzieje w tym kodzie .....

Później przyjdzie czas na atomic_block i ew asemblera ...

albo może i przyjdzie szybciej gdy np zauważysz w swoim projekcie że coś nie HALO .... wtedy łatwiej jest myśleć o tym w szczegółach.

Zapewniam cię, że jeśli jesteś jeszcze na początku tej drogi to w swoich pierwszych ćwiczeniach długo nie będzie ci potrzebne atomic_block

------------------------------

wracając do twojego pytania:

panbosman napisał(a):
to powinien być ATOMIC_BLOCK dla tego w main.c ?


Nie - tu nie trzeba atomic_block bo zmienna sekunda jest uint8_t i zapis do takiej zmiennej w postaci stałej - jest atomowy (czyli wykonywany w jednym cyklu zegarowym w jednym poleceniu asemblera)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 13:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 sty 2013
Posty: 80
Lokalizacja: Trzciniec
Pomógł: 0

ok. A jeśli by była uint16_t to już w bloku?
Dla poprawnego działania programu trzeba tak postąpić z każdą zmienną większą od uint8_t, którą zmieniamy w przerwaniu oraz gdzieś w innym miejscu?

Cytuj:
To drugie dotyczy również zmiennych uint8_t jeżeli są zaprzęgnięte do operacji coś więcej niż proste zapisanie do portu

co autor miał na myśli o operacji "coś więcej" ?

Więcej już dziś nie będę się pytał. Idę się przejść do lasu. :)

_________________
Zło dobrem zwyciężaj.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 14:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 08 mar 2013
Posty: 236
Lokalizacja: Warszawa
Pomógł: 5

tak dla 16 bitowej trzeba wykorzystac wtedy atomic. jeśli masz zmienna jednobajtową to nie trzeba.
Pisze to co ostatnio sie dowiedziałem.

Kodu nie umieszczę, nie mój, ale w uart jest cos takiego do obsługi jakiegoś lasera:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 14:19 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27308
Lokalizacja: Szczecin
Pomógł: 1041

Jeśli masz zmienną jednobajtową to nie ale ....

zawsze jest hmmm bywa jakieś ale .... np gdy w jednej linii w C masz jakąś operację większą na tej zmiennej np maskowanie i zmiana niektórych bitów to już może się to nie skompilować w asm - atomowo i wtedy może zajść potrzeba. Aczkolwiek to też jest po prostu sztuka by odpowiednio ułożyć kod w C ...

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 16:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 08 mar 2013
Posty: 236
Lokalizacja: Warszawa
Pomógł: 5

Ja tam słabo się znam, ale tez mi powiedziano co ty napisałeś, że dla początkującego to nie potrzebne, tylko usłyszałem: "Nie trzeba, bo zmienna jest jednobajtowa".

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2013, o 19:21 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Prosty przykład stopera na wyświetlaczu LCD. Chcesz pokazać międzyczas ale tak, żeby czas był równany do prawej. Jeżeli liczba sekund jest mniejsza od 10 ustaw na pozycji 5, w przeciwnym przypadku ustaw na pozycji 4. Wyświetl ilość sekund. Gdzie wyświetli się ilość sekund jeżeli po warunku sprawdzającym a przed wysłaniem na LCD timer przerzuci liczbę sekund z 9 na 10? Oczywiście rozwiązaniem byłoby odłożenie do innej zmiennej liczby sekund, ale załóżmy że korzystamy tylko ze zmiennej volatile sekundy. Przykład troche kombinowany ale pokazuje że nawet zmienne uint8_t czasami trzeba zamykać w ATOMIC_BLOCK.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2013, o 00:59 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27308
Lokalizacja: Szczecin
Pomógł: 1041

Paul Dirac napisał(a):
Ja tam słabo się znam, ale tez mi powiedziano co ty napisałeś, że dla początkującego to nie potrzebne, tylko usłyszałem: "Nie trzeba, bo zmienna jest jednobajtowa".


Kompletnie nie rozumiem co chciałeś przez to powiedzieć - ale jeśli cię trapi to że proponuję aby zostawić to na później jak się jest początkującym i jeśli uważasz że po prostu zbywam cię albo kogoś taką odpowiedzią - to może zamiast tak pisać - jednak weź się równolegle za naukę asemblera - to nie trudne - wtedy o wiele łatwiej sam zrozumiesz albo łatwiej będzie ci to wyjaśnić. Nie oczekuj, że pewne bardziej skomplikowane zagadnienia bez znajomości podstaw np ASM da się wyjasnić w 2 albo 3 zdaniach. Być może mocno z czegoś nie zdajesz sobie sprawy ...

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2013, o 10:41 

Pomógł: 0

Ha! Jeszcze nie ma południa a ja już nauczyłem się czegoś nowego :)

Wydaje mi się, że dosyć sympatyczny przykład, kiedy (m.in.) korzystać z ATOMIC_BLOCK jest podany w dokumentacji avr-libc: http://www.nongnu.org/avr-libc/user-man ... tomic.html.

Swoją drogą zrodziło się w mojej głowie małe pytanie: a czym to się właściwie różni od trywialnego wyłączenia globalnej flagi "interrupt'ów"?


Autor postu otrzymał pochwałę


Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2013, o 13:34 

Pomógł: 0

@squeez dzięki za wyjaśnienie. Jeszcze jedno małe "coś" do potwierdzenia:
squeez napisał(a):
Domyślnie ATOMIC_RESTORESTATE jest równoznaczne z kodem powyżej, czyli: zapamiętanie flagi SREG, wyłączenie przerwań, wykonanie "krytycznego" kodu, przywrócenie flagi i włączenie przerwań.

Przywrócenie SREG'a i włączenie przerwań wpisałeś jako dwa osobne punkty, ale włączenie przerwań wystąpi tylko jeżeli przerwania były włączone (masło maślane) przed początkiem Atomowego Bloka - dobrze zrozumiałem czy coś naciągam :) ?



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2013, o 16:55 

Pomógł: 0

Ok już wszystko jest jasne. Jeszcze raz dzięki :)



Góra
  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO