problem z funkcjami w C dla 8051
Masz problem? Zapytaj na forum elektroda.pl
From: "KS" <pokajok_at_nospam_interia.pl>
Subject: problem z funkcjami w C dla 8051
Date: Mon, 27 Dec 2004 08:01:52 +0100
Witam,
Piszę program w Keil C dla 8051 i mam następujący problem.
Chcę co pewien czas wywoływać pewien fragment programu.
W tym celu ustawiłem timer T0, wstawiłem procedurę obsługi przerwania i w
tej procedurze umieszczam wywołania interesujących mnie funkcji.
Program jednak nie działa. Po umieszczeniu dyrektywy Pragma SRC w programie,
kompilator generuje plik asemblerowy który jak mi sie wydaje jest
tłumaczeniem programu w C.
W tym tłumaczeniu znalazłem prawdopodobna przyczynę tego że program nie
działa.
W procedurze obsługi przerwania od T0 wywołuję funkcje Task1(), kompilator
tłumaczy to na: Lcall Task1(i według mnie tak ma być).W Task1 wywołuję
funkcje Pomiar() ale kompilator tłumaczy to na LJMP Pomiar. A według mnie
powinien wstawić Lcall pomiar, bo przecież powinien wrócić do tego miejsca
po zakończeniu funkcji Pomiar.
Funkcja Pomiar ładuje rejestry Przetwornika ADC i krązy w pętli sprawdzając
czy został ustawiony znacznik końca przetwarzania AC. Znacznik ten jest
ustawiany w oddzielnej procedurze obsługi przerwania ADC.
Co może być przyczyną takiego działania kompilatora?
KS
From: "Mister" <wojpie_at_nospam_wywal_to.poczta.onet.pl>
Subject: Re: problem z funkcjami w C dla 8051
Date: Mon, 27 Dec 2004 08:38:27 +0100
A w ilu miejscach wywołujesz f-cję pomiar? Jeżeli tylko w jednym to
kompilator dobrze to zrobił.
Raczej szukaj problemu u siebie a nie wiń Keila:-)
Mister
From: "KS" <pokajok_at_nospam_interia.pl>
Subject: Re: problem z funkcjami w C dla 8051
Date: Mon, 27 Dec 2004 09:49:32 +0100
Wywołuję ją jeden raz, ale cyklicznie (cykliczne przerwanie od licznika).
Dlaczego dobrze? Po wykonaniu funkcji Pomiar progran powinien wrócić w do
procedury Task1.
KS
Użytkownik "Mister" <wojpie_at_nospam_wywal_to.poczta.onet.pl> napisał w wiadomości
news:cqoed8$5i2$1_at_nospam_nemesis.news.tpi.pl...
A w ilu miejscach wywołujesz f-cję pomiar? Jeżeli tylko w jednym to
kompilator dobrze to zrobił.
Raczej szukaj problemu u siebie a nie wiń Keila:-)
Mister
From: "peters" <peters_at_nospam_poczta.onet.pl>
Subject: Re: problem z funkcjami w C dla 8051
Date: Mon, 27 Dec 2004 10:54:30 +0100
W procedurze obsługi przerwania od T0 wywołuję funkcje Task1(), kompilator
tłumaczy to na: Lcall Task1(i według mnie tak ma być).W Task1 wywołuję
funkcje Pomiar() ale kompilator tłumaczy to na LJMP Pomiar. A według mnie
powinien wstawić Lcall pomiar, bo przecież powinien wrócić do tego miejsca
po zakończeniu funkcji Pomiar.
A wywolanie Pomiar() nie jest ostatnia instrukcja w funkcji Task1() ?
Jesli jest -to wszystko OK. Zadzialala optymalizacja.
peters
P.S. Bledow szukaj u siebie. Mnie udowodnienie bledu Keilowi zajmuje czasem
dwa miesiace ciezkiej pracy,
upraszczania wlasnego programu tak aby nadal dzialal zle...
From: "KS" <pokajok_at_nospam_interia.pl>
Subject: Re: problem z funkcjami w C dla 8051
Date: Mon, 27 Dec 2004 12:02:00 +0100
Pomiar jest ostatnią funkcja w Task1.
Przyznam że nie rozumię dlaczego kompilator nie wstawia tam Lcall Pomiar.
Ale jesli tak ma być, to gdzie może tkwic bład?
Jeśli funkcja Pomiar() jes twywoływana w funkcji głównej to wszystko jest ok
a jesli w funkcji INT_T0 to program pada.
KS
Użytkownik "peters" <peters_at_nospam_poczta.onet.pl> napisał w wiadomości
news:cqome9$838$1_at_nospam_nemesis.news.tpi.pl...
W procedurze obsługi przerwania od T0 wywołuję funkcje Task1(),
kompilator
tłumaczy to na: Lcall Task1(i według mnie tak ma być).W Task1 wywołuję
funkcje Pomiar() ale kompilator tłumaczy to na LJMP Pomiar. A według
mnie
powinien wstawić Lcall pomiar, bo przecież powinien wrócić do tego
miejsca
po zakończeniu funkcji Pomiar.
A wywolanie Pomiar() nie jest ostatnia instrukcja w funkcji Task1() ?
Jesli jest -to wszystko OK. Zadzialala optymalizacja.
peters
P.S. Bledow szukaj u siebie. Mnie udowodnienie bledu Keilowi zajmuje
czasem
dwa miesiace ciezkiej pracy,
upraszczania wlasnego programu tak aby nadal dzialal zle...
From: "Krzysztof Rudnik" <rudnik_at_nospam_kki.net.pl>
Subject: Re: problem z funkcjami w C dla 8051
Date: Mon, 27 Dec 2004 12:28:20 +0100
Użytkownik "KS" <pokajok_at_nospam_interia.pl> napisał w wiadomości
news:cqoq38$adt$1_at_nospam_news.dialog.net.pl...
Pomiar jest ostatnią funkcja w Task1.
No i dlatego robi JMP - po co wracac do return'a, mozna od razu pietro
wyzej.
Przyznam że nie rozumię dlaczego kompilator nie wstawia tam Lcall Pomiar.
Ale jesli tak ma być, to gdzie może tkwic bład?
Jeśli funkcja Pomiar() jes twywoływana w funkcji głównej to wszystko jest
ok
a jesli w funkcji INT_T0 to program pada.
Nie znam tego procka, czy tam do wykorzystania w przerwaniach funkcja nie
musi
by jakos specjalnie kompilowana (inny return, zachowanie wszystkich
rejestrow itp).
W takiej sytuacji ten JMP bylby faktycznie bledny - program wykona
niewlasciwy RET.
Trche to glupie, ale sprobuj umiescic jakies instrukcje po wywolaniu
Pomiar(), by wymusic
powrot.
Cos wspominales o jakims czekaniu, jesli to jest w procedurze obslugi
przerwania
to nie za dobrze. Jesli tam sie zawiesi (np. nie ustawi sie jakis bit) to
wszystko wisi.
Krzysiek Rudnik
From: "peters" <peters_at_nospam_poczta.onet.pl>
Subject: Re: problem z funkcjami w C dla 8051
Date: Mon, 27 Dec 2004 12:32:48 +0100
Użytkownik "KS" <pokajok_at_nospam_interia.pl> napisał w wiadomości
news:cqoq38$adt$1_at_nospam_news.dialog.net.pl...
Pomiar jest ostatnią funkcja w Task1.
Przyznam że nie rozumię dlaczego kompilator nie wstawia tam Lcall Pomiar.
Czym rozni sie CALL od JMP?
Przy CALL na stosie zapamietywany jest adres powrotu.
Mamy cos takiego:
Taska1:
...
...
lcall Pomiar
ret
Pomiar:
...
ret
Przesledz sobie w myslach co robi procesor, co jest zapamietywane na stosie.
Po co wracac z procedury Pomiar tylko po to by wykonac jedna instrukcje
return?
Zamiast tego robi sie skok a return wykonuje sie juz w procedurze Pomiar.
Efekt identyczny.
Ale jesli tak ma być, to gdzie może tkwic bład?
Jeśli funkcja Pomiar() jes wywoływana w funkcji głównej to wszystko jest
ok
a jesli w funkcji INT_T0 to program pada.
Gdzie? Wszedzie. Dlatego programowanie nie jest latwe.
Nie wiadomo co masz w calej reszcie programu. Jak czesto wywolywane jest
przerwanie i ile czasu zajmuje jego wykonanie.
Nie wiadomo czy nie przepelnia sie stos, czy nie popelniles jakiegos
idiotycznego bledu, np nie dales pustych nawiasow przy wywolaniu funkcji bez
parametrow. :)
peters
From: "Andy" <anokWYTNIJ_at_nospam_ceti.pl>
Subject: Re: problem z funkcjami w C dla 8051
Date: Mon, 27 Dec 2004 14:04:52 +0100
Użytkownik "KS" <pokajok_at_nospam_interia.pl> napisał w wiadomości news:cqoq38$adt$1_at_nospam_news.dialog.net.pl...
Pomiar jest ostatnią funkcja w Task1.
Przyznam że nie rozumię dlaczego kompilator nie wstawia tam Lcall Pomiar.
Ale jesli tak ma być, to gdzie może tkwic bład?
Jeśli funkcja Pomiar() jes twywoływana w funkcji głównej to wszystko jest ok
a jesli w funkcji INT_T0 to program pada.
...
a obsluga przerwania wyrabia sie czasowo ?
wolasz moze fun Pmiar() z glwonej petli jak i z przerwania ?
bo w takiej sytuacji funkcja musi byc "reentrant"
masz jakies warningi przy kompilacji ?
--
Andrzej