eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › Dlaczego ATmega128 przekłamuje?
Ilość wypowiedzi w tym wątku: 95

  • 71. Data: 2009-10-15 20:41:57
    Temat: Re: Dlaczego ATmega128 przek?amuje?
    Od: "T.M.F." <t...@n...mp.pl>

    W dniu 15.10.2009 20:11, MiSTER pisze:
    >> Cos sie zapetliles, to w koncu te pola bitowe sa rozmieszczane dowolnie
    >> czy nie?
    >> IMHO kompilator rozmieszcza je w kolejnosci w jakiej sa zdefiniowane - w
    >> koncu to struktura, a elementy struktury wystepuja w kolejnosci zgodnej z
    >> definicja.
    >
    > Nie zaleca si? korzysta? z p?l bitowych je?eli soft ma by? kompilowany pod
    > r?nymi platformami gdy? standard NIE DEFINIUJE kolejno?ci przypisania
    > bit?w.
    >
    > W niekt?rych sytuacjach jest to bardzo istotna przeszkoda.

    Ale to jak sadze jest raczej kwestia big/little-endian.
    Dla programu nie ma to znaczenia - o ile wlasnie nie przenosze pomiedzy
    architekturami danych wygenerowanych na innej. Bo w samym programie
    odwolanie do pola struktury zawsze bedzie jednoznaczne.

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


  • 72. Data: 2009-10-15 21:04:02
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: "T.M.F." <t...@n...mp.pl>

    >> jest jak zwykła zmienna. W komputerach klasy PC stałe (const) trzymane
    >> są w pamięci RAM, bo nie ma innego wyjścia. W ARMach trafiają do pamięci
    >> Flash z reguły, bo jest jedna przestrzeń adresowa. Czemu dla AVRów
    >> miałby być wyjątek??
    >
    > Zużywa na ARV niepotrzebnie RAM dla vtable w przypadku C++.

    To akurat jest wada implementacji AVR w gcc i nie ma nic wspolnego z
    typami - implementacja funkcji wirtualnych i pokrewnych tematow jest
    calkowicie w gestii kompilatora. Nawet w jakims akcie desperacji
    probowalem wygenerowac stosowny patch dla gcc ale ciagle umieram w
    gaszczu kodu zrodlowego, poza tym w przyszlych wersjach ma to byc
    poprawione.

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


  • 73. Data: 2009-10-16 06:31:56
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: "Artur M. Piwko" <m...@b...pl>

    In the darkest hour on Thu, 15 Oct 2009 22:36:27 +0200,
    Ghost <g...@e...pl> screamed:
    >>> Cos sie zapetliles, to w koncu te pola bitowe sa rozmieszczane dowolnie
    >>> czy nie?
    >>
    >> Zależnie od architektury CPU i od kompilatora. Jeśli zapiszesz strukturę
    >> z polem bitowym do pliku, taki plik nie będzie przenośny.
    >
    > Podobnie jak swobodny strumien swiadomosci jest slabo przenosny, ale
    > przeciez zdajemy sobie z tego sprawe, wiec bez przesady.
    >

    Nie wszyscy sobie z tego zdają sprawę. Usenet to nie tylko Ty i ja.

    --
    [ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:237B ]
    [ 08:31:25 user up 12227 days, 20:26, 1 user, load average: 0.18, 0.04, 0.45 ]

    Bigamy is having one wife too many. Monogamy is the same. -- Oscar Wilde


  • 74. Data: 2009-10-16 09:49:29
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: Piotr Gałka <p...@C...pl>


    Użytkownik "T.M.F." <t...@n...mp.pl> napisał w wiadomości
    news:hb4gsl$bd$1@atlantis.news.neostrada.pl...
    >> A za to jest bardzo fajna właściwość, bo można zadeklarować zmienne
    >> pełniące rolę dwustanowych flag jako "bool". Podejrzewam, że nie zajmują
    >> wtedy całego bajtu. Jeśli tak , to przydało by się coś takiego w
    >> programowaniu ATmegi. Kupę RAM-u zajmują flagi. Duże marnotrawstwo.
    >> Bawienie się w maski, to znów przystosowywanie się do kaprysów komputera.
    >
    > Przejrzyj liste instrukcji AVR i nie bedziesz mial zludzen. Mozesz
    > zadeklarowac zmienna bool, mozesz wykorzystac pola bitowe, ale to ciagle
    > bedzie tlumaczone na operacje na bitach typu ustawianie, zerowanie itd.
    >
    Przepraszam, że się odzywam w temacie na którym się kompletnie nie znam. Na
    temat flag w postaci bitów w bajtach w AVR omawianych w kursie C na AVR w EP
    usłyszałem przed kilku laty mniej więcej taką wypowiedź:
    "Jak można podawać takie przykłady! Przecież trzeba znać maszynę, na której
    program będzie chodził. Widać, że ktoś bezmyślnie przepisał przykład z 51 na
    AVR. Potem ludzie tak napiszą i mamy to co mamy."
    Z tego co pamiętam to chodziło o to, że przestawienie bitu w bajcie na AVR
    wymaga więcej niż jednego rozkazu. No i w przykładzie przyjście przerwania
    miedzy tymi rozkazami prowadziło do błędu.
    Liczę na to, że ktoś piszący na AVR wypowie się na ten temat (bo nawet nie
    jestem pewien, czy te pretensje były uzasadnione).
    Z przebiegu wątku wygląda, że jego autor być może powstawia flagi do bajtów
    co być może doprowadzi do nowych błędów.
    No i chęć zapobiegnięcia temu skłoniła mnie do tej dość mętnej wypowiedzi.
    P.G.


  • 75. Data: 2009-10-16 11:24:37
    Temat: Re: Dlaczego ATmega128 przek?amuje?
    Od: cepu69 <c...@t...pl>

    T.M.F. wrote:

    > W dniu 15.10.2009 20:11, MiSTER pisze:
    >>> Cos sie zapetliles, to w koncu te pola bitowe sa rozmieszczane dowolnie
    >>> czy nie?
    >>> IMHO kompilator rozmieszcza je w kolejnosci w jakiej sa zdefiniowane - w
    >>> koncu to struktura, a elementy struktury wystepuja w kolejnosci zgodnej
    >>> z definicja.
    >>
    >> Nie zaleca si? korzysta? z p?l bitowych je?eli soft ma by? kompilowany
    >> pod
    >> r?nymi platformami gdy? standard NIE DEFINIUJE kolejno?ci przypisania
    >> bit?w.
    >>
    To kompilator ustala kolejnosc bitwo we bajcie, np GCC vs propriety
    compiler:
    typedef union {
    unsigned short word;
    #ifndef __GNUC__
    struct
    {
    unsigned short :1; /* reserved */
    unsigned short CodeAssertLine :13;
    unsigned short EventOverflowTrigger :1;
    unsigned short EventCodeAssertTrigger :1;
    } bit;
    #else
    struct
    {
    unsigned short EventCodeAssertTrigger :1;
    unsigned short EventOverflowTrigger :1;
    unsigned short CodeAssertLine :13;
    unsigned short :1; /* reserved */
    } bit;
    #endif

    aczkolwiek GCC dostarcza makra __BIG_ENDIAN_BITFIELD oraz
    __LITTLE_ENDIAN_BITFIELD informujace o ukladzie bitow w slowie

    struct atapi_mechstat_header {
    #if defined(__BIG_ENDIAN_BITFIELD)
    __u8 fault : 1;
    __u8 changer_state : 2;
    __u8 curslot : 5;
    #elif defined(__LITTLE_ENDIAN_BITFIELD)
    __u8 curslot : 5;
    __u8 changer_state : 2;
    __u8 fault : 1;
    #else
    #error "Please fix <asm/byteorder.h>"
    #endif

    #if defined(__BIG_ENDIAN_BITFIELD)
    __u8 mech_state : 3;
    __u8 door_open : 1;
    __u8 reserved1 : 4;
    #elif defined(__LITTLE_ENDIAN_BITFIELD)
    __u8 reserved1 : 4;
    __u8 door_open : 1;
    __u8 mech_state : 3;
    #else
    #error "Please fix <asm/byteorder.h>"
    #endif

    byte curlba[3];
    byte nslots;
    __u8 short slot_tablelen;
    };

    >
    > Ale to jak sadze jest raczej kwestia big/little-endian.
    Nie endian mowi o kolejnosi bajtow w slowie :
    http://pl.wikipedia.org/wiki/Kolejność_bajtów

    > Dla programu nie ma to znaczenia - o ile wlasnie nie przenosze pomiedzy
    > architekturami danych wygenerowanych na innej. Bo w samym programie
    > odwolanie do pola struktury zawsze bedzie jednoznaczne.
    Oczywiscie dopoki nie jest to unia i odwolujesz sie do niej zarowno przez
    pola bitowe jak i slowa ;)


  • 76. Data: 2009-10-16 11:32:50
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: "T.M.F." <t...@n...mp.pl>

    > Przepraszam, że się odzywam w temacie na którym się kompletnie nie znam.
    > Na temat flag w postaci bitów w bajtach w AVR omawianych w kursie C na
    > AVR w EP usłyszałem przed kilku laty mniej więcej taką wypowiedź:
    > "Jak można podawać takie przykłady! Przecież trzeba znać maszynę, na
    > której program będzie chodził. Widać, że ktoś bezmyślnie przepisał
    > przykład z 51 na AVR. Potem ludzie tak napiszą i mamy to co mamy."
    > Z tego co pamiętam to chodziło o to, że przestawienie bitu w bajcie na
    > AVR wymaga więcej niż jednego rozkazu. No i w przykładzie przyjście
    > przerwania miedzy tymi rozkazami prowadziło do błędu.
    > Liczę na to, że ktoś piszący na AVR wypowie się na ten temat (bo nawet
    > nie jestem pewien, czy te pretensje były uzasadnione).
    > Z przebiegu wątku wygląda, że jego autor być może powstawia flagi do
    > bajtów co być może doprowadzi do nowych błędów.
    > No i chęć zapobiegnięcia temu skłoniła mnie do tej dość mętnej wypowiedzi.

    AVR ma pewne wydzielone obszary pamieci na ktorych dzialaja instrukcje
    umozliwiajace atomowe ustawienie lub wyzerowanie bitu, tylko, ze nie
    mozna tego zrobic w SRAM, tylko w niektorych rejestrach IO. Niektore
    AVRy maja w tej przestrzeni rejestry, ktore nie maja zadnej funkcji,
    poza wlasnie przechowywaniem flag. Wiec da sie to zrobic atomowo, tyle,
    ze to juz nie jest standardowe C.

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


  • 77. Data: 2009-10-16 11:40:40
    Temat: Re: Dlaczego ATmega128 przek?amuje?
    Od: "T.M.F." <t...@n...mp.pl>

    W dniu 16.10.2009 13:24, cepu69 pisze:
    >> Ale to jak sadze jest raczej kwestia big/little-endian.
    > Nie endian mowi o kolejnosi bajtow w slowie :
    > http://pl.wikipedia.org/wiki/Kolejność_bajtów

    Dokladnie, a to w przypadku pol bitowych o dlugosci wiekszej niz bajt
    powoduje, ze np. bity 8-15 moga byc przed lub za bitami 0-7. Natomiast w
    ramach bajtu kolejnosc bedzie zachowana i w konsekwencji w programie
    rowniez.

    >> > Dla programu nie ma to znaczenia - o ile wlasnie nie przenosze pomiedzy
    >> > architekturami danych wygenerowanych na innej. Bo w samym programie
    >> > odwolanie do pola struktury zawsze bedzie jednoznaczne.
    > Oczywiscie dopoki nie jest to unia i odwolujesz sie do niej zarowno przez
    > pola bitowe jak i slowa;)

    Owszem, zawsze znajdziesz przyklad, ktory cos zamiesza. Z tym, ze jesli
    to bedzie unia pola bitowego i slowa to endian nie ma znaczenia - wplywa
    tak samo na kolejnosc przechowywania bitow jak i kolejnosc
    przechowywania bajtow w slowie. Gorzej, gdybys mial unie pola bitowego i
    bajtow - tu juz by powstalo zamieszanie. Z drugiej strony sa biblioteki
    standardowe umozliwiajace rozwiazanie tego typu problemow. Poza tym o
    czym dyskutowac - programowanie nie jest dla idiotow i ktos kto robi
    takie rzeczy musi sobie zdawac sprawe z konsekwencji.
    Standard C definiuje kolejnosc bitow pola bitowego, co wiecej uzycie
    pola bitowego :0 wyrownuje kolejne do granicy okreslanej przez design
    procesora.



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


  • 78. Data: 2009-10-16 11:58:23
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: Piotr Gałka <p...@C...pl>


    Użytkownik "T.M.F." <t...@n...mp.pl> napisał w wiadomości
    news:hb9lor$hs6$1@atlantis.news.neostrada.pl...
    > AVR ma pewne wydzielone obszary pamieci na ktorych dzialaja instrukcje
    > umozliwiajace atomowe ustawienie lub wyzerowanie bitu, tylko, ze nie mozna
    > tego zrobic w SRAM, tylko w niektorych rejestrach IO. Niektore AVRy maja w
    > tej przestrzeni rejestry, ktore nie maja zadnej funkcji, poza wlasnie
    > przechowywaniem flag. Wiec da sie to zrobic atomowo, tyle, ze to juz nie
    > jest standardowe C.

    A da się atomowo zapamiętać w bicie flagę przeniesienia, zrobić and czy or
    bitu z tą flagą czy odwrócić bit rejestru, bo to mogło też o takie rzeczy
    chodzić ?
    P.G.


  • 79. Data: 2009-10-16 12:49:20
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: "T.M.F." <t...@n...mp.pl>

    >> AVR ma pewne wydzielone obszary pamieci na ktorych dzialaja instrukcje
    >> umozliwiajace atomowe ustawienie lub wyzerowanie bitu, tylko, ze nie
    >> mozna tego zrobic w SRAM, tylko w niektorych rejestrach IO. Niektore
    >> AVRy maja w tej przestrzeni rejestry, ktore nie maja zadnej funkcji,
    >> poza wlasnie przechowywaniem flag. Wiec da sie to zrobic atomowo,
    >> tyle, ze to juz nie jest standardowe C.
    >
    > A da się atomowo zapamiętać w bicie flagę przeniesienia, zrobić and czy
    > or bitu z tą flagą czy odwrócić bit rejestru, bo to mogło też o takie
    > rzeczy chodzić ?

    Da sie zapamietac przeniesienie atomowo w szczegolnych przypadkach -
    stosujac operacje przesuniecia z przeniesieniem, lub dodawania,
    odejmowania - to jak w kazdym procesorze.
    Co do OR, AND, XOR flagi C z innym rejestrem to sie nie da atomowo.
    Znaczy XOR to by sie nawet dalo, z zastrzezeniem, ze w szczegolnych
    przypadkach.
    Nie pamietam assemblera '51, ale tam takie operacje jak sadze tez nie sa
    atomowe? Zreszta nawet jesli sa to pisanie takich rzeczy w C wcale nie
    gwarantuje, ze kompilator to skompiluje zgodnie z intencja autora.
    Chociazby stopien optymalizacji bedzie mial wplyw na koncowa sekwencje
    rozkazow.


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


  • 80. Data: 2009-10-16 14:22:42
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: Konop <k...@g...pl>

    > Z tego co pamiętam to chodziło o to, że przestawienie bitu w bajcie na
    > AVR wymaga więcej niż jednego rozkazu. No i w przykładzie przyjście
    > przerwania miedzy tymi rozkazami prowadziło do błędu.

    Niekoniecznie prowadzi do błędu... wszystko zależy od tego, co się z tym
    rejestrem w międzyczasie stanie... Typowo ustawianie bitu w jakiejś
    zmiennej (która siedzi w RAMie) wygląda tak:
    -pobieranie zmiennej do rejestru
    -operacja na rejestrze
    -zapis zmiennej do RAMu

    Jeśli po pobraniu i przed zapisaniem wystąpi przerwanie, które ZMIENI tę
    zmienną, wówczas po powrocie z przerwania program główny skasuje zmianę
    dokonaną w przerwaniu...
    Pisząc program trzeba uważać na takie rzeczy ;)... czasem taka sytuacja
    jest po prostu niegroźna. W innym wypadku trzeba rozdzielić zmienne
    aktualizowane w programie od tych aktualizowanych w przerwaniach, albo
    stosować CLI i SEI ;)...

    Pozdrawiam
    Konop

strony : 1 ... 7 . [ 8 ] . 9 . 10


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: