eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaCzy WinAVR radzi sobie z kodem dla ATMega128?Re: Czy WinAVR radzi sobie z kodem dla ATMega128?
  • Data: 2009-01-27 15:36:45
    Temat: Re: Czy WinAVR radzi sobie z kodem dla ATMega128?
    Od: "T.M.F." <t...@n...mp.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Dariusz Zolna pisze:
    > Adam Dybkowski pisze:
    >> No to pozostaje korzystać z pgm_read_byte_far() i podobnych. Uważaj
    >> też na funkcje typu strcpy_P, printf_P, memcpy_P itd - nie zadziałają
    >> bo trzeba im podać wskaźniki 16- a nie 32-bitowe. Podobnie bez
    >> dodatkowego "obejścia" nie zadziałają wskaźniki na funkcje, używane
    >> np. w tablicach skoków. Ot taka "zaleta" dużej pamięci w procku bądź
    >> co bądź 8/16-bitowym. Przerabiałem to ostatnio w zdwojonej formie
    >> walcząc z jeszcze większym ATmega2561.
    >
    > Tak, już napisałem swoje wersje tych wszystkich funkcji (przynajmniej
    > tych, które używam). Szkoda tylko, że kompilator nie przypomina o tym.

    Nie ma jak. Zobacz jak wyglada definicja tych funkcji. Jedyna mozliwosc
    to wywalanie ostrzezenia przez sama biblioteke przy wywolywaniu ich na
    procesorach z >64kB FLASH. Co zreszta ma maly sens, bo gcc domyslnie
    umieszcza stale na poczatku programu, czyli dopoki one nie przekrocza
    64kB korzystanie z wersji near tych funkcji jest zupelnie ok. Z kolei
    wersje far sa bezpieczne (chociaz nie wiem czy dzialaja na procesorach
    do 64kB FLASH), ale czasochlonniejsze i FLASHochlonniejsze.
    Natomiast jesli korzystales z wersji near, a wskaznik miales
    zadeklarowany prawidlowo jako 32-bitowy to kompilator musial wywalic
    ostrzezenie (chyba, ze je blokujesz). Tak czy siak, winny byles ty :)

    > A właśnie, jak zrobić wskaźniki do funkcji w tablicach? Wprawdzie teraz
    > nie korzystam z tego, ale może się przydać na przyszłość. Dla wskaźników
    > w parametrach funkcji mam zrobione makro (choć też troche upierdliwe w
    > użyciu, bo stringi muszę teraz mieć ponazywane, a nie umieszczone jako
    > PSTR("...") bezpośrednio w wywołaniu funkcji).

    Np. tak:
    const FuncPtr FuncPtrTable[] PROGMEM=
    {f1, f2, f3};

    I wywolanie:
    FPtr=(FuncPtr)pgm_read_word(&FuncPtrTable[funcno]);

    *FPtr();

    BTW. A propos twojego bootloadera. Piszesz, ze jest strasznie dlugi.
    Wiesz, ze w tej sekcji musi byc tylko maly fragment wykonujacy SPM,
    raptem pare bajtow, cala reszta moze byc w normalnej pamieci, co
    ogranicza rozmiar bootloadera.

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: