eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaAVR i inne 8-bitowce a modyfikacja zmiennych globalnych w przerwaniach
Ilość wypowiedzi w tym wątku: 5

  • 1. Data: 2014-10-14 22:28:10
    Temat: AVR i inne 8-bitowce a modyfikacja zmiennych globalnych w przerwaniach
    Od: Jakub Rakus <s...@o...pl>

    Dawno już nie robiłem nic na 8-bitowcach i chyba mi coś umknęło, a w
    październikowej EP na str. 26 przeczytałem co następuje:
    "(...)zmienne wyniku pomiaru są współdzielone między pętlą główną a
    przerwaniem, a jak wiadomo, w przypadku 8-bitowego mikrokontrolera oraz
    zmiennych większych niż jeden bajt, sytuacja taka może prowadzić do złej
    interpretacji wartości zmiennej, jeśli się odpowiednio nie zabezpieczymy."
    Czy mógłby ktoś wyklarować dlaczego, jak i po co? Jakie zabezpieczenie?
    Coś kojarzę, że miałem dawno temu z tym jakieś problemy, bo między
    main() a ISR() wymieniałem zmienną typu uint32_t i pojawiały się w niej
    jakiejś bzdety, ale już nie pamiętam co wtedy zaradziłem.

    --
    Pozdrawiam
    Jakub Rakus


  • 2. Data: 2014-10-14 22:39:10
    Temat: Re: AVR i inne 8-bitowce a modyfikacja zmiennych globalnych w przerwaniach
    Od: "Grzegorz Niemirowski" <g...@p...onet.pl>

    Jakub Rakus <s...@o...pl> napisał(a):
    > Dawno już nie robiłem nic na 8-bitowcach i chyba mi coś umknęło, a w
    > październikowej EP na str. 26 przeczytałem co następuje:
    > "(...)zmienne wyniku pomiaru są współdzielone między pętlą główną a
    > przerwaniem, a jak wiadomo, w przypadku 8-bitowego mikrokontrolera oraz
    > zmiennych większych niż jeden bajt, sytuacja taka może prowadzić do złej
    > interpretacji wartości zmiennej, jeśli się odpowiednio nie zabezpieczymy."
    > Czy mógłby ktoś wyklarować dlaczego, jak i po co? Jakie zabezpieczenie?
    > Coś kojarzę, że miałem dawno temu z tym jakieś problemy, bo między main()
    > a ISR() wymieniałem zmienną typu uint32_t i pojawiały się w niej jakiejś
    > bzdety, ale już nie pamiętam co wtedy zaradziłem.

    Na tych mikrokontrolerach operacje na zmiennych większych niż 8-bitowe nie
    są atomowe. Przykładowo dekrementujesz sobie 16-bitową zmienną w przerwaniu,
    a w głównym programie masz pętlę sprawdzającą, czy zmienna ta osiągnęła
    zero. Może się zdarzyć, że zmienna ta będzie miała wartość 0x0100 i wtedy:
    - główny kod sprawdzi młodszy bajt i stwierdzi jego równość zeru
    - nastąpi przerwanie, które zmieni wartość zmiennej na 0x00ff
    - główny kod sprawdzi starszy bajt i stwierdzi jego równość zeru
    - główny kod stwierdzi, że zmienna ma wartość 0x0000, choć nie będzie to
    prawdą
    Dlatego stosujemy sekcje krytyczne. Kłania się np. makro ATOMIC_BLOCK, które
    wyłącza przerwania na czas wykonywania sekcji.

    --
    Grzegorz Niemirowski
    http://www.grzegorz.net/
    OE PowerTool i Outlook Express: http://www.grzegorz.net/oe/
    Uptime: 15 days, 2 hours, 38 minutes and 10 seconds


  • 3. Data: 2014-10-14 22:42:37
    Temat: Re: AVR i inne 8-bitowce a modyfikacja zmiennych globalnych w przerwaniach
    Od: platformowe głupki <N...@g...pl>

    > Dlatego stosujemy sekcje krytyczne. Kłania się np. makro ATOMIC_BLOCK,
    > które wyłącza przerwania na czas wykonywania sekcji.

    tak ? makro ?
    to ciekawe, a jak niby takie makro ma działać?

    wyłącza przerwania czy co?


  • 4. Data: 2014-10-14 23:17:18
    Temat: Re: AVR i inne 8-bitowce a modyfikacja zmiennych globalnych w przerwaniach
    Od: Sebastian Biały <h...@p...onet.pl>

    On 2014-10-14 22:28, Jakub Rakus wrote:
    > "(...)zmienne wyniku pomiaru są współdzielone między pętlą główną a
    > przerwaniem, a jak wiadomo, w przypadku 8-bitowego mikrokontrolera oraz
    > zmiennych większych niż jeden bajt, sytuacja taka może prowadzić do złej
    > interpretacji wartości zmiennej, jeśli się odpowiednio nie zabezpieczymy."

    a) volatile, tylko z głową
    b) zrób sobie szablon atomic< T > który własnie wyłączy przerwania
    podczas dostępu - cli()/sei(). Szablon pozwoli ukryć ten szczegół.


  • 5. Data: 2014-10-15 22:36:10
    Temat: Re: AVR i inne 8-bitowce a modyfikacja zmiennych globalnych w przerwaniach
    Od: janusz_k <J...@o...pl>

    W dniu 2014-10-14 23:17, Sebastian Biały pisze:
    > On 2014-10-14 22:28, Jakub Rakus wrote:
    >> "(...)zmienne wyniku pomiaru są współdzielone między pętlą główną a
    >> przerwaniem, a jak wiadomo, w przypadku 8-bitowego mikrokontrolera oraz
    >> zmiennych większych niż jeden bajt, sytuacja taka może prowadzić do złej
    >> interpretacji wartości zmiennej, jeśli się odpowiednio nie
    >> zabezpieczymy."
    >
    > a) volatile, tylko z głową
    > b) zrób sobie szablon atomic< T > który własnie wyłączy przerwania
    > podczas dostępu - cli()/sei(). Szablon pozwoli ukryć ten szczegół.
    >
    Nie trzeba szablonu jest gotowe makro,

    --
    Pozdr

    Janusz_K

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: