RTV forum PL | NewsGroups PL

Jak uzyskać adres etykiety w kodzie AVR-GCC dla dynamicznego skakania?

[avr-gcc] adres instrukcji

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak uzyskać adres etykiety w kodzie AVR-GCC dla dynamicznego skakania?

Goto page 1, 2  Next

Patryk Sielski
Guest

Thu Mar 01, 2007 6:28 pm   



Mam jak sobie taki problem:

etykietaa: instrukcja1a;instrukcja2a;instrukcja3a;
etykietab: instrukcja1b;instrukcja2b;instrukcja3b;
etykietac: instrukcja1c;instrukcja2c;instrukcja3c;

no mogę sobie skoczyć tam rozkazem goto etykieta

Fajnie, ale ja potrzebuję zrobić sobie tabelę i skakać
pod odpowiednie, zależne od danej sytuacji adresy.
Chciałbym zrobić coś takiego:

void * adresy[]={etykietaa,etykietab,etykietac};

To jednak nie działa, bo etykiety są jakimś dziwnym tworem
(nie adresem) i rozmawiają tylko z goto.


Pytanie jest takie:
W jaki sposób pozyskać adres pewnego miejsca w programie w momencie
kompilacji?

--
Pozdrawiam,
Patryk Sielski
http://usprawnienia.pl

Virus_7
Guest

Thu Mar 01, 2007 8:35 pm   



Patryk Sielski napisał(a):
Quote:
W jaki sposób pozyskać adres pewnego miejsca w programie w momencie
kompilacji?

Z tego co mnie uczyli, to nie powinno się używać instrukcji goto w takim
języku jakim jest C. Nie można tego rozwiązać inaczej? Konstrukcja
"switch() + case:"?

--
__ ___ * Pozdrawiam * ____
\ \ / (_)_ _ _ _ ___ |__ | mailto://rot13.ivehf_7@b2.cy/
\ V /| | '_| || (_-< ___ / / http://www.b3d.pl/
\_/ |_|_| \_,_/__/|___|/_/ gg://2812776/

Patryk Sielski
Guest

Thu Mar 01, 2007 8:46 pm   



Virus_7 <virus_7@wytnij_to.o2.pl> pisze:
Quote:
Patryk Sielski napisał(a):
W jaki sposób pozyskać adres pewnego miejsca w programie w momencie
kompilacji?

Z tego co mnie uczyli, to nie powinno się używać instrukcji goto w takim
języku jakim jest C. Nie można tego rozwiązać inaczej? Konstrukcja
"switch() + case:"?

Można, ale wymagać to będzie z 50MHz i 30 kB kodu i źródła trzeba będzie
wygenerować.

Pytanie pozostaje aktualne.

--
Pozdrawiam,
Patryk Sielski
http://usprawnienia.pl

Guest

Thu Mar 01, 2007 9:00 pm   



Quote:
Pytanie jest takie:
W jaki sposób pozyskać adres pewnego miejsca w programie w momencie
kompilacji?

Użyć funkcji ?


inline void etykietaA(void) {instrukcja1a;instrukcja2a;instrukcja3a;}
inline void etykietaB(void) {instrukcja1b;instrukcja2b;instrukcja3b;}
inline void etykietaC(void) {instrukcja1c;instrukcja2c;instrukcja3c;}

void (*funkcje[])(void)={etykietaA, etykietaB, etykietaC};

int main(void)
{
(*funkcje[0])();
(*funkcje[1])();
(*funkcje[2])();
}

--
Pozdrowienia
Jarek Juda


--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Guest

Thu Mar 01, 2007 9:27 pm   



Albo bardziej podobne do działania goto :


inline void etykietaC(void) {instrukcja1c;instrukcja2c;instrukcja3c;}
inline void etykietaB(void) {instrukcja1b;instrukcja2b;instrukcja3b;etykietaC();}
inline void etykietaA(void) {instrukcja1a;instrukcja2a;instrukcja3a;etykietaB();}

void (*funkcje[])(void)={etykietaA, etykietaB, etykietaC};


Mam nadzieję, że kompilator też mnie zrozumie.

--
Pozdrowienia
Jarek Juda


--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Krzysiek
Guest

Thu Mar 01, 2007 10:04 pm   



W dniu 01-03-2007 20:35, Virus_7 napisał:

Quote:
W jaki sposób pozyskać adres pewnego miejsca w programie w momencie
kompilacji?

Z tego co mnie uczyli, to nie powinno się używać instrukcji goto w takim
języku jakim jest C. Nie można tego rozwiązać inaczej? Konstrukcja
"switch() + case:"?

A ja uważam, że w pewnych wypadkach (na przykład wychodzenie ze
złożonych zagnieżdżonych pętli/innych struktur) GOTO jest niezastąpione.

--
Pozdrawiam
Krzysiek

marcinuh
Guest

Thu Mar 01, 2007 10:18 pm   



Użytkownik "Patryk Sielski" <psielski-usun@elka-usun.pw.edu.pl> napisał w
wiadomości news:b03d6$45e70d28$57ceab2d$10355@news.chello.pl...
Quote:
void * adresy[]={etykietaa,etykietab,etykietac};

Z ciekawości zapytam: możesz trochę przybliżyć problem? Jeżeli switch - case
(który robi właśnie to co chcesz uzyskać - w zależności od kompilatora (a
raczej jego zgodności z ansi) można naprawdę cuda tym uzyskać, poszukaj
czegoś nt. mechanizmu duffy'ego) i wskaźniki do funkcji nie są w stanie
załatwić sprawy, to problem na pewno jest ciekawy.
pzdr,
marcin

Adam Wysocki
Guest

Thu Mar 01, 2007 10:41 pm   



Spinacz biurowy, Virus_7 <virus_7@wytnij_to.o2.pl>!

Quote:
Z tego co mnie uczyli, to nie powinno się używać instrukcji goto w takim
języku jakim jest C.

Źle uczyli. Są sytuacje, w których goto w C jest najbardziej przejrzyste
(głównie cleanup). Np.

if (warunek1)
goto err1;

alloc_zasob_1();
if (warunek3)
goto err2;

alloc_zasob_2();
if (warunek3)
goto err3;

return 0;

err3:
free_zasob_2();
err2:
free_zasob_1();
err1:
return -1;

--
Adam Wysocki * Warszawa * http://www.chmurka.net/ * GSM: 514 710 213
FidoNet: 2:480/138, SWL: SP5-250730, QTH: KO02MF, CB: 19 Śródmieście
Gophi ma bogaty wybór odchyłów od przeciętności (C) Keyop @ aph 2003

Patryk Sielski
Guest

Thu Mar 01, 2007 11:04 pm   



jarojuda@tlen.pl pisze:
Quote:
Użyć funkcji ?

inline void etykietaA(void) {instrukcja1a;instrukcja2a;instrukcja3a;}
inline void etykietaB(void) {instrukcja1b;instrukcja2b;instrukcja3b;}
inline void etykietaC(void) {instrukcja1c;instrukcja2c;instrukcja3c;}

void (*funkcje[])(void)={etykietaA, etykietaB, etykietaC};

int main(void)
{
(*funkcje[0])();
(*funkcje[1])();
(*funkcje[2])();

Tak, to jest rozwiązanie, aczkolwiek ma pewne wady, ponieważ nie mogę wskoczyć
w środek funkcji na przykład

etyk1:
bla();
etyk2:
bla2();
etyk3:
bla();
return;

--
Pozdrawiam,
Patryk Sielski
http://usprawnienia.pl

Patryk Sielski
Guest

Thu Mar 01, 2007 11:20 pm   



marcinuh <marcinuh@o2.pl> pisze:
Quote:
U?ytkownik "Patryk Sielski" <psielski-usun@elka-usun.pw.edu.pl> napisa? w
wiadomo?ci news:b03d6$45e70d28$57ceab2d$10355@news.chello.pl...
void * adresy[]={etykietaa,etykietab,etykietac};

Z ciekawo?ci zapytam: mo?esz troch? przybli?y? problem? Je?eli switch - case
(który robi w?a?nie to co chcesz uzyska? - w zale?no?ci od kompilatora (a
raczej jego zgodno?ci z ansi) mo?na naprawd? cuda tym uzyska?, poszukaj
czego? nt. mechanizmu duffy'ego) i wska?niki do funkcji nie s? w stanie
za?atwi? sprawy, to problem na pewno jest ciekawy.

OK, jest to interpreter pewnych protokołów.
Protokołów jest kilka. Rozkazów do wykonania-full.

W tej chwili jest tak:

switch (rozkaz)

case 'A' : wykonanie rozkazu 'A';break;
case 'B' : wykonanie rozkazu 'B';break;
case 'C' : wykonanie rozkazu 'C';break;
case 'D' : wykonanie rozkazu 'D'; // i jedziemy dalej wykonując rozkaz E
case 'E' : wykonanie rozkazu 'E';break;

wady rozwiązania:

1) na każdy protokół muszę mieć osobnego switcha
2) ten switch optymalizuje się tak dziwnie, że
argument porównywany jest kolejno z każdymi casem.
Na każdy case jest porównanie i skok i tak dalej.
Trwa to trochę. O wiele szybciej byłoby zrobić tabelę
i po prostu jechać po tabeli, jak się znajdzie - skok.

Funkcje są pewnym rozwiązaniem, ale spowoduje to zbyt duże przypisywanie
kodu, tak więc szukam czegoś, żeby tylko te 'case' zamienić na jakieś
etykiety.

--
Pozdrawiam,
Patryk Sielski
http://usprawnienia.pl

Lukasz Sokol
Guest

Thu Mar 01, 2007 11:56 pm   



Patryk Sielski wrote:

Quote:

1) na kady protokó musz mie osobnego switcha
2) ten switch optymalizuje si tak dziwnie, e
argument porównywany jest kolejno z kadymi casem.
Na kady case jest porównanie i skok i tak dalej.
Trwa to troch. O wiele szybciej byoby zrobi tabel
i po prostu jecha po tabeli, jak si znajdzie - skok.

Jechac po tabeli, to tez porownania przeciez. To juz lepszy by byl ten
switch na oko patrzac.

Albo przepisac ten kawalek jako wstawke assemblerową.

el es

Patryk Sielski
Guest

Fri Mar 02, 2007 12:35 am   



Lukasz Sokol <el_es@poczta.onet.pl> pisze:
Quote:
1) na ka?dy protokó? musz? mie? osobnego switcha
2) ten switch optymalizuje si? tak dziwnie, ?e
argument porównywany jest kolejno z ka?dymi casem.
Na ka?dy case jest porównanie i skok i tak dalej.
Trwa to troch?. O wiele szybciej by?oby zrobi? tabel?
i po prostu jecha? po tabeli, jak si? znajdzie - skok.

Jechac po tabeli, to tez porownania przeciez. To juz lepszy by byl ten
switch na oko patrzac.

No nie, bo generuje dużo kodu.

--
Pozdrawiam,
Patryk Sielski
http://usprawnienia.pl

Lukasz Sokol
Guest

Fri Mar 02, 2007 9:25 am   



Patryk Sielski wrote:
Quote:
Lukasz Sokol <el_es@poczta.onet.pl> pisze:

1) na ka?dy protokó? musz? mie? osobnego switcha
2) ten switch optymalizuje si? tak dziwnie, ?e
argument porównywany jest kolejno z ka?dymi casem.
Na ka?dy case jest porównanie i skok i tak dalej.
Trwa to troch?. O wiele szybciej by?oby zrobi? tabel?
i po prostu jecha? po tabeli, jak si? znajdzie - skok.

Jechac po tabeli, to tez porownania przeciez. To juz lepszy by byl ten
switch na oko patrzac.


No nie, bo generuje duo kodu.

No to wstawka assemblerowa. Poszukaj, widzialem w jakims przykladzie,

jak z pod wstawki wywolywac procedure zdefiniowaną gdzies indziej w c.

el es

marcinuh
Guest

Fri Mar 02, 2007 9:41 am   



Użytkownik "Patryk Sielski" <psielski-usun@elka-usun.pw.edu.pl> napisał w
wiadomości news:28f1c$45e7634b$57ceab2d$31820@news.chello.pl...
Quote:
Lukasz Sokol <el_es@poczta.onet.pl> pisze:
Jechac po tabeli, to tez porownania przeciez. To juz lepszy by byl ten
switch na oko patrzac.

No nie, bo generuje dużo kodu.

Hmm, a możesz wrzucić przykład jak się w AVR-GCC kompiluje case? w mcc18 to
jest xor dla porównania i skok - trudno coś mniejszego i szybszego by było.
Rozumiem o co Ci chodzi, chciałbyś np. rozkazu użyć jako indeksu w tablicy,
tablice byłyby tworzone po jednej dla kazdego protokołu. Proponuję tablice
wskaźników do funkcji, jeżeli zadeklarujesz je jako void od(void), to nie
masz praktycznie żadnego narzutu w kodzie i czasie na wywołanie i powrót z
funkcji - nie trzeba pchać na stos parametrów ani zwracać wartości...
W takich sytuacjach zawsze staram się pamiętać o maksymie wyczytanej w
książce na temat programowania kernela - "do not try to be too smart" Wink.
pzdr,
marcin

Patryk Sielski
Guest

Fri Mar 02, 2007 11:52 am   



Lukasz Sokol <el_es@poczta.onet.pl> pisze:
Quote:
No to wstawka assemblerowa. Poszukaj, widzialem w jakims przykladzie,
jak z pod wstawki wywolywac procedure zdefiniowaną gdzies indziej w c.

To ja potrafię, ale jak pozyskać ten adres?????
Ale nie funkcji, ale pewnego miejsca w programie.

--
Pozdrawiam,
Patryk Sielski
http://usprawnienia.pl

Goto page 1, 2  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Jak uzyskać adres etykiety w kodzie AVR-GCC dla dynamicznego skakania?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map