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 Previous  1, 2

Patryk Sielski
Guest

Fri Mar 02, 2007 11:58 am   



marcinuh <marcinuh@o2.pl> pisze:
Quote:
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.

b8e: c7 36 cpi r28, 0x67 ; 103
b90: d1 05 cpc r29, r1
b92: a4 f4 brge .+40 ; 0xbbc
b94: c1 36 cpi r28, 0x61 ; 97
b96: d1 05 cpc r29, r1
b98: 54 f5 brge .+84 ; 0xbee
b9a: ca 35 cpi r28, 0x5A ; 90
b9c: d1 05 cpc r29, r1
b9e: 09 f4 brne .+2 ; 0xba2


Quote:
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.

To, żeby to przepisać jako funkcje już myślałem, alke to strasznie dużo
roboty jest i trzeba nieco pozmieniać te funkcje, bo czasem jeden rozkaz
wykonuje też i inny, ktgóry jest dalej.

BTW: Chyba zapytam za dwa tygodznie, jak wątek będzie świeży i zaznaczę,
że nie chodzi i o przepisanie tego na funkcję, bo z uporem godnym
lepszje sprawy proponuje mi sie te funkcje mimo, ze napisalem, że to
ostateczność.

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

J.F.
Guest

Fri Mar 02, 2007 12:41 pm   



On Thu, 01 Mar 2007 23:20:41 +0100, Patryk Sielski wrote:
Quote:
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

Jesli problemem jest dlugie "wykonanie rozkazu" to
mozesz wstepnie transkodowac do jednego protokolu..

Quote:
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.

Kompilator powinien ocenic i zoptymalizowac. Czesto mu
wyjdzie ze tak jak powyzej jest najlepiej.

Quote:
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.

Ogolnie C nie przewiduje.

J.

Guest

Fri Mar 02, 2007 1:15 pm   



On 2 Mar, 12:41, J.F. <jfox_xnosp...@poczta.onet.pl> wrote:
Quote:
On Thu, 01 Mar 2007 23:20:41 +0100, Patryk Sielski wrote:

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.

Ogolnie C nie przewiduje.


Ogólnie to owszem. Ale gcc posiada rozszerzenie, które w tym przypadku
może się nadać - skoki wyliczane. Wygląda to mniej więcej tak:

void *gdzie;

gdzie = &&etykieta;

...

if (costam) goto *gdzie;

...

etykieta: /* tu dalszy ciag programu */

Nie żeby kod miał przez to ładniej wyglądać, ale do interpretera może
się nadać.

Szeluś

Patryk Sielski
Guest

Fri Mar 02, 2007 1:39 pm   



szelus@googlemail.com pisze:
Quote:
Ogólnie to owszem. Ale gcc posiada rozszerzenie, które w tym przypadku
może się nadać - skoki wyliczane. Wygląda to mniej więcej tak:

MISZCZ!

Dzięki!

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

Artur M. Piwko
Guest

Fri Mar 02, 2007 1:41 pm   



In the darkest hour on Thu, 01 Mar 2007 20:35:46 +0100,
Virus_7 <virus_7@WYTNIJ_TO.o2.pl> screamed:
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:"?


Źle uczyli. Przydaje się min. w sytuacji gdy chcesz zrobić
wielopoziomowy break lub nie chcesz dublować pewnych instrukcji
w instukcjach warunkowych obsługujących błąd w funkcji.
To oczywiście tylko niektóre z przykładów kiedy wolę goto.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:226B ]
[ 13:29:48 user up 11268 days, 1:24, 1 user, load average: 0.06, 0.06, 0.06 ]

If it wasn't so cold out today, it would be warmer.

Virus_7
Guest

Fri Mar 02, 2007 5:16 pm   



Artur M. Piwko napisał(a):
Quote:
Źle uczyli. Przydaje się min. w sytuacji gdy chcesz zrobić
wielopoziomowy break lub nie chcesz dublować pewnych instrukcji
w instukcjach warunkowych obsługujących błąd w funkcji.
To oczywiście tylko niektóre z przykładów kiedy wolę goto.

Ok. Przyjmuję do wiadomości. ;)

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

Adam Wysocki
Guest

Fri Mar 02, 2007 7:41 pm   



Spinacz biurowy, Patryk Sielski <psielski-usun@elka-usun.pw.edu.pl>!

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

Jeżeli potrzebujesz wskoczyć w środek jakiejś funkcji z innej funkcji to
znaczy, że funkcja jest źle zaprojektowana.

Funkcja to czarna skrzynka. Opcjonalnie dostaje coś na wejście, robi coś
i opcjonalnie zwraca coś na wyjściu.

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

Jeżeli naprawdę bardzo potrzebujesz, to sparametryzuj te skoki.

enum egoto {
GOTO1,
/* ... */
};

typedef enum egoto goto_t;

void f2(goto_t arg)
{
if (arg == GOTO1)
goto etyk1;

/* ... */

etyk1:
/* ... */
}

void f1(void)
{
f2(GOTO1);
}

--
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
Pozbawił mnie sygnaturki strzał z dwururki (C) tren R @ appm 03.2003

Adam Wysocki
Guest

Fri Mar 02, 2007 7:41 pm   



Spinacz biurowy, Patryk Sielski <psielski-usun@elka-usun.pw.edu.pl>!

Quote:
O wiele szybciej byłoby zrobić tabelę i po prostu jechać po tabeli,
jak się znajdzie - skok.

A jeszcze szybciej wyszukiwać binarnie...

A jeszcze szybciej sparametryzować tabelę rozkazem.

#include <stdio.h>

static void hnd1(int param) { printf("hnd1, param=%d\n", param); }
static void hnd2(int param) { printf("hnd2, param=%d\n", param); }
static void hnd3(int param) { printf("hnd3, param=%d\n", param); }

static void parse(unsigned int rozkaz, int param)
{
typedef void (*fn_t) (int param);

const fn_t fn[] = {
hnd1, hnd2, hnd3
};

if (rozkaz >= sizeof(fn) / sizeof(*fn)) {
printf("blad\n");
return;
}

fn[rozkaz](param);
}

int main(void)
{
parse(0, 123);
parse(1, 456);
parse(2, 789);
parse(3, 0);

return 0;
}

Po uruchomieniu:

[gophi@avenger ~]$ ./dupa
hnd1, param=123
hnd2, param=456
hnd3, param=789
blad
[gophi@avenger ~]$

--
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
ciezko wsunac pinezke pod kogos juz siedzacego (C) megan @ afhmm 2k3

Adam Wysocki
Guest

Fri Mar 02, 2007 7:41 pm   



Spinacz biurowy, Patryk Sielski <psielski-usun@elka-usun.pw.edu.pl>!

Quote:
BTW: Chyba zapytam za dwa tygodznie, jak wątek będzie świeży i zaznaczę,
że nie chodzi i o przepisanie tego na funkcję, bo z uporem godnym
lepszje sprawy proponuje mi sie te funkcje mimo, ze napisalem, że to
ostateczność.

Bo to jest naprawdę dużo lepszy pomysł.

--
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
Pozbawił mnie sygnaturki strzał z dwururki (C) tren R @ appm 03.2003

identyfikator: 20040501
Guest

Sat Mar 03, 2007 4:47 pm   



a przy okazji, ktoś tu wspominał jak wstawia się fragmenty
assemblerowe do programu w C?

Marcin Stanisz
Guest

Sat Mar 03, 2007 7:49 pm   



On Sat, 3 Mar 2007 16:47:25 +0100, identyfikator: 20040501 wrote:

Quote:
a przy okazji, ktoś tu wspominał jak wstawia się fragmenty
assemblerowe do programu w C?

Jest to opisane w manualu do avr-libc...

Pozdrawiam
Marcin Stanisz

--
"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"

Goto page Previous  1, 2

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