WinAvr tablica wskaźników funkcji jak?

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
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



Re: WinAvr tablica wskaźników funkcji jak?


Quoted text here. Click to load it


.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



Re: WinAvr tablica wskaźników funkcji jak?
dziekuje bardzo za szybką odpowiedź
ale mi chodziło jak to zrobic w jezyku C

Pozdrawiam
Janusz Brela



Re: WinAvr tablica wskaźników funkcji jak ?
azazel pisze:

Quoted text here. Click to load it
[...]
Quoted text here. Click to load it

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.


Re: WinAvr tablica wskaźników funkcji jak ?
Zbych pisze:
Quoted text here. Click to load it

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[]=;


void main( void ){

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

Site Timeline