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

Atmega8515 - zawieszanie programu >2.6kB przy kwarcu 11,0592MHz i RS232 19200

Leszek4 24 Kwi 2007 13:53 1277 3
REKLAMA
  • #1 3816672
    Leszek4
    Poziom 11  
    Posty: 5
    Programuje 8515 w WinAVR(20070122) z kwarcem 11,0592MHz,
    komunikacja RS232 (19200) oraz obsługa LCD działa,
    dopóki całkowity rozmiar programu nie przekroczy ~2,7kB.

    Wystarczy że dodam cokolwiek np. procedurę której nawet nie
    wywołam, a program idzie w maliny.

    1. Debugowałem w AVRStudio (aStudio4b528) i tam działa poprawnie
    2. Sprawdziłem na 3 procesorach - identycznie zachowanie
    3. Do wgrywania użyłem dwóch różnych programów ISPProg
    oraz PonyProg, każdy poprawnie wgrywa i weryfikuje
    4. Próbowałem z wyłączonymi przerwaniami i watchdog-iem,
    bez zmian

    Dlatego zwracam się z pytaniem do Forumowiczów, czy ktoś
    mógłby pomóc mi rozwiązać ten problem ?
  • REKLAMA
  • Pomocny post
    #2 3818027
    johny_w
    Poziom 24  
    Posty: 673
    Pomógł: 80
    Ocena: 63
    Witam. Ten uC posiada tylko 512 bajtów SRAM. Jest to niestety niezbyt wielka ilość. Najprawdopodobniej wykorzystujesz pamięć w pełni i dlatego program się sypie. Zwróć uwagę na to, że zmienne, tablice i ciągi deklarowane w programie umieszczane są właśnie w pamięci ram, do tego jeszcze skompilowany program używa pamięci jako stosu. Im więcej zagłębień w wywoływaniu funkcji - tym bardziej pamięć zajmowana jest przez stos. To tak w uproszczeniu.

    Moja diagnoza: rozrastający się stos wchodzi na obszary używane przez Twoje zmienne, które go nadpisują i program nie wie gdzie ma dalej skoczyć (na stosie przechowywane są adresy pamięci flash, gdzie program ma wrócić w wywołanej funkcji/przerwania).

    Moja rada: Spróbuj przeanalizować program pod kątem zużycia pamięci i zoptymalizować go. Jeśli będziesz miał problemy - wstaw na forum kod źródłowy. Zerkniemy.

    pozdrawiam, JnS
  • REKLAMA
  • Pomocny post
    #3 3818861
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    A deklarujesz w programie jakieś wieksze tablice w pamieci RAM??
    Bo 512B RAM na 3kB kodu to jest bardzo dużo. Jeżeli to problem ze stosem wyłącz przerwania, jeżeli uzywasz wskaźników do tablic sprawdz czy "nie wyskakują" one poza obszar na jakie wskazują. Debagowanie nie do końca "pokazuje" działanie z rzeczywistymi zmiennymi.
  • #4 3820487
    Leszek4
    Poziom 11  
    Posty: 5
    Dzięki to jest przekroczenie rozmiaru RAM'u, w zasadzie klasyczna przypadłość, ale tak to już jest jak się za dużo pracuje ;-)

    W zasadzie cały problem wynikał z przenoszenia programu
    z 8052 na 8515, nie dostrzegałem problemu pamięci RAM,
    gdyż skoro 8052 ma 256B, a 8515 ma 512B to musiało wystarczyć.

    Znacząca różnica pojawia się w interpretowaniu stałych
    dla Keila(8052), parameter funkcji WriteLCD("Tekst przykładowy\x0"); umieszczany jest w pamięci programu - FLASH
    dla WinAVR(8515) - niestety w obszarze danych w RAM.

    Coż kiedyś trzeba się było tego dowiedzieć.

    Dzięki
REKLAMA