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

Brak wolnych rejestrów w AVR ATmega128

qwerty0026 19 Kwi 2010 19:23 2228 13
REKLAMA
  • #1 7980226
    qwerty0026
    Poziom 10  
    Tak jak w temacie. Brakuje mi wolnych rejestrów (szczególnie r25) . Mam procedure, która wykorzystuje wszystkie rejestry i jeszcze do tego w programie wykorzystywany jest rejestr r15 i r25 (czyli brakuje dwóch rejestrów). Jest wstawiony "push" i "pop" , ale to nie pomaga.

    Jeśli by ktoś wiedział jak to prosto można zamienić by zamiast rejestr ,program wykorzystywał RAM lub np. port ,to proszę o podpowiedź (bo ja słabo się na tym znam).
    Dziękuję.

    Proszę zmienić nazwę tematu.
    Robak
  • REKLAMA
  • Pomocny post
    #2 7980298
    m.bartczak
    Poziom 16  
    Nie rozumiem czemu rozkazy "PUSH" i "POP" nie pomagają - po to są właśnie te rozkazy...

    Ale jeżeli musisz, przecież zawsze możesz użyć rozkazów "LDS" i "STS"... nie do końca można to zrobić automatycznie, bo w końcu potrzebujesz jakiegoś rejestru ale wystarczy że wybierzesz jakiś rejestr 'tymczasowy' i zrobisz coś takiego:

    
    .def TMP = <jakiśtwójrejestrtymczasowy> - taki który nie jest za bardzo używany w programie
    
    lds TMP, <jakiś adres w SRAM>
    ; --- twój kod który wykorzystuje rejestr TMP
    sts <adres w SRAM>, TMP
    ; i teraz możesz użyć TMP do czegoś innego
    


    Chociaż znacznie prościej po prostu użyć push i pop... pamiętaj że AVR ma *mnóstwo* rejestrów, porównaj to np. z starym C64 :) - skrót myślowy od MOS 6510/8500, czyli rodziny 6502, co widzę kolega rpal także wymienił jako przykład...
  • #3 7980379
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #4 7980541
    rpal
    Poziom 27  
    kolego masz tak taką masę rejestrów że twój brak jest ewidentnie spartolonym programem, sorry za szczerość ale tak to wygląda. Co mieli powiedzieć goście od 6502 kiedy tych rejestrów było tyle co kot napłakał, Jak nie wychodzi idź do początku i zacznij od nowa :)
  • #5 7982694
    qwerty0026
    Poziom 10  
    Jakiś "Robak" napisał na czerwono by zmienić nazwę tematu. Jeśli ma ktoś jakiś pomysł na inną nazwę to bardzo proszę ją napisać (bo ja nie wiem co tu innego wymyśleć)

    Dodano po 10 [minuty]:

    A wracając do tematu to sprawa nie jest taka prosta (przynajmniej dla mnie) , bo jak pisałem mam procedurę która wykorzystuje wszystkie rejestry , a to co pisałem na początku to jest podprogram do przerwania. Jeśli wykonywana jest procedura , i również przerwanie , które zmieni rejestr to , procedura zostanie błędnie wykonana. Myślę że te rozkazy "LDS" i "STS" to dobry pomysł. Może mi się uda je wprowadzić. Dziękuję.
  • REKLAMA
  • Pomocny post
    #6 7982739
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 7982765
    qwerty0026
    Poziom 10  
    Z tych rejesrtów korzysta przerwanie i wykorzystawane są również w programie. Może napisze jak to było: Był program , a ja zmodyfikowałem procedurę (zastąpiłem procedurą która wykorzystuje wszystkie rejestry). I dlatego potrzeba więcej rejestrów.


    Widzę że nawet nie łaska zajrzeć do regulaminu, na forum nie piszemy bez potrzeby dużymi literami! Proszę to zmienić.
    Jakiś Robak.
  • #8 7982973
    tmf
    VIP Zasłużony dla elektroda
    Ojej, zacznę brutalnie - po co piszesz w assemblerze, skoro nie masz o nim pojęcia? Napisz w C lub Bascomie.
    Co do assemblera - jak piszą inni - w obsłudze przerwania odkładaj rejestry na stos, obowiązkowo musisz odłożyć rejestr stanu procesora. To spowoduje, ze w przerwaniu będziesz mógł użyć wszystkich rejestrów, które wcześniej odłożyłeś na stosie.
    Jeśli w pisanej procedurze brakuje ci rejestrów to analogicznie - nieużywane w danym miejscu odkładaj na stos, albo stosuj zmienne w pamięci, które ładujesz przed użyciem i ponownie zapisujesz po użyciu. Swoją droga musiałeś stworzyć niezłego babola, skoro 32 rejestry to za mało.
  • #9 7986391
    qwerty0026
    Poziom 10  
    BARDZO PROSZĘ O KONSTRUKTYWNE PODPOWIEDZI (a nie w rodzaju po co piszesz w asemblerze). Wyjaśniam , że ja nie pisałem tego programu od początku , tylko lekko go modyfikuje. A przecie nie będę teraz zamieniał z asm na C. Program jest bardzo dobrze napisany , jedynie co to brak wolnych rejestrów (po zamianie procedury). Ja będę próbował wprowadzić niektóre rozwiązania z tego forum. (może się uda). Mogę tylko powiedzieć że wstawiając push i pop program nie chodzi , dopiero po zresetowaniu 1 raz prawidłowo wyświetli program (na lcd) i się zatrzymuje.
  • #10 7986583
    Konto nie istnieje
    Poziom 1  
  • #11 7992590
    rpal
    Poziom 27  
    qwerty0026 napisał:
    Program jest bardzo dobrze napisany , jedynie co to brak wolnych rejestrów (po zamianie procedury).
    Myślę że to co napisałeś wzajemnie sobie przeczy bo jakby było "bardzo dobrze" to nie pisałbyś tego postu. Tak na moje oko to modyfikacja cudzej roboty zajmie ci więcej czasu niż napisanie go od nowa w C albo BASCOM. No chyba że jest to jakiś ogromny moloch jednak tego z kolei napewno byś nie był w stanie ogarnąć (przyjmuję że nie wypełnia sobą całej pamięci RAM dla atmega128). Atom dobrze radzi napisz od początku bo będziesz z tym walczy do przysłowiowej u... śmierci.
    Poza tym jak ci ma ktoś konstruktywnie radzić skoro nie zamieściłeś nawet skrawka tego super kodu ? A poza tym jak push/pop może nie działać ? Nie ma bata musi chodzi chyba że ten program modyfikuje w zagadkowy sposób wskaźnik stosu.
  • #12 7995830
    asembler
    Poziom 32  
    Jakby dobrze pokombinowac to cały ten program mozna zrobic na kilku rejestrach albo nawet dwóch.:) Tylko po co? Rejestry uzywa sie po to aby program wykonywal sie jaknajszybciej gdyz dostep do nich jest 1 taktowy. Poza tym nie wszsytkie zmienne w programie muszą miec 8 bitów, a za tym zmienne typu boolean mozesz upchnac w jednym rejsetrze ich 8 i tez miec do nich dostep bezposredni.
  • #13 7996681
    utak3r
    Poziom 25  
    qwerty0026 napisał:
    Program jest bardzo dobrze napisany


    ...ale z myślą o konkretnym celu. Czasem rozbudowanie programu o jakąś opcję jest zwyczajnie niemożliwe wprost i wymaga przemyślenia i przepisania od nowa całego fragmentu kodu.

    ...no ale co ja będę pisał, sam wiesz lepiej, nie? Tylko po co się pytasz w takim razie...?
  • #14 8083919
    qwerty0026
    Poziom 10  
    Witam.

    Dziekuje za pomoc.
    Wykorzystałem "lds" i "sts" by zwolnić rejestr r25.
    I udało się zwolnić rejestr , ale program nie działa tak jak powinien , chyba jeszcze jest coś nie tak.
    Dziękuję.
REKLAMA