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]))();
}