logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Srodowisko IAR dla AVR`ow - dane w pamieci

pawel_5 03 Lis 2008 20:59 2177 4
REKLAMA
  • #1 5698491
    pawel_5
    Poziom 13  
    Drodzy koledzy zwracam się z prośbą o pomoc gdyż temat był wielekrotnie poruszany i obszernie opisywany lecz wszystkie posty dotyczą środowiska WinAvr.
    Sprawa wydaje się być widziana w innym świetle gdyż przeczytawszy manuala pt. "AVR IAR C/C++ Compiler" stwierdzam, że nie ma tam mowy o bibliotekach które są potrzebne do umieszczania danych we flashu gwarantując przy tym brak kopiowania zmiennych stałych do RAM`u (struktura Harwrdzka). Sposób wg. manuala w jaaki powinno umieszczać sie stałe we flashu jest natępujący:

    int __flash zmienna_stała;


    a tutaj w RAM`ie

    int __tiny zmienna_tymczasowa;


    Ustosunkowałem się do tego zapisu i wszystko wydaje się ok, ale chciałem zapytać czy ktoś już deklarował zmienne w taki sposób i czy wszystko było dobrze? Czy może mimo wszytsko trzeba korzystać z dodatkowych bibliotek?

    Poza tym jeszcze jedna jest rzecz która wymaga pomocy kolegów doświadczonych w środowisku IAR. Przy deklarowaniu zmiennych w jedej strukturze, w manualu jest napisane,że zmienne deklarowane muszą być zadeklarowane w jedym typie pamieci, to się tyczy rownież wskaźników.
    Więc jeśli deklaruje wskaźnik (RAM) do wcześniej zadeklarowanej tablicy (flash) to muszę użyć specjalnej dyrektywy:

    int __flash *__tiny wskaznik; 


    Oznacza to tyle, wskaźnik umiejscowiony w RAM`ie (tiny)będzie wskazywał na elementy we flashu.
    Niestety tutaj wywala mi taki błąd:

    Error[Be009]: memory attributes not allowed on auto variables or parameters

    oczywiście przy takiej deklaracji:


    int __flash *wskaznik; 


    wskaznik wskazuje na elementy we flashu ale jest umiejscowiony w pamięci domyślnej. Natomiast ja bym chciał mieć pełną kontrolę nad tym co sie dzieje w procku i zależy mi aby używać tej pierwszej dyrektywy. Pytanie jest gdzie robie błąd?

    Z góry dzięki za pomoc!
  • REKLAMA
  • Pomocny post
    #2 5700591
    arturt134
    Poziom 27  
    Używam IAR-a i zdarzyło mi się umieszczać stałe we flashu. Używa się do tego słów __flash lub __farflash. To pierwsze słowo umieszcza stałą w obszarze pierwszych 64kB flash-a (adres <= 0xFFFF), to drugie dalej (adres > 0xFFFF). Różnica jest taka, że dostęp do zmiennej __flash jest nieco szybszy niż __farflash.
    Aha, w mojej wersji IAR-a (2.28A) składnia jest inna:
    __farflash const char zmienna1;
    __flash const char zmienna2;

    Wszystko działa OK.

    Słówko __tiny umieszcza zmienną w pierwszych 256 bajtach RAM-u (o ile dobrze pamiętam). Generalnie pozwala o przyspieszyć adresowanie tych zmiennych (niewiele) więc może być wykorzystane do przechowywania czegoś, do czego czas dostępu jest krytyczny. Najlepiej to co jest w RAM-ie definiuj bez żadnych dodatków, wtedy będziesz miał dostępny cały RAM, a nie tylko 256 bajtów.
    Tu nic nie mogę powiedzieć na temat działania, nigdy nie deklarowałem zmiennych ze słowem __tiny. Ale nie widzę powodu, dla którego miałoby to nie działać.

    A jeżeli chodzi o wskaźnik na flash, to definicja powinna wyglądać tak:
    const unsigned char __farflash* wskaznik;

    Jeżeli wskaźnik ma się znajdować w obszarze tiny, to:
    __tiny const unsigned char __farflash* wskaznik;
  • REKLAMA
  • #3 5720460
    pawel_5
    Poziom 13  
    Dzięki bardzo za odpowiedź:) Siedziałem męczyłem i nadal wyskakuje ten sam błąd:/ Pozostaje mi używać pamięci domyślnej:/ Podejrzewam że gdzieś mam coś źle skonfigurowane.
    Natomiast teraz męczy mnie inny problem, przerwania. Jeśli kolega Artur mógłby zerknąć na post który napisałem byłbym bardzo wdzięczny:
    https://www.elektroda.pl/rtvforum/topic1137786.html
  • REKLAMA
  • Pomocny post
    #4 5724415
    JarekC
    Poziom 32  
    Witam,

    Według mnie powinno być tak (przykład dla stałych tekstowych):
    
    
    static __tinyflash char str1[] = "Stała pierwsza w pamieci FLASH";
    static __tinyflash char str2[] = "Stała druga w pamieci FLASH";
    char   __tinyflash *str;   // wskaźnik do stałej w pamięci FLASH
    
    void main( void )
    {
      str=str1;      //przykładowe zainicjowanie wskaźnika
      
      while (1);
    }


    Pozdrawiam
    JarekC
  • #5 5724442
    pawel_5
    Poziom 13  
    Ktoś tu jest magiem:) Ile czasem trzeba czasu spędzić, po nocach siedzieć i się nie dojdzie!

    Przykład JarkaC działa i nie wywala już błedów.
    Polecam ten sposób potomnym:)
    Pozdrawiam i bardzo dziękuję:)
REKLAMA