WinAvr tablica wskaźników funkcji jak?

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

Reply to
azazel
Loading thread data ...

.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

Reply to
Nickelodeon

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

Pozdrawiam Janusz Brela

Reply to
azazel

azazel pisze:

[...]

Tablicę wskaźników do funkcji umieszczasz we flashu tak samo jak każdą inną stałą - dodając PROGMEM.

formatting link
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.

Reply to
Zbych

Zbych pisze:

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

Reply to
Zbych

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.