Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Zasady pisania programów pseudowielowątkowych na małych proc

janbernat 30 Wrz 2010 15:46 13787 103
  • #31 30 Wrz 2010 15:46
    94075
    Użytkownik usunął konto  
  • CControls
  • #32 30 Wrz 2010 15:49
    sulfur
    Poziom 24  

    nsvinc napisał:
    albertb napisał:
    Musi być ulotna? Wytłumacz dlaczego, przecież jej w przerwaniu nie modyfikuję?

    Ale ją tam czytasz! Procki bankujące rejestry lub posiadające oddzielny stos dla przerwań zmienną nieulotną wrzucą na taki stos albo zostanie w zbankowanym rejestrze. I nigdy się wartość tej zmiennej nie uaktualni (bo po co, skoro nie jest ona ulotna, to nie trzeba w kółko dokonywać dereferencji i marnować instrukcje)...
    Nie uaktualni, bo i po co ? Jak najbardziej słusznie. Gdyby tam zamiast if było while, to byłby problem. A tak, przerwanie pobierze wartość z pamięci, jak pasuje to wejdzie w ifa, jak nie to pójdzie dalej, wyjdzie z przerwania i tyle.

    nsvinc napisał:
    Z punktu widzenia przerwania pętla główna modyfikuje zmienną w losowym momencie, a z punktu widzenia pętli głównej - robi to przerwanie.
    A każda zmienna która zmienia swoją wartość w losowym momencie musi być zaznaczona jako ulotna, żeby kompilator zawsze pobierał z pamięci jej najaktualniejszą wartość.
    Przytoczona zmienna o nazwie kolejka_r nie jest modyfikowana w przerwaniu w żadnym momencie z żadnego punktu widzenia.

  • #33 30 Wrz 2010 15:57
    94075
    Użytkownik usunął konto  
  • #34 30 Wrz 2010 16:36
    nsvinc
    Poziom 35  

    Ehhh...

    albertb napisał:
    Mi nie pozwalasz w przerwaniu użyć zmiennej nieulotnej do odczytu, a sam taką modyfikujesz (kolejka_w).

    Nie, nie tak. Zauważ, że pętla główna nie dotyka zmiennej kolejka_w!! Wyraznie zaznaczyłem, że kolejka_r i kolejka_w ulotne nie muszą być, bo nie wymieniają one wartości pomiędzy przerwaniem a main.

    U ciebie kolejka_r jest zmieniana w petli głównej a odczytywana w przerwaniu.
    Jeśli main i przerwanie użyją takiego samego kodu (tego w asmie, po wywaleniu "modify" i "write" w przerwaniu), to wszystko będzie działać. I oczywiście zakładamy gwarancję atomiczności operacji RMW na tej zmiennej w pętli głównej. Ale żeby w przerwaniu kompilator taki kod zastosował, musisz mu uświadomić, że nie ma sobie gdzieś chować wartości kolejka_r tylko konsekwentnie pobierał z pamięci jej nową, najaktualniejszą wartość. I to sie robi poprzez volatile...

    sulfur napisał:
    Przytoczona zmienna o nazwie kolejka_r nie jest modyfikowana w przerwaniu w żadnym momencie z żadnego punktu widzenia.

    Racja. Nie jest modyfikowana w przerwaniu. Ale z punktu widzenia przerwania zmienna kolejka_r jest modyfikowana w losowym momencie (bo w pętli głównej), więc to przerwanie musi pracować na najaktualniejszej wartości zmiennej, a nie na zbankowanej/wrzuconej kiedyśtam na stos wartości...

  • CControls
  • #35 30 Wrz 2010 16:52
    szelus
    Specjalista - Mikrokontrolery

    nsvinc napisał:

    sulfur napisał:
    Przytoczona zmienna o nazwie kolejka_r nie jest modyfikowana w przerwaniu w żadnym momencie z żadnego punktu widzenia.

    Racja. Nie jest modyfikowana w przerwaniu. Ale z punktu widzenia przerwania zmienna kolejka_r jest modyfikowana w losowym momencie (bo w pętli głównej), więc to przerwanie musi pracować na najaktualniejszej wartości zmiennej, a nie na zbankowanej/wrzuconej kiedyśtam na stos wartości...

    Nie masz racji. W czasie, gdy chodzi przerwanie pętla główna jest wstrzymana, więc nie może zmodyfikować tej zmiennej. Zatem, z punktu widzenia przerwania, zmienna nie jest ulotna. Może zmienić się tylko pomiędzy jednym wywołaniem obsługi przerwania a następnym. Nawet jeżeli przerwanie ma swój stos, czy bank rejestrów, to ponieważ obsługa przerwania jest oddzielną funkcją kompilator nie może "przechować" wartości pomiędzy wywołaniami.

  • #36 30 Wrz 2010 18:20
    sulfur
    Poziom 24  

    nsvinc napisał:
    [...] więc to przerwanie musi pracować na najaktualniejszej wartości zmiennej, a nie na zbankowanej/wrzuconej kiedyśtam na stos wartości...


    Bzdury kompletne kolega wypisuje.

    Code:
    #include<avr/io.h>
    
    #include<avr/interrupt.h>

    char x = 0;

    ISR(INT0_vect)
    {
      static char asdf = 0;

      if (x == 1)
        asdf++;
    }

    int
    main()
    {
      return 0;
    }


    Code:
    ISR(INT0_vect)
    
    {
      5e:   1f 92          push   r1
      60:   0f 92          push   r0
      62:   0f b6          in   r0, 0x3f   ; 63
      64:   0f 92          push   r0
      66:   11 24          eor   r1, r1
      68:   8f 93          push   r24
      static char asdf = 0;

      if (x == 1)
      6a:   80 91 60 00    lds   r24, 0x0060
      6e:   81 30          cpi   r24, 0x01   ; 1
      70:   29 f4          brne   .+10        ; 0x7c <__vector_1+0x1e>
        asdf++;
      72:   80 91 61 00    lds   r24, 0x0061
      76:   8f 5f          subi   r24, 0xFF   ; 255
      78:   80 93 61 00    sts   0x0061, r24
    }
      7c:   8f 91          pop   r24
      7e:   0f 90          pop   r0
      80:   0f be          out   0x3f, r0   ; 63
      82:   0f 90          pop   r0
      84:   1f 90          pop   r1
      86:   18 95          reti


    Cytat:
    avr-gcc (WinAVR 20081205) 4.3.2
    Copyright (C) 2008 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.



    Identycznie wygląda kod w tym wypadku, gdy zmienna jest ze specyfikatorem volatile. Proszę przedstawić kod na potwierdzenie swojej teorii.

  • #37 30 Wrz 2010 19:06
    nsvinc
    Poziom 35  

    Czy AVR jest przypadkiem procesora który ma oddzielny stos dla przerwań i/lub bankowane rejestry dla przerwań? Chyba nie, patrząc na te push i pop...

    Jak na AVR ma sie taki kod skompilować w co innego, skoro procek nie ma gdzie odłożyć sobie wartości zmiennej x w ISRrze?

    Nie mam pod ręką procka który by miał ficzery o których pisałem, a które mogłyby spowodować dziwną pracę kodu, więc nie dysponuję przykładem.

  • #38 30 Wrz 2010 19:13
    94075
    Użytkownik usunął konto  
  • #39 30 Wrz 2010 19:51
    nsvinc
    Poziom 35  

    Nawet jeśli macie rację, to w czym? W braku konieczności dopisania "volatile" do deklaracji zmiennej?.... Ja nie mówie, że wy nie macie racji, a tylko zakładam, że możecie jej nie mieć gdy traficie na procesor który sobie gdzieś zbunkruje wartość zmiennej i nie będzie raczył jej odświeżać, bo kompilatorowi nie zostało wskazane, że ma to robić. Jasne jest że każdy programista pisze inaczej. Ja po prostu z pełną konsekwencją uzywałbym zmiennych volatile gdybym miał implementować kolejkę wg. waszego algorytmu...

  • #40 30 Wrz 2010 19:55
    sulfur
    Poziom 24  

    nsvinc napisał:
    Czy AVR jest przypadkiem procesora który ma oddzielny stos dla przerwań i/lub bankowane rejestry dla przerwań? Chyba nie, patrząc na te push i pop...
    Jak na AVR ma sie taki kod skompilować w co innego, skoro procek nie ma gdzie odłożyć sobie wartości zmiennej x w ISRrze?
    Nie mam pod ręką procka który by miał ficzery o których pisałem, a które mogłyby spowodować dziwną pracę kodu, więc nie dysponuję przykładem.


    Ale ja nie napisałem, że jakieś z tego zachodzi. Ja tylko podałem kod potwierdzający moje twierdzenie. Nie uważam się za najmądrzejszego i chętnie przyznam koledze rację. Proszę tylko w wskazanie kompilatora, który w obsłudze przerwania przy zmiennej globalnej nie pobierze jej z pamięci tylko ze stosu lub jakiegoś zbankowanego rejestru. W innym wypadku będzie to tylko teoria. Prawdopodobnie zagląda tu więcej osób niż się wypowiada, więc gdyby ktoś znał taki kompilator, to proszę go wskazać.

  • #41 30 Wrz 2010 20:00
    94075
    Użytkownik usunął konto  
  • #42 30 Wrz 2010 20:09
    nsvinc
    Poziom 35  

    Ale....to nie jest ficzer kompilatora, a rdzenia! Niech Kolega zauważy, że pewne myki mogą się wykonać na jednych rdzenia tak, na innych inaczej. Skoro sam procesor nie daje możliwości "zbunkrowania" gdzieś wartości zmiennej, to kompilator nie będzie próbował tego robić....
    W ogóle nie chodzi o kompilator. Wszyscy wiemy, jak on działa.

    Wyobraźmy sobie sytuację - co zrobi dobry kompilator, gdy - świadomy możliwości przetrzymania wartości w rejestrze (bo przykładowy rdzeń bankuje rejestry dla przerwań) - dostanie taki kod? Będzie on za wszelką cenę odświeżał wartość zmiennej (ekstra instrukcja) nawet gdy mu nie wskazano, że ma to robić?

    Na CM3 jest dokładnie tak samo, jak na AVRku -w tym przypadku- zawsze pobierany jest adres i zawsze przy wejściu do ISRa kompilator zawsze grzecznie aktualizuje wartość zmiennej, tj. pobiera spod adresu do rejestru. Nie wiem co by zrobił, gdybym skompilował na np. LPC3250 (oddzielny stos przerwań) albo jakis inny rdzen z serii MIPS32 który bankuje rejestry (a zdaje się że CR4(F) tez to obsługuje)... A mam podstawy obawiać się o to w momencie gdy napiszę soft wg. Waszego algorytmu a potencjalnie program raz na tydzien pojdzie w krzaki...Dlatego wolę dopisać głupie "volatile" i mam pewność :]

    albertb napisał:
    Konieczny dostęp do zmiennej, która nie została zmodyfikowana w sposób nie znany programowi MUSI dawać jej aktualną wartość. Inaczej nie byłbyś w stanie WOGOLE pisać w C.

    Dyskutujemy o przypadku, gdzie kompilator nie jest w stanie przewidzieć, kiedy zmienna się zmieni - ponieważ przerwanie może wystąpić w losowym momencie.
    Kompilator nie będzie mądrzejszy od Ciebie (to nie bascom!) i zrobi to co każesz, a deklarując zmienną jako nieulotną nie każesz mu konsekwentnie dokonywać przeładowania zmiennej...

  • #43 30 Wrz 2010 20:42
    94075
    Użytkownik usunął konto  
  • #44 30 Wrz 2010 20:54
    nsvinc
    Poziom 35  

    Ale w twoim przypadku konieczna jest atomiczność modyfikacji zmiennej kolejka_r w petli głównej. Nadal twierdzisz że nie?...

    Czy C nie jest zależny od sprzętu?? Hehe już widzę jak kompilator kompiluje ifa do IT EQ na AVRku :P I ciekawe ile z tej instrukcji ten AVRek zrozumie. oczywiście że to, w co kompiluje się kod w C jest zależne i od kompilatora, i od sprzętu!! Inaczej JAK kompilator dobrałby instrukcje?...

    OK. Powiedz mi W JAKICH SYTUACJACH kompilator uzyje ficzera bankowania rejestrów w procku? Masz do tego jakis __attribute__?? A może telepatycznie mu przekazujesz, które zmienne moze przechowywać w zbankowanych rejestrach, a które nie? Skoro WY wiecie wszystko, to jak wygądałby wg. Was kod, w którym byłaby zmienna nie wymagająca odświeżania, taka, która mogłaby sobie wegetować w zestawie rejestrów przerwania?... Jak zostałoby to odróznione od zmiennej, którą trzeba odświeżać?...

    albertb napisał:
    Jeśli są to napisz jakie a nie bujaj w obłokach.

    O, zaczynasz walke o assember :] Proszę bardzo:

    Code:

    //..-O3, -Otime
    LDR r0,[pc,#16]
    LDRH r1, [r0,#0x00]
    CMP r1,#0x00
    ITTT NE
    LDRHNE r1,[r0,#0x02]
    ADDNE r1,r1,#1
    STRNE r1,[r0,#0x02]


    Code:

    //-O0
    LDR r0,[pc,#20]
    LDRH r0, [r0.#0x00]
    CBZ r0,0x80001D0 //to ten skok, ktory normalnie skompilowałby sie w ITTT
    LDR r0,[pc,#20]
    LDRH r0,[r0,#0x00]
    ADDS r0,r0,#1
    LDR r1,[pc,#12]
    STRH r0,[r1,#0x00]


    C:
    Code:

    vu16 ple=1;

    void __irq RCC_IRQHandler(void)
    {
    static u16 pla=0;
    if (ple) pla++;
    }

    int main(void)
    {
    return(0);
    }


    Nie ma myków...?...
    Nie bądź taki pewny - świat nie kończy się na AVR i GCC.
    Prosty przykład - saturacja dodawania. Myślisz że kompilator przewidzi twoje intencje gdy będziesz pisał ifa który programowo zasymuluje tą saturację?...:]

  • #45 30 Wrz 2010 21:21
    94075
    Użytkownik usunął konto  
  • #46 30 Wrz 2010 21:28
    Freddie Chopin
    Specjalista - Mikrokontrolery

    OMG co za herezje... Co to ma do rzeczy jakich instrukcji assemblera użyje kompilator? Kod w C ma ZAGWARANTOWANE, że ZAWSZE działa tak jak go widzisz - nie ma żadnych "myków" działających między wywołaniami tej samej funkcji... Żaden kompilator i żaden rdzeń nie ma jakiegokolwiek "bankowania rejestrów" w którym mógłby odzyskiwać wartości z poprzedniego wykonania funkcji. Ilość osobnych stosów czy zestaw instrukcji nie mają znaczenia. Tak BTW to akurat Cortex-M3 może mieć osobny stos na przerwania i nic to nie zmienia, bo dla programu w C nie ma to ŻADNEGO znaczenia.

    4\/3!!

  • #47 30 Wrz 2010 21:34
    tmf
    Moderator Mikrokontrolery Projektowanie

    nsvinc - prawdę mówiąc myślę, że zmienna globalna (a musi być globalna skoro jest współdzielona pomiędzy funkcję i przerwanie) nie może znaleźć się w żadnym specjalnym miejscu pamięci procesora (w sensie zarezerwowanym wyłącznie na przerwania). Tak więc nie wyobrażam sobie architektury w której kompilator nie wygenerowałby instrukcji pobrania zawartości takiej zmiennej na początku przerwania. Zauważ, że gdyby ona znalazła się w takim specjalnym obszarze pamięci to nie byłoby do niej dostępu z innych funkcji - ew. ten dostęp byłby poprzedzony specjalną sekwencją. W obu przypadkach użycie volatile byłoby zbędne, chyba, że kompilator byłby naprawdę pokręcony, ale to już nie byłoby C :)

    albertb - kompilator bardziej niż asembler od sprzętu zależny nie jest, ale w stopniu podobnym tak. I niestety widać to doskonale na przykładzie gcc - żaden standard języka C nie przewiduje np. rozdzielnych przestrzeni adresowych procesora, ba, w ogóle obsługi przerwań, stąd przerwania na AVR to w dużym stopniu partyzantka. Podobnie jak partyzantką na AVR są sekcje krytyczne, bo z kolei język C też nie przewiduje ich istnienia - są realizowane jako różne programowe plomby, których efekty są jednak dosyć nieprzewidywalne - a wszystko dlatego, że nie da się przekazać optymalizatorowi informacji, że pewnych sekcji ma nie ruszać. Takich przykładów można znaleźć mnóstwo.

  • #48 30 Wrz 2010 21:44
    nsvinc
    Poziom 35  

    ->Freddie Chopin
    Sprawdź rdenie MIPS, ktore obsługują bankowanie rejestrów...
    Skoro dla kodów w C nie ma to żadnego znaczenia, to po co ten stos jest? CM3 ma TRZY osobne stosy :]...
    Z poprzedniego wywołania funkcji?...static versus global?...

    Dobra - to wyjaśnijcie, do czego służy volatile? Nie przypadkiem do tego, żeby kompilator pilnował wartości zmiennej za każdym razem kiedy do niej sie odwołuje?...

    Zgadza się - działa tak jak go widzę. Więc stosując modyfikator volatile narzucam kompilatorowi pilnowanie wartości zmiennej przy każdym odwołaniu się do niej. Bez tego modyfikatora - już nie.
    Miałem przypadek, że pewien soft (polegający na podobnych mechanizmach) działał prawidłowo przy -O0 i -O1, ale już nie przy -O2 i -O3, a już na pewno nie przy -Otime(ficzer Keila). Właśnie przez brakujące volatile...

    albertb napisał:
    3.Lokalne.

    Lokalne, ale static. Własnie takie znalazłyby się w rejestrach zbankowanych. Bez static, lipa...

    Dodano po 4 [minuty]:

    tmf napisał:
    [...]Zauważ, że gdyby ona znalazła się w takim specjalnym obszarze pamięci to nie byłoby do niej dostępu z innych funkcji [...]

    Heh...nie chodzi o specjalny obszar pamięci, ale raczej o "motywację" kompilatora, aby z tej pamięci pobierał najaktualniejszą wartość zmiennej...
    Sam poprawiałeś innych - kompilator tego nie zrobi bez wskazania mu, że musi...
    BTW, przyczepię się co do informacji dla optymalizatora: #pragma...
    Jak ktoś wie jak używać, to pożądany efekt osiągnie...:]

  • #49 30 Wrz 2010 21:44
    tmf
    Moderator Mikrokontrolery Projektowanie

    No ale do lokalnej zmiennej static nie ma dostępu spoza funkcji w której jest zdefiniowana, więc kompilator może ją cobie umieścić gdziekolwiek, volatile tu nic nie zmieni - no poza tym, że udziwni wygenerowany kod.

  • #50 30 Wrz 2010 21:47
    Freddie Chopin
    Specjalista - Mikrokontrolery

    nsvinc napisał:
    ->Freddie Chopin
    Sprawdź rdenie MIPS, ktore obsługują bankowanie rejestrów...

    CM3 też ma bankowanie rejestrów, tylko że nie służy ono po to, żeby jakoś cudownie "przywracać" zmienne z poprzednich instancji, tylko do zupełnie czego innego...

    Cytat:
    Skoro dla kodów w C nie ma to żadnego znaczenia, to po co ten stos jest?

    A wg Ciebie ma to jakiekolwiek znaczenie dla NORMALNEGO programu (bez systemu operacyjnego) ile jest stosów?

    Cytat:
    CM3 ma TRZY osobne stosy :]...

    Definitywnie dwa...

    Cytat:
    Z poprzedniego wywołania funkcji?...static versus global?...

    Jeśli tylko Twoja funkcja nie ma statycznego wskaźnika na zmienną globalną, to NIC NIE JEST W NIEJ ZACHOWYWANE między wywołaniami... Nic. Bankowanie rejestrów nie jest po to, żeby "przywracać" zmienne.

    Cytat:
    stosując modyfikator volatile narzucam kompilatorowi pilnowanie wartości zmiennej przy każdym odwołaniu się do niej. Bez tego modyfikatora - już nie.

    Nie znaczy to jednak, że ma sobie wartość tej zmiennej zgadnąć, albo pogrzebać w śmietniku (stosie) za jej wartością z poprzedniego wywołania funkcji.

    Cytat:
    Miałem przypadek, że pewien soft (polegający na podobnych mechanizmach) działał prawidłowo przy -O0 i -O1, ale już nie przy -O2 i -O3, a już na pewno nie przy -Otime(ficzer Keila). Właśnie przez brakujące volatile...

    Czyli tam było volatile potrzebne, jednak tutaj nie jest.

    Cytat:
    Własnie takie znalazłyby się w rejestrach zbankowanych.

    Nie ma czegoś takiego jak "rejestry zbankowane"!

    4\/3!!

  • #51 30 Wrz 2010 21:47
    nsvinc
    Poziom 35  

    Heh nie chodziło o deklarację zmiennej static wewnątrz funkcji. Moja wojna polega na tym, że ja twierdzę, że coś czytane w przerwaniu a modyfikowane w mainie powinno być ulotne...

  • #53 30 Wrz 2010 21:56
    94075
    Użytkownik usunął konto  
  • #54 30 Wrz 2010 22:03
    nsvinc
    Poziom 35  

    Rejestry zbankowane istnieją - architektury MIPS32 i wyżej(może tez inne) Czyli ISRy pracują na zupełnie innym, niezależnym zestawie rejestrów, i nie jest to ten, na którym pracuje tryb thread lub supervisor...Po to, żeby zaoszczędzić PUSHe i POPy...Wiem jak działają i do czego służą osobne zestawy rejestrów dla różnych trybów pracy rdzenia (bo już jeden zaprojektowałem)...

    Po co? Może z logicznego punktu widzenia - kompilator ma obowiązek zawsze pobrać najaktualniejszą wartość zmiennej w przerwaniu. A wiemy, że tego nie robi bez volatile. Jeśli i tak to będzie zawsze robił - OK, mój błąd - nigdy nie pisałem kompilatora C. Ale jeśli nie będzie...to trzeba wskazać tą konieczność.

    albertb napisał:
    [...]ale przewiduje jakie wartości powinny mieć zmienne globalne gdy realizujemy do nich dostęp[...]

    Ale on nie ma przewidywać, a po prostu pobrać najaktualniejszą wartość. Jak wielu Kolegów już napisało, C jest WYSIWYG. Zgadywanki kompilatora nie wchodzą w grę...

  • #55 30 Wrz 2010 22:08
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Czyli wg Ciebie procesor będzie korzystał sobie w przerwaniu z niezainicjalizowanych wartości w rejestrach? No bo przecież chyba jakoś musi wiedzieć, że to co w tym rejestrze to śmietnik, albo "ta" zmienna? Rdzeń oszczędza na push/pop - owszem, ale NIGDY niczego nie będzie tam przechowywał między wywołaniami przerwania - zwłaszcza kopii zmiennych globalnych... To jest po prostu NIEMOŻLIWE.

    4\/3!!

  • #56 30 Wrz 2010 22:11
    94075
    Użytkownik usunął konto  
  • #57 30 Wrz 2010 22:15
    nsvinc
    Poziom 35  

    No to już wcześniej napisałem - mogę się mylić. Kilkaset softów które napisałem świadczą o tym, że jednak mogę mieć rację (LPC3250 pisany pod Keilem, pełny niespodzianek)....

    PS.
    No i cel osiągnięty...Największe łby na elce przyszły się udzielić :)

  • #58 30 Wrz 2010 22:25
    janbernat
    Poziom 38  

    To wcale nie był mój cel.
    Przepraszam że nikt nie dostał "pomógł".
    Ale nie wiem komu- i boję się że spowodowałbym jeszcze większe piekło.
    A teraz pytania początkującego:
    Jeśli zrobię sobie FIFO- pierścieniowe albo nie- i będę do niego wrzucał zdarzenia- przerwania albo wyniki działań funkcji- to w tym rejestrze mogą się znaleźć zarówno stare jak i nowsze flagi.
    Dotyczące tego samego żądania obsługi.
    To czy z tego co pisze nsvinc program ma sobie "olać" starszą flagę czy też "grzebać w śmietniku" i znaleźć tę starszą i wykonać co ona chce a potem wykonać parę innych zadań i wykonać to czego chce "młodsza" flaga.
    P.S.
    Abstrahując na razie od wzajemnych interakcji między funkcjami.

  • #59 30 Wrz 2010 22:31
    nsvinc
    Poziom 35  

    ->janbernat
    Ale nikt Cię nie obwinia :] twój topic stał się motywacją do (być może) konstruktywnej wojny...Nooby ktore to czytają mimo różnorakich wtopek bedą mogli wyciągnąć potężną porcję wiedzy programistów którzy piszą i mogą coś powiedzieć na temat swoich podopiecznych (kochany krzemik :P )...
    Przecież mamy za zadanie pomagać...
    "Jak rozpętałem drugą wojnę swiatową..." :P

    Moderowany przez _Robak_:

    Nooby? Kolega się chyba powoli zapędza...

  • #60 30 Wrz 2010 23:47
    tmf
    Moderator Mikrokontrolery Projektowanie

    nsvinc napisał:
    Heh nie chodziło o deklarację zmiennej static wewnątrz funkcji. Moja wojna polega na tym, że ja twierdzę, że coś czytane w przerwaniu a modyfikowane w mainie powinno być ulotne...


    Nie, to akurat jest jeden z wyjątków, kiedy zmienna współdzielona przez main i przerwanie nie musi być volatile. W tym przypadku należy tylko zapewnić, żeby modyfikacja zmiennej ma main była atomowa, inaczej jej czytanie w przerwaniu może prowadzić do nieprzewidywalnych efektów.

    Dodano po 1 [minuty]:

    janbernat napisał:

    Jeśli zrobię sobie FIFO- pierścieniowe albo nie- i będę do niego wrzucał zdarzenia- przerwania albo wyniki działań funkcji- to w tym rejestrze mogą się znaleźć zarówno stare jak i nowsze flagi.
    Dotyczące tego samego żądania obsługi.
    To czy z tego co pisze nsvinc program ma sobie "olać" starszą flagę czy też "grzebać w śmietniku" i znaleźć tę starszą i wykonać co ona chce a potem wykonać parę innych zadań i wykonać to czego chce "młodsza" flaga.


    Musi po kolei odczytywać zdarzenia i je kolejno realizować. W przeciwnym wypadku nie byłoby sensu implementacji FIFO, wystarczyłaby tylko jedna pozycja zawierająca aktualny stan flagi.