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

[ATMega32][c] dostępna pamięć

mojsamspam 31 Sie 2009 23:24 1450 2
  • #1 6966479
    mojsamspam
    Poziom 11  
    Witam,

    od 2 dni próbowałem zmusić do działania jedną napisanych przez siebie funkcji - odczyt danych z pliku tekstowego na nośniku SD/MMC sformatowanym w FAT32. Funkcja ma za zadania przypisanie do zmiennych wartości z pliku tekstowego. Do obsługi FAT32 wykorzystałem bibliotekę Elm Chan'a.

    Zaimplementowanie biblioteki Elma zabrało ok. 22kB pamięci programu i około 200bajtów pamięci danych. Obsługa dodatkowych rzeczy takich jak zewnętrzny EEPROM 24C02, termometr DS18B20 sprawiło, iż po kompilacji AVR Studio wykazuje użycie pamięci programu na poziomie 28kB (89.4%) i 1.5kB (69.4) danych.

    Dzisiaj po kolejnych kilku godzinach niepowodzeń (a funkcja prosta jak drut) postanowiłem umieścić w komentarzu kilka funkcji, które nie wykorzystywałem w danym momencie, aby zweryfikować, czy czasem pamięć nie jest w tym przypadku problemem (mimo, iż kompilator wykazał ponad 10% wolnej przestrzeni na program).

    Na końcu posta umieszczam 2 screenshoty z AVR Studio. Przy użyciu pamięci 89.4%, program się wieszał nawet, nawet gdy nie wywoływałem nowo utworzonej funkcji, a korzystanie ze sprzętowego resetu nie dawało żadnych rezultatów - pomagało tylko odłączenie zasilania.

    Zastanawia mnie jak się ma wskazywane 89.4% zajętości do faktycznej zajętości pamięci, gdy program działa. W programie nie wykorzystuję wskaźników, ani nie korzystam z funkcji alokacji pamięci malloc/calloc, czyli zajętość pamięci danych nie powinna wzrosnąć (a tymbardziej pamięć programu - przynajmniej tak mi się wydaje). Optymalizacja jest ustawiona na -0s.

    Przy kompilacji z poniższym użyciem pamięci program nie działał jak należy - nawet reset musiałem przyciskać dwukrotnie, aby odblokować procesor (lub reset wogóle nie działał):
    [ATMega32][c] dostępna pamięć

    Tutaj status po kompilacji, kiedy kilka funkcji było wstawionych w komentarz(przy takim użyciu pamięci program działa jak należy):
    [ATMega32][c] dostępna pamięć

    Pozdrawiam,
  • #2 6966528
    kwesoly
    Poziom 15  
    To 80 kilka % to pamięć programu - na 99% używasz jej tylko do odczytu. Natomiast zajętość Data to pamięć RAM - te 1408 to zmienne globalne, do tego jeszcze dochodzi zajętość związana z zmiennymi tworzonymi w trakcie działania, zarówno w funkcji main, w wszystkich wywoływanych funkcjach i do tego jeszcze parametry funkcji i adresy powrotu po wywołaniu - to drugie zużycie może się zmieniać. Więc wystarczy, że w tych zakomentowanych funkcjach są zmienne statyczne - te kilka bajtów jeśli ich braknie może wystarczyć aby "wywalić program" choć zwykły reset powinien działać. AFAIK w AVR Studio w symulatorze można sprawzić czy wystąpiło przepełnienie któregoś ze stosów.
  • #3 6966692
    mojsamspam
    Poziom 11  
    wszystkie funkcje, które napisałem są wykonywane w pętli while programu głównego main. W funkcjach liczników i przerwań ustawiam tylko flagi (wszystkie flagi deklarowane jako volatile), a w programie main sprawdzam, czy dana flaga jest ustawiona - jeśli jest, to wykonuję pewien fragment kodu i resetuję flagę. W funkcjach wywoływanych przez program main deklaruję zazwyczaj do 4B zmiennych (2parametry+1zmienna do pętli 'for'), a z tego co mi wiadomo, to pamięć użyta przez te zmienne jest zwracana po wyjściu z bloku kodu, w którym była deklarowana (w tym przypadku z funkcji) - czyli po wyjściu z funkcji odzyskam moje 4 zadeklarowane bajty.

    W moim rozumowaniu do dyspozycji każdej funkcji mojego programu mam 2048B-1408B (drugi screenshot), czyli 640B - oczywiście oprócz przypadków kiedy wywołana funkcja, wywołuje kolejną funkcję (wtedy trzeba zsumować to co się deklarowało w obydwu funkcjach).

    Co mnie zastanawia, to to, że po wstawieniu w komentarz funkcji, które nie używałem, problem znikł - skoro nie są używane, to nie wzrasta ilość użytej pamięci RAM (zajmują tylko pamięć programu).

    Z licznika (Timer) wywołuję tylko jedną funkcję (co 1/100s - służy ona tylko za zegarek dla funkcji obsługi SD/MMC i deklaruje tylko jeden statyczny bajt).

    Zmiennych statycznych nie wykorzystuję - używam tylko globalnych.
    Pozdrawiam,
REKLAMA