Skocz do zawartości

Wsakżnikii do funkcji w AVR-GCC i ich tablice, struktury


slawek7

Pomocna odpowiedź

Cześć.

Może Wam uda się wytłumaczyć mi umieszczanie wskaźników w pamięci FLASH w uC AVR.

Ma\m problem ze zrozumieniem gdzie te wskaźniki są umieszczane i dlaczego tak się je odczytuje.

Ale od początku. Powiedzmy że mam dwie funkcje typu

void fun1(void);
void fun2(void);

Teraz tworze sobie tablice wskaźników do tych funkcji w postaci:

void (*wsk_funk[2])(void) PROGMEM = {
                         fun1,
                         fun2};

Pytanie pierwsze, gdzie poszczególne części tej tablicy są umieszczone i co dokładnie one oznaczają tzn., czy wsk_fun jest tylko nazwa czy miejscem w pamięci (jakiej)?

Wywołanie funkcji przy pomocy wskaźnika polega na podaniu po prostu

wsk_fun();

Schody i duże wątpliwości pojawiły się po czymś takim z zastosowaniem struktury:

typedef struct
{
char polecenie[8];
int8_t (*wsk_fun)(char, char);
}TATCMD

następnie jest inicjowana taka struktura, a dokładniej tablica struktur:

TATCMD polecenia_at[6] PROGMEM={
{"AT", at_service},
{"AT_I", ati_service} .....//itd
};

No i w końcu wywołanie jakieś funkcji

at_srv=pgm_read_word(&polecenia_at[i].at_service);
at_serv(5,10);

O ile korzystanie z dodatkowego wskaźnika jest dość proste do wytłumaczenia o tyle utknąłem na tym dlaczego w pierwszy przypadku z wykorzystaniem tablicy wskaźników nie korzystamy z makra pgm_read_word natomiast w drugim już musimy. Oba wskaźniki do funkcji są podobno umieszczone w pamięci Flash, więc dlaczego rożne wywołania.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.