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

[ATMEGA168][AVRGCC] Tablice we Flashu

Piotr Piechota 10 Paź 2008 17:09 1971 8
  • #1 5618510
    Piotr Piechota
    Poziom 22  
    Witam

    Walczę z kretami na działce. Buduję elektronicznego odstraszacza. Procesorek AVR + mostek H z mosfetów + głośnik niskotonowy. Chcę w pamięci Flash zapisać próbki dźwięku (ok 8kb). W związku z 16 bitową organizacją pamięci czy zapisanie w pamięci danych 8 bitowych spowoduje utratę 50% miejsca czy kompilator (GCC) to jakoś zoptymalizuje. Oczywiście mogę zapisać to w tablicy int i potem bajty wyłuskiwać.

    Pozdrawiam
    Piotr
  • #2 5618699
    Pijopic
    Poziom 17  
    Adresowanie a nie organizacja jest 16-to bitowe...
  • #3 5619134
    Piotr Piechota
    Poziom 22  
    Pijopic napisał:
    Adresowanie a nie organizacja jest 16-to bitowe...


    Poprawiłeś pytanie dzięki :) ale odpowiedzi nie udzieliłeś
    Może angielski nie jest moją mocną stroną ale tak zrozumiałem datasheet'a:
    Cytat:
    The ATmega48/88/168 contains 4/8/16K bytes On-chip In-System Reprogrammable Flash
    memory for program storage. Since all AVR instructions are 16 or 32 bits wide, the Flash is organized
    as 2/4/8K x 16.
  • #4 5619188
    Pijopic
    Poziom 17  
    Odpowiedzi udzielilem, angielski nie jest twoja mocna strona :P
  • Pomocny post
    #5 5619253
    BoskiDialer
    Poziom 34  
    Pamięć jest zorganizowana w komórki 16-bitowe, objawia się to np tym że wskaźnik programu wskazuje na słowo (2 bajty) a nie na bajt. Wszystkie instrukcje muszą być więc wyrównane do granicy dwóch bajtów. Jakkolwiek z poziomu samego programu pamięć flash jest zorganizowana bajtami, więc spokojnie można w niej umieszczać tablice bajtów bez utraty pamięci. Oznacza to, że są dwa spojrzenia na tą samą pamięć: przy wykonywaniu skoków po wskaźniku (icall, ijmp) wskaźnik Z musi wskazywać na słowo, wskaźnik programu wskazuje na słowo, ale przy dostępie do flash przez /lpm/ adresy są liczone bajtami (ściśle: adres jest przeliczany wewnętrznie: 15 najwyższych bitów to wybór słowa, najniższy bit to wybór bajtu w słowie). Często w kodzie napisanym w asemblerze widać mnożenie adresu tablicy przez dwa lub przesuwanie o jeden w lewo, to jest właśnie zamiana z adresu na słowo (stosowanego wewnętrznie przez np kompilator z avrstudio) na adres na bajt (dla lpm).

    Jest to trochę zamieszane, odpowiedzią jest więc: przy tablicy z komórkami bajtowymi nie stracisz na objętości. Nie musisz dodatkowo wnikać - po prostu zrób tablicę z bajtami, resztą zajmie się gcc.
  • #6 5619263
    Piotr Piechota
    Poziom 22  
    Jako że angielski nie jest moją mocną stroną znalazłem po polsku:

    Cytat z: "Mikrokontrolery dla początkujących" autorstwa Piotra Góreckiego na temat 90S2314
    Cytat:
    Pamięć FLASH to pamięć programu. Omawiane procesory mają 2kB, czyli 2048 bajtów pmięci programu. W rzeczywistości zorganizowana jest ona jako 1024 słów 16-bitowych



    Pozdrawiam

    PS Staram się na forum nie oceniać innych ;)

    PS2 Dzięki BoskiDialer :)
  • #7 5619614
    Pijopic
    Poziom 17  
    Ja nie ocenialem tylko stwierdzilem fakt by uswiadomic ci, ze mozesz zapomniec o swoim problemie bo go nie ma.
    Dialer nie jestem teraz pewny, a sprawdzac mi sie nie chce, ale raczej nie 16 bitowe tylko w pary 8 bitowe...
  • #8 5619769
    BoskiDialer
    Poziom 34  
    AVR instruction set napisał:
    Constant byte address is specified by the Z-register contents. The 15 MSBs select word address. For LPM, the LSB selects
    low byte if cleared (LSB = 0) or high byte if set (LSB = 1). For SPM, the LSB should be cleared. If ELPM is used, the
    RAMPZ Register is used to extend the Z-register.
    Po tym można stwierdzić, że pamięć jednak jest zorganizowana słowami, ale jest możliwy dostęp do pojedynczych bajtów przez lpm. Avr'ki do 128KB mają licznik PC 16-bitowy gdyż taki wystarcza do adresowania słowa programu, do adresowania bajtu jest jeden bit więcej, stąd przy 128KB licznik PC nadal jest 16 bitowy, ale do odczytu bajtu z pamięci powyżej 64KB pojawia się elpm/RAMPZ - adres bajtu ma już 17 bitów.
  • #9 5619873
    Pijopic
    Poziom 17  
    Tym razem mi sie pomylil wskaznik z pamiecia, ale na co dzien operuje sie na wskaznikach a nie na pamieci i mozna sie zakrecic :D
REKLAMA