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

Jaka jest dostępna max zajętość pamięci w Atmega328P

mumin_80 08 Wrz 2011 10:20 1873 14
REKLAMA
  • #1 9906358
    mumin_80
    Poziom 12  
    Posty: 97
    Witam
    Mam problem z działaniem atmegi328P gdy zajętość pamięci data jest powyżej 90%.
    Czy jest jakiś bufor, który ma być wolny dla operacji wewnętrznych uC ?

    Podczas kompilacji w AVR Studio programu otrzymuje zajętości pamięci:
    Program: 52%
    Data: 89%

    Program działa ale jak przekroczę 90% zajętości data to atmega dziwnie działa, np nie wchodzi do konstrukcji if pomimo tego że powinna.

    Czy występują jakieś ograniczenia w zajętości pamięci w atmega'ach
    Czy problem jest w kodzie np. zapisuje tablice poza jej indeksem.
    Kod niby sprawdzałem i je ok ale może czegoś nie zauważyłem :)

    Pozdrawiam
    mumin_80
  • REKLAMA
  • REKLAMA
  • #3 9906376
    mumin_80
    Poziom 12  
    Posty: 97
    A dokładniej możesz opisać ?

    mumin_80
  • REKLAMA
  • #5 9906477
    mumin_80
    Poziom 12  
    Posty: 97
    Nie wiem dokładnie o co Ci chodzi ale to nie tędy droga.
    Program jak jest wgrywany to poprzednia zawartość jest zawsze kasowana.

    mumin_80
  • #6 9906499
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    No i co z tego że poprzednia wartość jest kasowana? "Nie tędy droga."

    Jeśli uważasz, że nie mam racji, to WEWNĄTRZ funkcji main() dopisz taką linijkę:
    volatile char tablica[10000];
    I sprawdź czy zmieni się wartość podawana przez kompilator dla sekcji data. Potem sprawdź, że program z taką linijką nawet nie wystartuje, bo od razu się wywali.

    Po takim experymencie wyciągnij wnioski.

    4\/3!!
  • Pomocny post
    #7 9906504
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Tędy tędy, to że kompilator wypluł 90% zajętości wcale nie oznacza, że możesz sobie bezkarnie użyć resztę 10%. Zmienne automatyczne, wszelkie wywołania funkcji, przerwania - wszystko odkładane jest na stosie, a to już nie jest pokazywane po kompilacji. Załóżmy, że masz w uC 4bajty RAMu, załóżmy, że uC wykonuje tylko to, co jest napisane w kodzie i nic więcej. Jak myślisz, czy taki program by zadziałał?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #8 9906528
    mumin_80
    Poziom 12  
    Posty: 97
    Gaskoin
    Ten program by nie zadziała ale w jaki sposób można sprawdzić ile procent pamięci można zostawić.
    Nie jestem aż tak biegły w programowaniu w C ale wiem co to jest stos.
    Co do zmiennej jak pisał Freddi to robiłem takie testy i co dziwne zajętość RAM nie wzrastała pomimo definiowania zmiennej.
    Nie potrafiłem tego sobie wyjaśnić dlatego założyłem post'a :)
    Nie używam zmiennych deklarowanych dynamicznie.

    Jak mogę sprawdzić ile pamięci mogę zostawić ?

    Pozdrawiam
    mumin_80
  • Pomocny post
    #9 9906532
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Prosto - nie da się tego sprawdzić.
    Nie-prosto - można napisać specjalne funkcje które to mniej więcej obliczą.

    4\/3!!
  • #10 9906560
    mumin_80
    Poziom 12  
    Posty: 97
    Czy jest jakaś zależność np zajętośc RAM w 50% potrzebuje 5% na "wewnętrzne operacje", a np 70% potrzebuje 7% czy coś takiego.
    Przypuszczam że zależy to od skomplikowania programu (przerwań odwołań do rejestrów itd).

    mumin_80
  • Pomocny post
    #11 9906576
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Nie da się tego stwierdzić, jeżeli masz przerwania z np. odbiorem danych to nie wiesz w którym momencie co poleci na stos. Tak samo z wywoływaniem funkcji. Wszystko zależy - co funkcja robi, jakie zmienne potrzebuje, ile ich potrzebuje etc.
  • Pomocny post
    #12 9906582
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Nie ma takiej zależności. Rozmiar stosu jest zależny od ilości zmiennych automatycznych i "łańcucha wywołań".

    4\/3!!
  • #13 9906598
    mumin_80
    Poziom 12  
    Posty: 97
    Ok, no to lipa. Rozumie problem.
    Trudno, będę się starał zmniejszyć zajętość RAM.

    Dzięki

    Pozdrawiam
    mumin_80
  • Pomocny post
    #14 9906611
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2206
    Nie ma takiej zależności. Jeśli nie korzystasz z dynamicznej alokacji pamięci to możesz to bardzo zgrubnie oszacować po ilości zmiennych automatycznych (lokalnych), a szczególnie tablic. To co czyni takie oszacowanie szczególnie trudnym to określenie stopnia zagnieżdżenia funkcji - bo to zajmuje sporo pamięci na stosie. A zależy to od ilości przerwań, ich struktury i napisanych procedur. Poza tym zależy to od np. wykorzystania rekurencji - to zjada stos dramatycznie. W praktyce oszacowanie bardzo zgrubne jest możliwe dla bardzo doświadczonych programistów.
    Są też inne możliwości, raczej zawiłe, znajdziesz je opisane w pozycji z mojej stopki - ze względu na rozmiar nie będę się tu rozwodził.
  • #15 9906652
    mumin_80
    Poziom 12  
    Posty: 97
    Dzięki tmf
    Pewnie się skuszę.
    Temat uznaje za zamknięty.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zgłasza problem z działaniem mikrokontrolera Atmega328P, gdy zajętość pamięci danych przekracza 90%. Zauważa, że program działa, ale przy wyższej zajętości RAM występują nieprzewidziane zachowania, takie jak brak wejścia do konstrukcji if. Uczestnicy dyskusji wskazują na znaczenie pamięci stosu, która nie jest uwzględniana w raportach kompilatora, oraz na to, że zajętość pamięci RAM nie jest jedynym czynnikiem wpływającym na działanie programu. Zasugerowano, że nie ma prostego sposobu na określenie, ile pamięci można pozostawić wolnej, a oszacowanie zależy od złożoności programu, liczby zmiennych automatycznych oraz wywołań funkcji. Użytkownik postanawia zmniejszyć zajętość RAM, aby uniknąć problemów.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA