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

XMega 128 - Optymalizacja podprogramu do odczytu bitu w bajcie Asembler

ASMnauka_ 28 Lip 2016 08:15 1188 7
  • #2 15834335
    excray
    Poziom 41  
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod
  • #3 15834539
    ASMnauka_
    Poziom 15  
    excray dziękuje za zainteresowanie, lecz wydaje mi się, że mój podprogram wykona się szybciej.

    LICZBA CYKLI w moim podprogramie w samej pętli
    MOV = 1
    AND = 1
    BREQ = 1 lub 2
    BRNE = 1 lub 2
    LSR, LSL = 1

    LICZBA CYKLI w Twoim podprogramie w samej pętli
    SBRC = 1 , 2 lub 3
    JMP = 3
    JMP = 3
    LSR, LSL = 1
    DEC = 1
    Poza tym celowo użyłem LSR zamiast DEC
    Czy mam rację ?
  • #4 15834557
    excray
    Poziom 41  
    Po pierwsze nie jmp tylko najprawdopodobniej rjmp. To już sobie kompilator sam dobierze w zależności od długości procedury Flaga_z_1. Po drugie nie możesz używać brne jako skoku na koniec jakiegoś podprogramu, bo nie wiesz w jakim stanie będzie flaga Z, ani też nie wiesz jak długa będzie funkcja Flaga_z_1 (brne to skok relatywny, tak samo jak rjmp). Po trzecie Twój program działa źle, bo w przypadku zmiennej o wartości 0b10000000 wykona tylko jedną pętlę i wszystkie warunki Flaga_z_0 dla pozostałych bitów zostaną pominięte. Po czwarte jeśli robisz AND zmiennej z 0b10000000, to musisz przesuwać zmienną w lewo, a nie w prawo, jeśli chcesz przetestować pozostałe bity. Inaczej, cała ta pętla jest bez sensu, bo zwróci wartość tylko najstarszego bitu a dla pozostałych zawsze pokaże 0. Dziwię sie, że jeszcze tego nie zauważyłeś.
    Swoją drogą dla higieny zmieniłbym jeszcze swój program w taki sposób:
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

    Jeszcze jedno. Funkcje Flaga_z_1 i Flaga_z_0 u mnie powinny mieć nazwę Bit_1 i Bit_0 odpowiednio, co widać po komentarzu w tych funkcjach.
  • #5 15834674
    kamyczek
    Poziom 38  
    Każda metoda jest dobra kwestia tego co bardziej podoba się autorowi programu . Tu opcji jest wiele liczy się efekt . Takie rozwiązania optymalizuje się pod kątem szybkości wykonywania kodu lub objętości programu a czasem innych parametrów np. niezmiennego czasu wykonywania warunków , tu można zrobić tak żeby było szybko zajmowało mało miejsca i trwało tyle samo z warunkiem na tak i na nie . I nie ma się co spierać co jest lepsze bo każdy ma jakieś zalety i wady ;)
  • #6 15834706
    ASMnauka_
    Poziom 15  
    kamyczek, Masz rację.
    Jest to część podprogramu do dekompresji czcionki zakodowanej wcześniej RLE.
    excray napisał:
    Po trzecie Twój program działa źle, bo w przypadku zmiennej o wartości 0b10000000 wykona tylko jedną pętlę i wszystkie warunki Flaga_z_0 dla pozostałych bitów zostaną pominięte.

    Nie prawda, w tym przypadku wykona się zawsze 8 razy dla LSR:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Natomiast w tym LSL również wykona się 8 razy:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Istotne jest załadowanie poprawnej maski.
    Swoją drogą jest to ciekawa pętla do 8 ;)
  • Pomocny post
    #7 15834854
    michalko12
    Specjalista - Mikrokontrolery
    ASMnauka_ napisał:
    brne Flaga_Z_0

    Zdaje się, że ta instrukcja jest zbędna.

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


    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod
REKLAMA