RTV forum PL | NewsGroups PL

Jak zrealizować wywoływanie funkcji z tablicy wskaźników w pamięci flash ATmega128 w WinAvr?

WinAvr tablica wskaźników funkcji jak?

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak zrealizować wywoływanie funkcji z tablicy wskaźników w pamięci flash ATmega128 w WinAvr?

azazel
Guest

Tue Apr 21, 2009 8:12 pm   



Witam

Chciałbym umiescic sobie w pamieci flash np atmega128 tablice wskaźników do
funkcji
, aby być w stanie uruchamiac procedury mając tylko pozycje w tablicy.

Ma to być program odbierajacy dane z RS232 i uruchamiajacy procedury bez
zbednego "switch'owania"

udało mi sie stworzyc taka tablice i wywoływanie po numerze z pamieci ram
ale nie wiem jak to umiescic w pamieci flash i uruchamiac procedury majac
tylko pozycje

Może ktoś z szanownych grupowiczów wie
jak to umieścić i jak wywołac?

Pozdrawiam
Janusz Brela

Nickelodeon
Guest

Tue Apr 21, 2009 8:16 pm   



"azazel" <klikaz@o2.pl> wrote in message
news:gsl6c8$b2$1@nemesis.news.neostrada.pl...

Quote:
Może ktoś z szanownych grupowiczów wie
jak to umieścić i jak wywołac?



..org 0x0200

nop
ldi r16,0
.....

org 0x0400
nop
nop
nop
itd

pamietaj, że adres we flashu jest wyższy o połowę niż zadeklarujesz, bo
adresujesz 16bitowo

azazel
Guest

Tue Apr 21, 2009 8:24 pm   



dziekuje bardzo za szybką odpowiedź
ale mi chodziło jak to zrobic w jezyku C

Pozdrawiam
Janusz Brela

Zbych
Guest

Tue Apr 21, 2009 8:35 pm   



azazel pisze:

Quote:
udało mi sie stworzyc taka tablice i wywoływanie po numerze z pamieci ram
ale nie wiem jak to umiescic w pamieci flash i uruchamiac procedury majac
tylko pozycje
[...]
Może ktoś z szanownych grupowiczów wie
jak to umieścić i jak wywołac?

Tablicę wskaźników do funkcji umieszczasz we flashu tak samo jak każdą
inną stałą - dodając PROGMEM.
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

Wywoływanie jest trochę bardziej upierdliwe. Najpierw musisz obliczyć
adres wskaźnika we flashu, potem podać adres do makra pgm_read_word i
dopiero mając wskaźnik możesz użyć go do wywołania funkcji.

Zbych
Guest

Tue Apr 21, 2009 9:07 pm   



Zbych pisze:
Quote:
azazel pisze:

udało mi sie stworzyc taka tablice i wywoływanie po numerze z pamieci ram
ale nie wiem jak to umiescic w pamieci flash i uruchamiac procedury
majac tylko pozycje
[...]
Może ktoś z szanownych grupowiczów wie
jak to umieścić i jak wywołac?

Tablicę wskaźników do funkcji umieszczasz we flashu tak samo jak każdą
inną stałą - dodając PROGMEM.
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

Wywoływanie jest trochę bardziej upierdliwe. Najpierw musisz obliczyć
adres wskaźnika we flashu, potem podać adres do makra pgm_read_word i
dopiero mając wskaźnik możesz użyć go do wywołania funkcji.


Tutaj masz przykład:

#include <avr/io.h>
#include <avr/pgmspace.h>


void a( void ){
PORTC = 0xFF;
}

void b( void ){
PORTC = 0x00;
}


typedef void (*fp)(void);

const PROGMEM fp Tab[]={&a,&b};


void main( void ){

((fp)pgm_read_word(&Tab[0]))();
((fp)pgm_read_word(&Tab[1]))();
}

elektroda NewsGroups Forum Index - Elektronika Polska - Jak zrealizować wywoływanie funkcji z tablicy wskaźników w pamięci flash ATmega128 w WinAvr?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map