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

Stos w bascomie 8051. Jak mogę zwiększyć wielkość stosu? Programowo.

marcin-k 13 Lis 2008 08:34 1899 7
REKLAMA
  • #1 5732859
    marcin-k
    Poziom 15  
    Posty: 255
    Ocena: 38
    Jak w temacie jak mogę zwiększyć wielkość stosu w bascomie 8051 programowo chodzi program dobrze ale czas od czasu się wiesza i podejrzewam ,że przepełnia się stos na symulacji jest prawie cały wykorzystany czy można temu zaradzić ? zapomniałem dodać że chodzi mi o procek AT 89C4051
  • REKLAMA
  • REKLAMA
  • #3 5736690
    marcin-k
    Poziom 15  
    Posty: 255
    Ocena: 38
    Stos dochodzi do wartości 85-87 cały czas oscyluje w około tych wartości jeśli mu wpiszę z palca inną wartość to program idzie w kszaki a mnie chodzi głównie oto czy jest możliwość programowa zarezerwowania większego miejsca na stos ?
  • REKLAMA
  • #5 5737029
    marcin-k
    Poziom 15  
    Posty: 255
    Ocena: 38
    Może jaśniej za pomocą komend bascoma ? ja używam w programie instrukcji CALL i rozumiem to tak jeśli wykonuję skok do jakiejś etykiety to program odkłada na stos adres powrotny stos rośnie coś wykonuje w tej etykiecie i wraca z niej z powrotem do poprzedniej , zdejmuje adres powrotny z stosu czyli stos znów maleje i tak w kółko jeśli wpiszę wartość do stosu za pomocą komendy sp= jakaś wartość np. 90 a na stosie przed skokiem było np.87 to program idzie w krzaki czyli nie pamięta z którego adresu wykonał skok obojętnie czy wpiszę wartość mniejszą czy większą czy mogę to jakoś inaczej no chyba ,że źle rozumiem.
  • REKLAMA
  • #6 5737301
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    Jaśniej : wpisz do wskaznika stosu wartosc xx.
    Dobrze rozumujesz, dlatego tez wielkosc stosu ustal na poczatku programu, nie mozesz jej zmieniac w trakcie dzialania, bo wiadomo - zagubi sie.
    Tylko czy to jest za maly stos ? moze bledy wykonywania programu przepelniaja go ? (jesli rzeczywiscie przepelniaja).

    A daj pliczek .hex, zdisasembluje go i obejrze, a w czym wykonujesz symulacje ?
  • #7 5738880
    ZbeeGin
    Poziom 39  
    Posty: 4324
    Pomógł: 602
    Ocena: 455
    Wpisanie nowej wartości do SP powoduje przesunięcie tylko jego wskaźnika. Wykonanie tego w nieodpowiednim momencie kończy się źle - jak kolega się przekonał.
    Dlatego najpierw w raporcie kompilacji trzeba sprawdzić gdzie znajduje się najdalej położona zmienna (użytkownika lub wewnętrzna) i sprawdzić ile ona zajmuje. Uzyskasz wtedy adres od, którego BASCOM już nie wykorzystuje pamięci IRAM.
    Aby pzesunąć stos trzeba nie tylko zmienić wartość z SP, ale też bajty od tego adresu do końca pamięci przesunąć pod nowy adres, wyłączając wszystko co może zakłócić ten proces: np. przerwania.

    Przed tymi operacjami sprawdziłbym wszystkie odwołania przez GOSUB i ich powroty przez RETURN (zgodność ilości) i czy używasz tylko jako ostateczność poleceń GOTO. To najczęstsza przyczyna anomalii w programach.
  • #8 5740680
    marcin-k
    Poziom 15  
    Posty: 255
    Ocena: 38
    Bardzo dziękuję za zainteresowanie tematem ale chyba się wyjaśniło jaka jest przyczyna przypadkowego zawieszania procka w symulacji zajmuję połowę możliwego stosu i w żadnym przypadku go nie przepełniam wałkowałem cały dzień wszystkie możliwe kombinacje i nie przepełniam stosu program nie wiesza się przyczyna jest zewnętrzna to znaczy przepięcia zasilania i z elementów zewnętrznych (przekaźniki) choć są bocznikowane diodami szybkimi czas od czasu potrafią zawiesić program w przypadkowym miejscu teraz będę walczył z tym problemem nawiasem mówiąc z takim czymś spotkałem się pierwszy raz a nie jest to mój pierwszy projekt dziękuję jeszcze raz za zainteresowanie tematem i temat można uznać za zamknięty

Podsumowanie tematu

✨ Dyskusja dotyczy możliwości programowego zwiększenia wielkości stosu w Bascomie dla mikrokontrolera 8051, konkretnie modelu AT89C4051. Użytkownik zauważył, że program czasami się zawiesza, podejrzewając przepełnienie stosu, który w symulacji jest niemal całkowicie wykorzystany. Wskazano, że wielkość stosu w 8051 ustala się przez ustawienie rejestru SP (np. instrukcją mov SP,#xx lub sp=wartość w Bascomie) na początku programu i nie powinno się jej zmieniać w trakcie działania, gdyż może to prowadzić do błędów i utraty adresów powrotnych. Zwrócono uwagę, że przesunięcie wskaźnika stosu wymaga również przesunięcia zawartości pamięci stosu i wyłączenia przerwań, co jest skomplikowane. Zalecane jest sprawdzenie poprawności wywołań CALL/RETURN oraz unikanie nadmiernego użycia GOTO, które mogą powodować anomalie. Ostatecznie autor potwierdził, że problem zawieszania się programu nie wynika z przepełnienia stosu, lecz z zakłóceń zewnętrznych, takich jak przepięcia zasilania i wpływ elementów zewnętrznych (przekaźników), mimo zastosowania diod bocznikujących. Temat uznano za zamknięty.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA