eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaProblem lekko OT, ale w WinAVR ;-)
Ilość wypowiedzi w tym wątku: 61

  • 41. Data: 2009-06-13 10:31:18
    Temat: Re: Problem lekko OT, ale w WinAVR ;-)
    Od: Grzegorz Kurczyk <g...@c...slupsk.pl>

    Użytkownik T.M.F. napisał:
    > Skad masz makra sei() i cli()? To twoja wlasna definicja czy z
    > biblioteki avr-glibc - pliku interrupts.h?
    > Zakladam, ze twoja wlasna, stad problemy. Oryginalna prawidlowa
    > definicja wyglada tak:
    > #define sei() __asm__ __volatile__ ("sei" ::)

    Niestety oryginalne z interrupt.h i są one tam zdefiniowane dokładnie
    tak jak Kolega napisał.

    > Zwroc uwage na slowo volatile. Swoja droga przeczytaj jak volatile
    > dziala to rozwiaze sie wiele twoich dziwnych klopotow.

    W dużym uproszczeniu ogranicza kompilatorowi możliwości optymalizacji. W
    stosunku do zmiennej wymusza bezwarunkowe każdorazowe czytanie aktualnej
    wartości zmiennej z pamięci przed wykonaniem jakichkolwiek operacji na
    zmiennej. Czyli kompilatorowi nie wolno dla uproszczenia/przyśpieszenia
    kodu banglać przez cała procedurę na wartości skopiowanej do rejestrów.
    Inaczej mówiąc zmienna ma być tak traktowana jakby jej zawartość mogła
    się w każdej chwili zmienić (np. przez inny wątek programu). W
    kontekście powyższego (chyba, że jest jednak inna definicja volatile)
    nadal nie mogę zrozumieć z jakiej paki rozkaz sei() umieszczony na końcu
    funkcji znalazł się nagle na jej początku.


    Pozdrawiam
    Grzegorz


  • 42. Data: 2009-06-13 10:34:34
    Temat: Re: Problem lekko OT, ale w WinAVR ;-)
    Od: Grzegorz Kurczyk <g...@c...slupsk.pl>

    Użytkownik Zbych napisał:
    > Powinieneś użyć jej wszędzie tam gdzie do tej pory miałeś
    >
    > cli();
    > [...]
    > sei();

    No to teraz już wiem :-) Dzięki za cenną wskazówkę.

    Pozdrawiam
    Grzegorz


  • 43. Data: 2009-06-13 10:35:44
    Temat: Re: Problem lekko OT, ale w WinAVR ;-)
    Od: J.F. <j...@p...onet.pl>

    On Sat, 13 Jun 2009 12:31:18 +0200, Grzegorz Kurczyk wrote:
    >> Zwroc uwage na slowo volatile. Swoja droga przeczytaj jak volatile
    >> dziala to rozwiaze sie wiele twoich dziwnych klopotow.
    >
    >W dużym uproszczeniu ogranicza kompilatorowi możliwości optymalizacji. W
    >stosunku do zmiennej wymusza bezwarunkowe każdorazowe czytanie aktualnej
    >wartości zmiennej z pamięci przed wykonaniem jakichkolwiek operacji na
    >zmiennej. Czyli kompilatorowi nie wolno dla uproszczenia/przyśpieszenia
    >kodu banglać przez cała procedurę na wartości skopiowanej do rejestrów.
    >Inaczej mówiąc zmienna ma być tak traktowana jakby jej zawartość mogła
    >się w każdej chwili zmienić (np. przez inny wątek programu). W
    >kontekście powyższego (chyba, że jest jednak inna definicja volatile)
    >nadal nie mogę zrozumieć z jakiej paki rozkaz sei() umieszczony na końcu
    >funkcji znalazł się nagle na jej początku.

    Nie - to rozkaz = ze srodka funkcji znalazl sie na jej koncu :-)

    J.


  • 44. Data: 2009-06-13 11:01:50
    Temat: Re: Problem lekko OT, ale w WinAVR ;-)
    Od: Grzegorz Kurczyk <g...@c...slupsk.pl>

    Użytkownik J.F. napisał:
    >
    > Nie - to rozkaz = ze srodka funkcji znalazl sie na jej koncu :-)
    >

    No fakt :-) Można to też w taki sposób zinterpretować :-)
    Co oczywiście nie rozwiązuje kwestii "z jakiej paki".

    Pozdrawiam
    Grzegorz


  • 45. Data: 2009-06-13 11:24:20
    Temat: Re: Problem lekko OT, ale w WinAVR ;-)
    Od: J.F. <j...@p...onet.pl>

    On Sat, 13 Jun 2009 13:01:50 +0200, Grzegorz Kurczyk wrote:
    >Użytkownik J.F. napisał:
    >> Nie - to rozkaz = ze srodka funkcji znalazl sie na jej koncu :-)
    >>
    >No fakt :-) Można to też w taki sposób zinterpretować :-)
    >Co oczywiście nie rozwiązuje kwestii "z jakiej paki".

    Jest potrzebny na koncu [do zwrocenia wartosci], to przerzucaja na
    koniec .. po co ma wczesniej rejestry zajmowac ?


    J.


  • 46. Data: 2009-06-13 11:37:15
    Temat: Re: Problem lekko OT, ale w WinAVR ;-)
    Od: Grzegorz Kurczyk <g...@c...slupsk.pl>

    Użytkownik J.F. napisał:
    > Jest potrzebny na koncu [do zwrocenia wartosci], to przerzucaja na
    > koniec .. po co ma wczesniej rejestry zajmowac ?

    To dlaczego w przytoczonej funkcji SetEncoder też tak nie zrobił ? Tam
    wszystko jest w takiej kolejności jak w źródłówce - sei jest na końcu,
    choć z "matematycznego" punktu widzenia sei nie ma wpływu na wartość
    obliczeń i może se być wrzuconym gdziekolwiek ;-)

    Ufff... kończmy tę dyskusję, bo się mały flejmik robi :-)
    Kolega Zbych podał konkretne i skuteczne rozwiązanie problemu, choć
    nadal nie mogę zrozumieć czemu akurat tak się dzieje ? Cóż trzeba
    przyjąć to na "wiarę", że tak ma być i koniec ;-)

    Jeszcze raz dziękuję Kolegom za udział w dyskusji.
    Pozdrawiam
    Grzegorz


  • 47. Data: 2009-06-13 12:17:34
    Temat: Re: Problem lekko OT, ale w WinAVR ;-)
    Od: Grzegorz Kurczyk <g...@c...slupsk.pl>

    Użytkownik T.M.F. napisał:
    > Co
    > wiecej gdybys dalej cops robil z ta zmienna w swojej procedurze to
    > kompilator jej pewnie ponownie by nie ladowal, czyli mialbys kolejne
    > dziwne bledy.

    Błędów by nie było pod warunkiem, że sei wylądowałoby na końcu tam gdzie
    je napisałem. W sekcji między cli, a sei program staje się jednowątkowy
    i nie ma powodu dla którego wartość tej zmiennej mogłby ulec zmianie,
    ale fakt... Samo volatile też nie załatwiłoby sprawy. Musi być połaczone
    z sekcją cli/sei.

    > Ale to ciagle twoja wina i nie ma co zwalac na gcc.

    Ale ja nigdzie nie twierdzę, że to nie moja wina :-) Pewnie, że moja.
    Wystarczyło dopisać volatile lub zastosować sekcję ATOMIC_BLOCK i jest
    ok. Poprostu kiedyś tam zasugerowałem się tym, że przecież volatile
    stosuje się po to aby wymusić każdorazowe czytanie zmiennej z pamięci, a
    moim celem było uniemożliwienie aby cokolwiek innego zmieniło wartość
    tej zmiennej na czas wykonywania wnętrza funkcji. A zmienna w tej
    funkcji czytana jest w sumie tylko raz. Takie małe odwrócenie problemu
    :-) I co gorsza/lepsza w starszych wersjach WinAVR kompilowało się to
    "po ludzku", co uśpiło moją czujność ;-)

    Jeszcze raz dziękuję Kolegom za cenne wskazówki.

    Pozdrawiam
    Grzegorz


  • 48. Data: 2009-06-13 13:09:54
    Temat: Re: Problem lekko OT, ale w WinAVR ;-)
    Od: J.F. <j...@p...onet.pl>

    On Sat, 13 Jun 2009 13:37:15 +0200, Grzegorz Kurczyk wrote:
    >Użytkownik J.F. napisał:
    >> Jest potrzebny na koncu [do zwrocenia wartosci], to przerzucaja na
    >> koniec .. po co ma wczesniej rejestry zajmowac ?
    >
    >To dlaczego w przytoczonej funkcji SetEncoder też tak nie zrobił ?

    No bo tam nie bylo takiej potrzeby :-)

    Jak sam zreszta zauwazyles - dodanie volatile zaowocowalo dluzszym
    kodem. No to slusznie bez volatile zoptymalizowal do krotszego :-)

    Inna sprawa ze ta kompilacja dziwna jakas i wcale niepotrzebnie
    dluzsza.

    >Ufff... kończmy tę dyskusję, bo się mały flejmik robi :-)
    >Kolega Zbych podał konkretne i skuteczne rozwiązanie problemu, choć
    >nadal nie mogę zrozumieć czemu akurat tak się dzieje ? Cóż trzeba
    >przyjąć to na "wiarę", że tak ma być i koniec ;-)

    No coz - moral z tego taki ze czasem warto w kod wynikowy zajrzec.
    Czlowiek sie czegos moze dowiedziec.

    Inna sprawa ze w tym miejscu to volatile powinienes z przyzwyczajenia
    pisac :-)

    J.


  • 49. Data: 2009-06-13 14:35:07
    Temat: Re: Problem lekko OT, ale w WinAVR ;-)
    Od: "T.M.F." <t...@n...mp.pl>

    W dniu 13.06.2009 02:43, Grzegorz Kurczyk pisze:
    > A teraz coś czego już zupełnie nie rozumiem:
    >
    > int *pEncoderValue; // celowo bez volatile
    >
    > int GetEncoder(void) {
    > cli();
    > int e = *pEncoderValue;
    > sei();
    > return e;
    > }
    >
    > void SetEncoderValue(int Value) {
    > cli();
    > *pEncoderValue = Value;
    > sei();
    > }
    >
    > kompiluje się na:
    >

    Skad masz makra sei() i cli()? To twoja wlasna definicja czy z
    biblioteki avr-glibc - pliku interrupts.h?
    Zakladam, ze twoja wlasna, stad problemy. Oryginalna prawidlowa
    definicja wyglada tak:
    #define sei() __asm__ __volatile__ ("sei" ::)

    Zwroc uwage na slowo volatile. Swoja droga przeczytaj jak volatile
    dziala to rozwiaze sie wiele twoich dziwnych klopotow.


    --
    Inteligentny dom - http://idom.wizzard.one.pl
    http://idom.sourceforge.net/
    Teraz takze forum dyskusyjne
    Zobacz, wyslij uwagi, dolacz do projektu.


  • 50. Data: 2009-06-13 14:36:18
    Temat: Re: Problem lekko OT, ale w WinAVR ;-)
    Od: "T.M.F." <t...@n...mp.pl>

    >> (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);
    >
    > Tak to nie, bo to jednak i operacja specjalna i taka "wyjsciowa",
    > ale juz kolejnosc odczytow z portow moglby przestawic.

    Zadna to operacja specjalna, po prostu PORTB zdefiniowany jest jako
    volatile, co implikuje, ze kompilator nie robi dziwnych przetasowan, bo
    wie, ze mu nie wolno.

    --
    Inteligentny dom - http://idom.wizzard.one.pl
    http://idom.sourceforge.net/
    Teraz takze forum dyskusyjne
    Zobacz, wyslij uwagi, dolacz do projektu.

strony : 1 ... 4 . [ 5 ] . 6 . 7


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: