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

XMega 128 - Czy zapis do pamięci SRAM za pomocą rozkazu ST jest możliwy?

ASMnauka_ 12 Sie 2016 13:21 1842 15
  • #1 15864514
    ASMnauka_
    Poziom 15  
    Wiele czytałem o zapisie do pamięci XMegi za pomocą rozkazu STD.
    Prawdopodobnie można to zrobić jedynie z poziomu bootloadera.

    Lecz istnieje też instrukcja ST - zachowaj pośrednio rejestr w pamięci SRAM wskazywanym przez rejestr indeksowy X.
    Zatem, czy można dokonać zapisu do pamięci SRAM XMegi za pomocą rozkazu ST w całej przestrzeni adresowej ?
  • #2 15864670
    Konto nie istnieje
    Konto nie istnieje  
  • #3 15864826
    ASMnauka_
    Poziom 15  
    Dziękuję, faktycznie pomyliłem rozkazy SPM z STD.
    Oczywiście, chodziło mi o przestrzeń danych.
    STD i ST to podobne instrukcje, STD działa z przesunięciem.
    Przykłady dla ST
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

    oraz dla STD
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

    Dziękuje za odpowiedz.
  • #5 15866008
    ASMnauka_
    Poziom 15  
    Dziękuję mi14chal
    Nawet nie wiedziałem, że mam taką lekturę na dysku :(
    Nie chcę zakładać nowego tematu, więc będę kontynuował tutaj.
    Więc do rzeczy.
    Napisałem przykład zapisu i odczytu do i z SRAM XMegi.
    Oto on
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Zapisuje on a następnie odczytuje znaki ASCII od 32 do 127.
    Oczywiście można go dostosować do zapisu ze SPI, USART itd.
    Czy można zarówno zapis, jak i odczyt ulepszyć ?
  • #6 15866054
    Konto nie istnieje
    Konto nie istnieje  
  • #7 15866439
    ASMnauka_
    Poziom 15  
    Piotrus_999, to nie jest dokładny odpowiednik mojego przykładu.
    Po pierwsze we wszystkich pętlach są zmienne liczbowe dwu bajtowe, a u mnie cztero bajtowe.
    Wszystkie Twoje przykłady są to przykłady zapisu, a nie zapisu i odczytu.
    W moim przykładzie pętle są uniwersalne, w zapisie w rejestrze R17 jest zmienna,
    która jest następnie zapisywana.
    Niestety, nie mogę dokładnie rozkminić, jak C układa np. pętle :(
  • Pomocny post
    #8 15866468
    Konto nie istnieje
    Konto nie istnieje  
  • #9 15866513
    ASMnauka_
    Poziom 15  
    Dziękuję, faktycznie, maksymalny rozmiar rozmiar przestrzeni adresowej to :
    65520 - 8192 = 57328, tak więc zmienna liczbowa dwu bajtowa w zupełności wystarczy.
    Kurcze ta zmienna cztero bajtowa pozostała mi z zapisu i odczytu SDRAM, a tam mam taką przestrzeń.
    Piotrus_999 napisał:
    A czym się różni odczyt od zapisu?
    Praktycznie jedynie rozkazami.
    Ale chodzi mi o to bym mógł kopiować np. z pamięci zewnętrznej SPI do pamięci SRAM.
    Tylko dlatego napisałem dwa osobne podprogramy.
    Oczywiście w przyszłości nie będzie zmiennych, lecz stałe zapisane w tabeli.
    Będą one odczytywane za pomocą ELPM, po czym kopiowane do wybranych rejestrów za pomocą MOVW.
    Istotne jest to, iż ELPM działa również w pamięci SRAM.

    Nie rozumiem na przykład tego zapisu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ładuje on adres startowy do pary rejestrów R24-R25, następnie sprawdza czy para R24-R25 są sobie równe,
    jeśli to jest prawda to skocz do adresu +40.
    Czy w takim razie XMega może sprawić psikusa przy ładowaniu do rejestrów ?
  • #10 15866565
    jnk0le
    Poziom 18  
    ASMnauka_ napisał:

    Oczywiście w przyszłości nie będzie zmiennych, lecz stałe zapisane w tabeli.
    Będą one odczytywane za pomocą ELPM, po czym kopiowane do wybranych rejestrów za pomocą MOVW.

    ELPM ładuje tylko jeden bajt, oraz może ładować go do dowolnego rejestru. (xmega128)

    ASMnauka_ napisał:

    Istotne jest to, iż ELPM działa również w pamięci SRAM.

    Jakieś źródło ?

    ASMnauka_ napisał:

    Nie rozumiem na przykład tego zapisu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ładuje on adres startowy do pary rejestrów R24-R25, następnie sprawdza czy para R24-R25 są sobie równe,
    jeśli to jest prawda to skocz do adresu +40.
    Czy w takim razie XMega może sprawić psikusa przy ładowaniu do rejestrów ?



    testuje zawartość r24.

    wykonuje skok jeśli ta wartość jest równa 0.
  • #11 15866586
    ASMnauka_
    Poziom 15  
    jnk0le napisał:
    ELPM ładuje tylko jeden bajt, oraz może ładować go do dowolnego rejestru. (xmega128a3u)

    Tak, wiem o tym, nie wiem, czy jest jakiś rozkaz, który ładowałby np. zawartość dwóch rejestrów(po za MOVW), ale zapewne nie ma, ponieważ rodzina mk XMega jest ośmiobitowa.
    jnk0le napisał:
    wykonuje skok jeśli ta wartość jest równa 0

    Oczywiście wskazuje nam to flaga Z.
    A dokładnie AND sprawdza iloczyn logiczny rejestrów.
  • #12 15866612
    Konto nie istnieje
    Konto nie istnieje  
  • #13 15867575
    ASMnauka_
    Poziom 15  
    jnk0le napisał:
    Jakieś źródło ?
    Jedynie własne eksperymenty.
    Piotrus_999 napisał:
    Proponuje Atmel Studio symulator i analizowac co kody robią.
    Niestety nie mam pojęcia jak się za to zabrać.
    Piotrus_999 napisał:
    A możesz mi napisać dlaczego się męczysz w asm. Jest to zadanie w szkole? Bo nie rozumiem po co się tak pałować. A i tak jak widać efekt jest średni. Asembler tak naprawdę dobrze znać, żeby czasami napisać jakąś krótka funkcję do C (aczkolwiek już mi się to od dawna nie zdarzyło).

    Ależ ja się męczę, jest to dla mnie przyjemność.
    Wcześniej pisałem w Bascom-ie, lecz niestety zżera on tyle pamięci, że aż strach.
    Kolega TMF już pisał, jak mogą być przydatne wstawki ASM w C.
    Udało mi się skrócić podprogramy.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Przy odczycie w R17 mam interesujący mnie bajt.
    A dodatkowo użyłem rejestr indeksowy Z, tak więc Wczytaj_adres_startu mogę używać również do zapisu\odczytu pamięci SDRAM.
    Niestety przy zapisie do SRAM muszę zastosować zmienną cztero bajtową, ponieważ posiadam pamięć zewnętrzną SPI W25Q128FV.
    Zauważyłem jeszcze jeden szczegół w twoich przykładach.
    Chodzi o LD i ST.
    Nie rozumiem dlaczego kompilator nie zastosował zapisu:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    oraz
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Dzięki takiemu zapisowi w pętli nie trzeba zwiększać\zmniejszać adresu, co przekłada się na większą objętość kodu, jak i spadek prędkości działania podprogramu.
    Tak więc bez liczenia taktów mój przykład jest lepszy pod względem prędkości, jak i objętości kodu. :)
    Jednak i tak prawdopodobnie przy odczycie będę musiał zastosować pętlę FOR NEXT, ale i to nie sprawi mi problemu.
  • #14 15867698
    Konto nie istnieje
    Konto nie istnieje  
  • #15 15869332
    ASMnauka_
    Poziom 15  
    Piotrus_999 napisał:

    Niekoniecznie - po prostu robi to co mu kazałem. lekka zmiana progrmu i masz juz:
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

    Czyżby kompilator zgubił pętlę ?
    W tym przykładzie zostanie zapisany tylko jeden bajt pod adresem ustalonym przez rejestr indeksowy Z.
    Oj Piotrus ;)
  • #16 15869383
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA