-
1. Data: 2009-04-21 19:12:22
Temat: WinAvr tablica wskaźników funkcji jak?
Od: "azazel" <k...@o...pl>
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
-
2. Data: 2009-04-21 19:16:57
Temat: Re: WinAvr tablica wskaźników funkcji jak?
Od: "Nickelodeon" <N...@...b>
"azazel" <k...@o...pl> wrote in message
news:gsl6c8$b2$1@nemesis.news.neostrada.pl...
> 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
-
3. Data: 2009-04-21 19:24:20
Temat: Re: WinAvr tablica wskaźników funkcji jak?
Od: "azazel" <k...@o...pl>
dziekuje bardzo za szybką odpowiedź
ale mi chodziło jak to zrobic w jezyku C
Pozdrawiam
Janusz Brela
-
4. Data: 2009-04-21 19:35:04
Temat: Re: WinAvr tablica wskaźników funkcji jak?
Od: Zbych <a...@o...pl>
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__av
r__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.
-
5. Data: 2009-04-21 20:07:30
Temat: Re: WinAvr tablica wskaźników funkcji jak?
Od: Zbych <a...@o...pl>
Zbych pisze:
> 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__av
r__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]))();
}