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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.