WinAvr tablica wskaźników funkcji jak?

Apr 21, 2009 4 Replies

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



.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

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

Pozdrawiam Janusz Brela

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.

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required