Dlaczego ATmega128 przekłamuje?

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
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?


Re: Dlaczego ATmega128 przekłamuje?

Quoted text here. Click to load it

stos?

--
DJ

PS. przy odpisywaniu na priv usun antyspamowy wpis z adresu


Re: Dlaczego ATmega128 przekłamuje?

Quoted text here. Click to load it

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.



Re: Dlaczego ATmega128 przekłamuje?
Quoted text here. Click to load it

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.


Re: Dlaczego ATmega128 przekłamuje?
Quoted text here. Click to load it

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


Quoted text here. Click to load it

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.


Re: Dlaczego ATmega128 przekłamuje?
Quoted text here. Click to load it

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

--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
We've slightly trimmed the long signature. Click to see the full one.
Re: Dlaczego ATmega128 przekłamuje?

Quoted text here. Click to load it

Za to kocham JTAG.


Re: Dlaczego ATmega128 przekłamuje?
Quoted text here. Click to load it

To czemu tego autor wątku nie zrobi, a Wy nie doradzacie od początku?
Już byłoby po problemie.
K.


Re: Dlaczego ATmega128 przekłamuje?
W dniu 14.10.2009 09:51, John Smith pisze:
Quoted text here. Click to load it

Bo to wcale nie jest takie super narzedzie. Wyobraz sobie, ze zmienna
ktora sledzisz jest modyfikowana w wielu miejscach i ciagle twoj program
jest przerywany, mozna zeswierowac sledzac cos takiego.

--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
We've slightly trimmed the long signature. Click to see the full one.
Re: Dlaczego ATmega128 przekłamuje?
Quoted text here. Click to load it

Zawsze da się rozwiązać problem, albo ustawiając pułapkę warunkową,
a jeśli takiej nie można, to można wyłączyć, na czas debugowania,
zapis do zmiennej ze znanych miejsc, a ustawić pułapke na zapis
na zmienną.
Przepelnienie stosu jest o tyle proste do wykrycia, że często jest
nie używany obszar między stertą a zadeklarowanym stosem. Tu
ustawia się pułapke na zapis i po sprawie.
K.


Re: Dlaczego ATmega128 przekłamuje?
Quoted text here. Click to load it

Jaki warunek proponujesz tu zastosowac, zeby wyeliminowac zapisy, ktore
nas nie interesuja?

Quoted text here. Click to load it

Zartujesz, prawda?

Quoted text here. Click to load it

To bys musial ustawic pulapke na zakres adresow, bo przeciez one nie
musza byc zapisywane sekwencyjnie.
Prosciej to zrobic wpisujac do pamieci jakis wzor i sprawdzac okresowo
czy sie nie zmienil.


--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
We've slightly trimmed the long signature. Click to see the full one.
Re: Dlaczego ATmega128 przekłamuje?
Quoted text here. Click to load it

Tak złożonych warunków nie musiałem stosować w EEM ale z dokumentacji widzę,
że to możliwe. Przetestuję w wolnej chwili. Do tej pory nie miałem
takiego problemu programistycznego a więc debugowania. Programy
od początku piszę starannie.


Quoted text here. Click to load it
Nie, to jest proteza na _chwilę_. Program w tym czasie nie musi działać
zgodnie z założeniami. Trzeba wykryć gdzie jest problem i to jest celem.
Sam opis problemu przez Autora wątku, sugeruje radosną twórczość,
w takiej też stylistyce działania powinien szukać błędów.


Quoted text here. Click to load it

W EEM mam ustawioną taką pułapkę (na zapis do obszaru) od początku i wiem
gdzie nawala stos. Zresztą zdarza mi się to tylko z funkcjami bibliotecznymi.
K.


Re: Dlaczego ATmega128 przekłamuje?


Quoted text here. Click to load it

Skutkiem czego nie musi powodowac poszukiwanego bledu.

Quoted text here. Click to load it

90% tfurcow softu na uC robi to bardzo radosnie.



Re: Dlaczego ATmega128 przekłamuje?
T.M.F. pisze:

Quoted text here. Click to load it

Taaa. Tylko od chwili przekroczenia stosu do momentu sprawdzenia, czy
wzór nie został nadpisany (choćbyś to robił nawet co 1 ms), mija
wystarczająco dużo czasu aby program skutecznie poszedł w maliny. Bo
raczej nie ustawiasz ograniczenia małego stosu gdy masz dużo RAMu.

--
Adam Dybkowski
        http://dybkowski.net /

We've slightly trimmed the long signature. Click to see the full one.
Re: Dlaczego ATmega128 przekłamuje?
W dniu 14.10.2009 23:38, Adam Dybkowski pisze:
Quoted text here. Click to load it

To prawda, ale juz bede wiedzial w czym jest problem. W tym przypadku
identyfikacja problemu == jego rozwiazanie.

--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
We've slightly trimmed the long signature. Click to see the full one.
Re: Dlaczego ATmega128 przekłamuje?
Quoted text here. Click to load it

Nie odpowiedziałeś na pytanie, to ja spróbuję.
Twoja miłość do JTAG-a chyba nie jest odwzajemniona, nie widzę
możliwości aby samodzielnie łącze JTAG-a miało możliwości
debugowania w systemie uC. W ATMega jest dodatkowo
moduł OCD w MSP430 jest moduł EEM.
Sugeruję zapoznać się z dokumentem SLAA263B, mozliwości tego modułu
są niesamowite i znacznie przerastają założenie prostej pułapki.
K.


Re: Dlaczego ATmega128 przekłamuje?
Quoted text here. Click to load it

Wszyscy sie niesamowicie z tego powodu cieszymy. ATMega tez umozliwia
zalozenie pulapki warunkowej.

--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
We've slightly trimmed the long signature. Click to see the full one.
Re: Dlaczego ATmega128 przekłamuje?

Quoted text here. Click to load it

Jednej?
K.


Re: Dlaczego ATmega128 przekłamuje?
Quoted text here. Click to load it

Czterech.

--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
We've slightly trimmed the long signature. Click to see the full one.
Re: Dlaczego ATmega128 przekłamuje?



Quoted text here. Click to load it

Masz dokument opisujący OCD w ATMega?
K.


Site Timeline