Dlaczego ATmega128 przekłamuje?

Bo gcc nie byl projektowany do architektury harvardzkiej i nie ma koncepcji roznych typow pamieci zajmujacych te same adresy. Co byc moze sie zmieni, ale i tak niewiele z tego wyniknie. Natomiast jesli jest to takim problemem to sa platne narzedzia.

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.

Reply to
T.M.F.
Loading thread data ...

Postaraj sie zrozumiec na czym polega problem, bo to co piszesz jest odpowiednikiem populizmu.

Reply to
T.M.F.

struct? i nawet nie przejrzałeś całej strony...

Może jeszcze żeby się program sam napisał, podczas kiedy programista na wakacjach.

Reply to
DJ

Witam!!

Proponuję Tobie zapoznanie się z architekturą AVRów!! To nie jest prosta sprawa w tym procku... są instrukcje LPM i SPM, wymagają adresowania rejestrem Z. To nie jest ARM, w którym wszystko leży w jednej przestrzeni adresowej i możesz odwoływać się do pamięci Flash tak jak do pamięci RAM. Uważam, że dobrze, że pamięć Flash w AVRze obsługuje się nie jak zwykłe zmienne, bo wymusza to na programiście odpowiednie podejście do tego typu zmiennych. Poza tym, język C powinien być standardowy, niezależnie od architektury docelowej. Stała obsługiwana 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??

Jeśli chodzi tylko o zapis liczby, to ja tam wolę pisać 0x31fc zamiast

0011000111111100 ;)...

Hmmm... no to używaj DWUKROPKA :)... albo zrób sobie proste makra... fakt, samemu musisz pogrupować flagi w bajty, no ale przynajmniej możesz w łatwy sposób wpisywać "komplet" wartości... ja to robię na przykład tak - definiuję sobie każdą zmienną stanu oraz kolejne jej bity:

#define STAN_URZADZENIA ucDeviceStatus #define URZADZENIE_WLACZONE 0 #define URZADZENIE_ZAJETE 1 ... #define URZADZENIE_ZEPSUTE 7

później tworzę (wspólne dla wszystkich zmiennych stanu) makra do obsługi:

#define SET_FLAG(x,y) (x) |= (1<<(y)) #define CLR_FLAG(x,y) (x) &= ~(1<<(y)) #defien CHECK_FLAG(x,y) ((x) & (1<<y))

deklaruję zmienną:

unsigned char ucDeviceStatus;

i używam:

SET_FLAG(STAN_URZADZENIA , URZADZENIE_WLACZONE); if (CHECK_FLAG (STAN_URZADZENIA , URZADZENIE_ZAJETE) ) CLR_FLAG (STAN_URZADZENIA, URZADZENIE_ZEPSUTE);

to taki przykład, nie jest to super, ale jest za to czytelne... mniej pisania jest oczywiście, jak się używa DWUKROPKÓW :)...

Pozdrawiam Konop

Reply to
Konop

Darkac pisze:

Bliźniacze procedury - tzn. ta sama procedura wywoływana z różnymi parametrami, czy jednak dwie różne funkcje? Może nie są do końca bliźniacze?? :)...

ZAWSZE zeruje?? Nie używasz gdzieś tablic, wskaźników?? Wystarczy drobna pomyłka, przekazanie jako wskaźnika nie adresu zmiennej tylko jej wartości i już... zapis masz nie tam, gdzie trzeba... przy niesprzyjających okolicznościach możesz zawsze zerować pewną pechową zmienną...

Proponuję to, co już ktoś napisał - zostawić tą zmienną w starym miejscu, dodać nową i używać nową ;)... jak problem zniknie, to łapać moment zapisu do starej zmiennej ;)...

Pozdrawiam Konop

Reply to
Konop

Użytkownik "T.M.F." snipped-for-privacy@nospam.mp.pl> napisał w wiadomości news:hb4gsl$bd$ snipped-for-privacy@atlantis.news.neostrada.pl...

No tak, kopilator i edytor są bezpłatne. Darowanemu koniowi nie zagląda się w zęby. Nie powinienem narzekać.

Reply to
Darkac

Użytkownik "Konop" snipped-for-privacy@gazeta.pl napisał w wiadomości news:hb4j1q$gq2$ snipped-for-privacy@inews.gazeta.pl...

Nie wiem o co chodzi z tym dwukropkiem, możesz przybliżyć?

Reply to
Darkac

Oj, jednak pola bitowe sa czytelniejsze. No i jesli zmienisz ich kolejnosc to nie pociaga to potem zazwyczaj uperdliwej zmiany we wszytkich plikach.

Reply to
T.M.F.

Użytkownik "Konop" snipped-for-privacy@gazeta.pl napisał w wiadomości news:hb4j99$hoj$ snipped-for-privacy@inews.gazeta.pl...

Na tyle są bliźniacze, że mają treść w zasadzie taką samą, ale wszelkie dane, parametry, flagi stanów i tabele na których operują pamiętane są w innym zestawie (A lub B). Jakby się uprzeć, to może dałoby się napisać jedną procedurę, która co chwila musiałaby się pytać, który kanał jest w tym momencie obrabiany albo jako parametry trzeba by przesłać kilkadziesiąt zmiennych. A większość tych parametrów i tak jest globalnych i znów przy wyjściu trzeba by je odzyskiwać z procedury. Historycznie tak było łatwiej i szybciej i bezpieczniej. Najpierw był w programie tylko jeden kanał i kiedy powstała potrzeba dwóch, łatwo było powielić procedurę na dwie i dodać do każdej nie wspólnej w niej zmiennej, końcówkę _a w jednej i _b w drugiej. Pamięci programu jest jeszcze bardzo dużo.

Reply to
Darkac

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.

Reply to
John Smith

W kwestii ogólnej:

To przeciez przesyła się do procedury wskaznik na strukturę i po sprawie. Zamiast kilkudziesięciu zmiennych tylko jeden parametr, nic nie trzeba zwracać, procesor nie musi mielić danych etc Strukturę też mozna banalnie powielać - same plusy.

A zwracać procedura powinna tylko char lub int syknalizującego OK lub ERROR

Pozdrawiam MiSter

Reply to
MiSTER

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.

Reply to
John Smith

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

Reply to
T.M.F.

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

Zartujesz, prawda?

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.

Reply to
T.M.F.

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.

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.

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.

Reply to
John Smith

Jednej? K.

Reply to
John Smith

Czterech.

Reply to
T.M.F.

Masz dokument opisujący OCD w ATMega? K.

Reply to
John Smith

T.M.F. pisze:

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.

Reply to
Adam Dybkowski

W dniu 14.10.2009 23:38, Adam Dybkowski pisze:

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

Reply to
T.M.F.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.