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

[ATmega8] Nadpisywanie RAMu?

05 Lut 2010 21:14 3416 19
  • #1 7649250
    Konto nie istnieje
    Konto nie istnieje  
  • #2 7649692
    mirekk36
    Poziom 42  
    marcel333 napisał:
    Czy coś mi nadpisuje pamięć RAM i tym samym tablice i zmienne które w niej tkwią? Jak z tego wybrnąć? Nie można wykorzystywać 100% pamięci RAM? Pozdrawiam


    A słyszałeś kiedyś o czymś takim jak stos ???? on też korzysta z RAM ;) .... i nigdy nie można wykorzystywać w 100% RAMu na tylko swoje potrzeby
  • #4 7649878
    mirekk36
    Poziom 42  
    Balu napisał:
    Można! W asmie bez używania stosu:P
    ^^ Taka dygresja;)


    No, poniekąd masz rację - tak na prawdę wszystko można - tylko po co? ;) Poza tym program, bez używania stosu to nie program ;) tylko jakiś pikuś

    No a w językach wyższego poziomu to można zapomnieć o takich wybrykach ;) i raczej na tym niech się autor skupi niż na szukaniu możliwości pisania softu bez używania stosu.
  • #6 7650260
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #7 7650352
    mirekk36
    Poziom 42  
    marcel333 --> stos nie jest czymś co zostaje ustalane a raczej jego wielkość w procesie kompilacji czy optymalizacji ;) ..... stos to dybamiczny twór, który zwiększa się dynamicznie i zmniejsza w trakcie działania programu. Niestety trzeba o tym poczytać a najszybciej zrozumiesz o co chodzi ze stosem jak poczytasz jakąkolwiek książkę o chociażby początkach programowania w asemblerze. Nie musisz się zaraz go uczyć żeby w nim pisać programy ale ta lektura będzie bardzo pouczająca nie tylko w związku ze sprawą stosu - ot po prostu przyda się.

    Trzeba też poczytać troszkę jak działa sam C - np co to jest funkcja i co się dzieje gdy typowa funkcja jest wywoływana. Otóż gdy zostaje wywołana to już na stos odkłada się jedna cegiełka czyli adres gdzie ma program powrócić po jej wykonaniu. Ale jeśli w funkcji zdeklarujesz sobie jakieś zmienne lokalne to one także zostaną utworzone na stosie ;) .... itd itd .... jak więc widzisz samo poznanie składni C to jeszcze nie nauczenie się programowania. Trzeba niestety więcej poczytać - bo tu trzeba by książkę całą napisać albo kilka rozdziałów żeby od początku od podstaw wszystko ci wyjaśnić. Dlatego sam poczytaj to co mówiłem powyżej i będzie OK
  • #8 7650465
    Konto nie istnieje
    Konto nie istnieje  
  • #10 7650752
    mirekk36
    Poziom 42  
    marcel333 --> jeśli po napisaniu programu masz zajęte 90% pamieci to:

    1. przeanalizuj program w celu weryfikacji założeń czy na pewno musisz deklarować aż tyle zmiennych czy tablic

    2. jeśli nie możesz zmienić założeń to posprawdzaj kod programu, rozważ używanie funkcji statycznie lub ilnile - czyli dokonaj własnej optymalizacji kodu ( w tym przemyśl na poważnie albo zrezygnuj z używania funkcji typu float ) i generalnie obserwuj zajętość pamięci RAM po każdej kompilacji od początku tak abyś w 100% wiedział od czego przybywa każdy pojedyńczy bajt

    3. jeśli nic nie możesz zrobić z 1szym i 2gim pubktem - weź większy procek tzn z większą ilością RAM

    ;)
  • #11 7652671
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #12 7653007
    mirekk36
    Poziom 42  
    marcel333 napisał:
    Mam jeszcze pytanko czy rejestry też zabierają pamięć z tego 1kB RAMu czy mają przydzieloną osobną? Bo z tego co wiem można też tworzyć zmienne typu 'register'


    Tym się nie martw - rzeczywiście takie zmiene będą w rejestrach jeśli kompilator uzna to za możliwe. Ale zmienne typu register nie służą, jak już, do oszczędzania pamięci RAM ;)
  • #13 7653153
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #14 7653404
    tmf
    VIP Zasłużony dla elektroda
    Mape pamieci masz w datascheecie uzywanego przez ciebie ukladu. Poczatek SRAM zalezy od procesora, najczesciej zaczyna sie od adresu 0x60, natomiast rejestry sa mapowane pod adresy 0-0x1F. Przy czym piszac w C nie powinno cie to interesowac. Zauwaz, ze skoro masz zajete 92% SRAM to do dyspozycji zostaje ci zaledwie ok. 81 bajtow, niewiele biorac pod uwage, ze masz jeszcze zapewnie zmienne lokalne, ktore tez potrzebuja pamieci, musi byc stos itd.
  • #15 7655515
    Konto nie istnieje
    Konto nie istnieje  
  • #16 7655765
    mirekk36
    Poziom 42  
    marcel333 --> pierwsza lepsza książka czy publikacja wyjaśnia strukturę/architekturę procesorów AVR jeśli chodzi adresowanie pamięci.

    Każda z pamięci zaczyna się od adresu 0x0000 ;) czyli adresowanie pokrywa się. I nie na darmo mówi się, że pamięć Flash to pamięć programu ... bo tylko i wyłącznie w niej może być zapisany program, który może być wykonywany przez procesor. Pozostałe pamięci służą tylko do przechowywania danych. I nie znajdziesz od tej reguły żadnego ale to żadnego wyjątku w AVR'kach
  • Pomocny post
    #17 7655776
    tmf
    VIP Zasłużony dla elektroda
    Wiec od konca. Adresy pamieci FLASH, EEPROM i SRAM pokrywaja sie. W zwiazku z tmy istnieja inne instrukcje assemblera umozliwiajace dostep do FLASH i SRAM. EEPROM nie jest mapowany w przestrzen adresowa procesora, do niego dostep odbywa sie za pomoca specjalnych rejestrow (z wyjatkiem XMega, gdzie EEPROM jest w przestrszeni adresowej). Dlatego nie istnieje mozliwosc wykonywania przez AVR programu spoza FLASH. Co do dumpa SRAM - najlepiej zrobic to uzywajac JTAG, to ma chyba najwiekszy sens. Natomiast programowo w C mozesz to zrobic uzywajac wskaznikow, np. uint8_t x=*((void*)0); da ci zawartosc komorki o adresie 0.
  • Pomocny post
    #18 7655902
    asembler
    Poziom 32  
    marcel333 napisał:
    A czy można wiedzieć w takim razie ile do dyspozycji mam pamięci RAM (lub ile przy standardowej optymalizacji w winavr zajmuje stos)? Pozdrawiam

    Ja stosuje nastepujacy sposob.
    W dowolnym przerwaniu odczytuje wskaznik stosu do zmiennej porównując z poprzednia wartoscia i zapisuje mniejsza. Puszczam program naciskam co mam nacisnąc staram sie wykonac wszystkie zaplanowane przez program operacje a na koncu wystarczy odczytac zmienna odjac od adresu zadeklarowanego na poczatku programu stosu i otrzymujemy wiekosc stosu.
  • Pomocny post
    #19 7656131
    kamyczek
    Poziom 38  
    Wszystko zależy od sposobu napisania programu obsługi przerwań i wywołań pod programów. Jeśli wykonasz to prawidłowo zmienne i adresy powrotu zostaną pobrane ze stosu. jeśli jednak pozostaną stos rośnie aż przepełni ram. Dobrą praktyką jest symulowanie programu i zwracanie uwagi na wskaźnik stosu który powinien po zakończeniu obsługi pod programów i przerwań wracać do pierwotnej wartości.
  • #20 7657799
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA