eGospodarka.pl
eGospodarka.pl poleca

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

  • 1. Data: 2009-10-13 12:37:54
    Temat: Dlaczego ATmega128 przekłamuje?
    Od: "Darkac" <d...@w...pl>

    Piszę program na ATmega128 za pomocą edytora AVRSide i kompilatora WinAVR.
    Program jest juz trochę rozbudowany i zawiły. Jest obsługa przerwań
    czasowych co mniej więcej 1ms i używane jest sporo zmiennych globalnych.
    Program obrabia równolegle dwa sygnały A i B z przetwornika A/C.
    Jeśli sygnał A lub B spełni pewien warunek badany w przerwaniu, w pętli
    głównej wchodzi w odpowiadającą swojemu kanałowi jedną z dwóch bliźniaczych
    procedur (dość zawiłych).
    Jedna ze zmiennych ustawiana jest w menu (wyświetlacz LCD i klawiatura
    multipleksowana) i przyjmuje wartości 1 lub 0.

    Dziwne zjawisko występuje, kiedy program wejdzie w wykonywanie procedury
    tylko dla kanału B. W trakcie jej wykonywania powoduje samoistne wyzerowanie
    wspomnianej wcześniej zmiennej. Zmienna ta nie występuje w ogóle w tej
    procedurze. W całym programie jej wartość może być zmieniana ręcznie tylko w
    pewnym menu które trzeba specjalnie wywołać sekwencją działań.
    Podejrzewałem że może jest za mało pamięci RAM (zajętość 83%) i coś zaczyna
    głupieć. Testowo wywaliłem pewne tabele zajmujące sporo RAM-u i uzyskałem
    52% zajętości. Zjawisko się nie zmieniło. Sprawdziłem użycie tablic i
    nigdzie nie jest przekroczony ich rozmiar.

    Zmienna nie jest używana w przerwaniach, ale dla próby dałem ją jako
    volatile - bez poprawy.
    Szukanie dokładnie miejsca w procedurze w którym następuje zmiana wartości
    tej zmiennej, to żmudna czasochłonna praca. Procedura jest duża i
    pokiełbaszona z wieloma rozgałęzieniami typu case. Przydałaby się jakaś
    wskazówka do szukania winnego.

    Co może powodować ingerencję w wartość zmiennej przez procedurę, w której ta
    zmienna nie występuje?


  • 2. Data: 2009-10-13 13:14:03
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: DJ <j...@p...onet.pl>

    On 2009-10-13 14:37:54 +0200, "Darkac" <d...@w...pl> said:

    > Co może powodować ingerencję w wartość zmiennej przez procedurę, w
    > której ta zmienna nie występuje?

    stos?

    --
    DJ

    PS. przy odpisywaniu na priv usun antyspamowy wpis z adresu


  • 3. Data: 2009-10-13 13:43:11
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: "Darkac" <d...@w...pl>


    Użytkownik "DJ" <j...@p...onet.pl> napisał w wiadomości
    news:hb1uet$fia$7@news.dialog.net.pl...
    > On 2009-10-13 14:37:54 +0200, "Darkac" <d...@w...pl> said:
    >
    >> Co może powodować ingerencję w wartość zmiennej przez procedurę, w której
    >> ta zmienna nie występuje?
    >
    > stos?
    >
    > --
    > DJ

    Tak podejrzewałem, ale redukcja zmiennych z 83% zajętości RAM do 52% nie
    zmieniła nic w tym względzie. Ile może zajmować taki stos? ATmega128 ma 4
    KB RAM-u. Polowa pamięci na stos ? Trochę nieprawdopodobne.
    Kilka wersji programu wcześniej, nie było tego złego zjawiska, a zajętość
    RAM-u była ponad 80%. Było sporo drobnych zmian, które nie powinny były
    znacząco wpływać na rozmiar stosu. Ale śledzenie tych zmian to też
    partaninka.



  • 4. Data: 2009-10-13 15:23:27
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: "J.F." <j...@p...onet.pl>

    Użytkownik "Darkac" <d...@w...pl> napisał w wiadomości
    news:hb206d$t7q$1@news.lublin.pl...
    > Użytkownik "DJ" <j...@p...onet.pl> napisał w
    > wiadomości
    >>> Co może powodować ingerencję w wartość zmiennej przez
    >>> procedurę, w której ta zmienna nie występuje?
    >> stos?
    > Tak podejrzewałem, ale redukcja zmiennych z 83% zajętości RAM do
    > 52% nie zmieniła nic w tym względzie. Ile może zajmować taki
    > stos? ATmega128 ma 4 KB RAM-u. Polowa pamięci na stos ? Trochę
    > nieprawdopodobne.

    Stos moze zajmowac dowolnie duzo :-) No nie, sa procki gdzie jest
    maly, ale jesli jest rekurencja, zagniezdzone przerwania i inne
    niespodzianki, to moze rosnac.
    Ale jakby stos zajezdzal zmienna, to zapewne nie ta jedna.

    Dodaj pare zmiennych dookola, zobacz czy tylko ta jedna sie
    zmienia.
    Albo dodaj nowa zmienna, zmien program zeby z niej korzystal, ale
    te zostaw i monitoruj.



    J.


  • 5. Data: 2009-10-13 15:24:39
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: "entroper" <e...@C...spamerom.p0czta.on3t.pll>

    Użytkownik "Darkac" <d...@w...pl> napisał w wiadomości
    news:hb1sbu$qoq$1@news.lublin.pl...

    > Co może powodować ingerencję w wartość zmiennej przez procedurę, w
    której ta > zmienna nie występuje?

    wyjechanie za tablicę / zapis przez źle ustawiony wskaźnik?

    e.


  • 6. Data: 2009-10-13 15:30:10
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: cepu69 <c...@t...pl>

    Darkac wrote:

    > Piszę program na ATmega128 za pomocą edytora AVRSide i kompilatora WinAVR.
    > Program jest juz trochę rozbudowany i zawiły.
    (..)
    > Jedna ze zmiennych ustawiana jest w menu (wyświetlacz LCD i klawiatura
    > multipleksowana) i przyjmuje wartości 1 lub 0.
    Czyli nalezy rozumiec, ze jest to zmienna globalna???

    > Zmienna ta nie występuje w ogóle w tej procedurze. W całym programie
    > jej wartość może być zmieniana ręcznie tylko w pewnym menu które
    > trzeba specjalnie wywołać sekwencją działań.
    "Recznie" to ty musisz ja zmienic, kompilator ja zmienia poprostu tam
    zapisujac ;)
    Chyba ze masz na mysli iz aby dokonac zmiany tej zmiennej trzeba wykonac
    sekwencje polecen, np. jak przy zapisie do pamieci Flash,
    ale wtedy nie mam mowy o Ramie

    > Podejrzewałem że może jest za mało pamięci RAM (zajętość 83%) i
    > coś zaczyna głupieć. Testowo wywaliłem pewne tabele zajmujące sporo RAM-u
    > i uzyskałem 52% zajętości.
    W kwestii wyjasnienia pojec. Tzw. zajetosc RAM nie ma zadnego znaczenia,
    mozesz uzyc 100% RAMu i program bedzie dziala poprawnie - oczywiscie jesli
    rozmiar fizyczny pamieci jest identyczny lub wiekszy niz rozmiar pamieci,
    ktora dysponuje linker.
    Nie mieszaj pojec!!! Zajetosc RAMu mowi tylko ile jeszcze zmiennych czy kodu
    mozesz dodac do swojego programu.

    >Przydałaby się jakaś wskazówka do szukania winnego.
    Czyli pobawmy sie we wrozke;)

    > Co może powodować ingerencję w wartość zmiennej przez procedurę, w której
    > ta zmienna nie występuje?
    1. "Mazanie po pamieci" - uzywany wskaznik albo wsakzyje gdzie indziej niz
    myslisz badz przekroczyles rozmiar obiektu na ktory wskazuje wskaznik.
    Spojrz na mape linkera - gdzie zostala zaalokowana rzeczona zmienna tj. jaka
    zmienna znajduje sie przed nia.
    2. Uzyj grep i sprwadz wszystkie wystapienia inkryminowanej zmiennej - moze
    jednak jest modyfikowna explicite w kodzie.
    3. Czy nie zostal przekroczony rozmiar stosu. Na to ma wplyw glebokosc
    zgniezdzenia funkcji, ilosc zmiennych automatycznych trzymanych na stosie
    itp. a nie zajetosc RAMu przez program!!!

    i najwazniejsze wyslac post na grupe pl.comp.lang.c ;)


  • 7. Data: 2009-10-13 16:48:41
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: Jurek Szczesiul <j...@w...ep.com.pl>

    Tue, 13 Oct 2009 14:37:54 +0200, na pl.misc.elektronika, Darkac napisał(a):

    >
    > Co może powodować ingerencję w wartość zmiennej przez procedurę, w której ta
    > zmienna nie występuje?

    Popatrz na ewentualne bufory, których użycie odbywa się w runtime bez
    możliwości skontrolowania w kodzie : np. bufor do konwersji itoa, bufor
    odbiornika znakowej transmisji szeregowej itp.

    --
    Pozdrowienia
    Jurek Szczesiul


  • 8. Data: 2009-10-13 20:59:38
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: John Smith <d...@b...pl>

    >>>> Co może powodować ingerencję w wartość zmiennej przez procedurę, w
    >>>> której ta zmienna nie występuje?
    >>>
    >>> stos?
    >>
    >> Tak podejrzewałem, ale redukcja zmiennych z 83% zajętości RAM do 52%
    >> nie zmieniła nic w tym względzie. Ile może zajmować taki stos?
    >> ATmega128 ma 4 KB RAM-u. Polowa pamięci na stos ? Trochę
    >> nieprawdopodobne.

    Źle sparametryzowana biblioteczna funkcja printf potrafi zużyć
    dużo stosu. To taki przykład.


    >
    > Dodaj pare zmiennych dookola, zobacz czy tylko ta jedna sie zmienia.
    > Albo dodaj nowa zmienna, zmien program zeby z niej korzystal, ale te
    > zostaw i monitoruj.

    Za to kocham MSP430, w hardware-owym debugerze można ustawić pułapkę
    na zapis do obszaru pamięci i już wiadomo w wyniku jakiej instrukcji
    nastąpił problem. Sprawę rozwiązuje się w chwilkę.

    A błędy na stosie mogą się markować bardzo długo a objawiać
    bardzo rzadko, akurat wtedy gdy nie trzeba.
    K.


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

    >> Dodaj pare zmiennych dookola, zobacz czy tylko ta jedna sie zmienia.
    >> Albo dodaj nowa zmienna, zmien program zeby z niej korzystal, ale te
    >> zostaw i monitoruj.
    >
    > Za to kocham MSP430, w hardware-owym debugerze można ustawić pułapkę
    > na zapis do obszaru pamięci i już wiadomo w wyniku jakiej instrukcji
    > nastąpił problem. Sprawę rozwiązuje się w chwilkę.

    Przeciez korzystajac z JTAG na ATMedze128 moze zrobic to samo...

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


  • 10. Data: 2009-10-13 21:37:16
    Temat: Re: Dlaczego ATmega128 przekłamuje?
    Od: "Ghost" <g...@e...pl>


    Użytkownik "T.M.F." <t...@n...mp.pl> napisał w wiadomości
    news:hb2r8g$g8t$1@nemesis.news.neostrada.pl...
    >>> Dodaj pare zmiennych dookola, zobacz czy tylko ta jedna sie zmienia.
    >>> Albo dodaj nowa zmienna, zmien program zeby z niej korzystal, ale te
    >>> zostaw i monitoruj.
    >>
    >> Za to kocham MSP430, w hardware-owym debugerze można ustawić pułapkę
    >> na zapis do obszaru pamięci i już wiadomo w wyniku jakiej instrukcji
    >> nastąpił problem. Sprawę rozwiązuje się w chwilkę.
    >
    > Przeciez korzystajac z JTAG na ATMedze128 moze zrobic to samo...

    Za to kocham JTAG.

strony : [ 1 ] . 2 ... 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: