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

XMega - Wykorzystanie DMA do odczytu czcionki. Czy jest możliwe ?

ASMnauka_ 17 Lis 2015 11:07 969 8
  • #1 15158816
    ASMnauka_
    Poziom 15  
    Witam.
    Aktualnie kod ASCII odczytuję w następujący sposób
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Przy czym Adres_rampx to adres startowy odczytu ciągu tekstu z pamięci SRAM.
    W rejestrze R2 mam kod znaku(litery).
    Następnie skaczę do etykiety Litera, gdzie w Select Case odczytuję kod przechwycony przez R2 za pomocą kopiowania zawartości rejestru do rejestru MOV R3, R2.
    I tu się zastanawiam, czy jest możliwe użycie DMA. Myślę, że tak, ale nie jestem pewien.
    Proszę o podpowiedź.
  • #2 15159078
    tmf
    VIP Zasłużony dla elektroda
    A w jakim celu chciałbyś użyć DMA i czego się spodziewasz? Bo jeśli prześpieszenia kodu to nie bardzo - raz, że przy takich duperelach inicjalizacja DMA jest bardziej czasochłonna niż przesłanie programowo danych, dwa, że DMA nie transferuje danych szybciej, a przynajmniej nie musi transferować szybciej. Da się twoją pętlę zrobić z użyciem DMA, a w przerwaniu po każdej transakcji umieścić funkcję jak sądzę wyświetlającą literę, ale poza pokazaniem, że tak się da IMHO sensu to nie ma.
    BTW, widzę, że dzielnie walczysz z problemami nieznanymi w innych językach. Jak już napiszesz swój kod, to wrzuć go na forum, porównamy z tym co wyprodukuje kompilator C. Już idę o zakład, że kod wygenerowany przez kompilator C będzie górą :)
  • #3 15159252
    ASMnauka_
    Poziom 15  
    tmf napisał:
    Da się twoją pętlę zrobić z użyciem DMA, a w przerwaniu po każdej transakcji umieścić funkcję jak sądzę wyświetlającą literę, ale poza pokazaniem, że tak się da IMHO sensu to nie ma.

    Nie chodzi mi o tą pętlę, którą przedstawiłem.
    Za nią muszą być co najmniej dwie.
    Pierwsza odczytująca wszystkie bajty danej litery.
    Druga wewnątrz pierwszej, która odczyta każdy bit z bajta.
    tmf napisał:
    Już idę o zakład, że kod wygenerowany przez kompilator C będzie górą :)

    Zapewne programujesz już kilka lat, więc nie porównuj moich wyników do twoich.
    A swoją drogą jak C poradzi sobie ze zmiennymi adresami przyporządkowanymi każdemu znakowi ASCII, jeżeli czcionka jest różnej szerokości ?
    Czyżby kompilator C potrafił wyprodukować coś lepszego od Select Case ?
    Owszem, w grę wchodzi IF Else.
    Nie wiem i jestem zdania, że nie.
  • #4 15159289
    tmf
    VIP Zasłużony dla elektroda
    Użycie DMA ma sens jeśli robsz w miarę proste przesłanie z punktu A do punktu B, najlepiej jeśli ta operacja może odbywać się asynchronicznie w stosunku do reszty kodu i jeśli przesyłana ilość danych jest duża lub przesłąnie zależy od jakiegoś czynnika, np. pojawienia się danych na USART, SPI, czy innym wolnym ukł. peryferyjnym. W twoim przypadku DMA się raczej nie przyda.
    Co do czcionki proporcjonalnej - poradzi sobie tak samo, to co musisz wymyśleć to algorytm, tylko jego implementacja zależy od języka. W tym przypadku żadne select/case nie jest potrzebne. Kod ASCII znaku jest indeksem do tablicy wskaźników, wskazujących na jego opis (bitmapę). Dodatkowo pierwszy bajt opisu może zawierać szerokość czcionki. Kod wynikowy sensownej implementacji tego pomysłu w C będzie identyczny z implementacją w asemblerze.
  • #5 15159323
    ASMnauka_
    Poziom 15  
    tmf napisał:
    Kod ASCII znaku jest indeksem do tablicy wskaźników, wskazujących na jego opis (bitmapę).

    No dobrze, załóżmy, że mam czcionkę o różnej szerokości.
    Kod ASCII litery p to 112, szerokość czcionki to 4 bajty (32 pikse).
    I jeśli kolejna czcionka jest tej samej szerokości to nie ma problemu, po prostu dodaje taki sam offset.
    Natomiast, jeżeli kolejna czcionka jest mniejszej, lub większej szerokości to muszę tą informację zapisać.
    Następnie kolejnemu kodowi ASCII ją przydzielić.
    Mam rację ?
    tmf napisał:
    Dodatkowo pierwszy bajt opisu może zawierać szerokość czcionki.
    Oczywiście gdzieś tą informację muszę zapisać.
    Mogę w tablicy pamięci SRAM, jak i przed każdą czcionką.
    Mogę również odczytać ją z zewnętrznej pamięci SPI.
    Ale tu gra toczy się o optymalność .
  • #6 15159594
    tmf
    VIP Zasłużony dla elektroda
    Tablicę wskaźników tworzy sam kompilator/asembler, nie ma potrzeby samemu wyliczać kolejnych ofsetów.
    W złych miejscach szukasz też optymalizacji. Przede wszystkim informację o szerokości znaków w pikselach (nie bajtach) zamieściłbym tuż przed opisem znaku - jest to logiczne, gdyż dotyczy opisu konkretnego znaku. Ale na optymalizację miejsce umieszczenia tej informacji nie ma wielkiego wpływu. Równie dobrze można wskaźniki przeplatać informacją o szerokości znaku, tyle, że będzie to IMHO bałaganiarstwo. W asemberze, który jest bałaganiarski zapewne estetyka i przejrzystość nie jest najważniejsza :)
  • #7 15165308
    ASMnauka_
    Poziom 15  
    Tak więc ostatecznie będę to robił w następujący sposób.
    Pierwsza pętla, odczytuję kody ASCII
    Druga pętla, odczytuję bajty w czcionce (ilość tych bajtów wychodzi z dzielenia ilości pikseli przez 8)
    Trzecia pętla, wskazuję na kolejny Bit w Bajcie i jeśli flaga Z = 1 to wysyłam na port kolor czcionki, a jeśli Z = 0 wysyłam kolor tła.
    Natomiast jeśli chodzi o zapis samej tablicy czcionki to na początku zapiszę tylko jej wysokość, natomiast przed każdym znakiem ilość pikseli.
    Czy taki sposób jest dobry ?
  • #8 15165567
    Konto nie istnieje
    Poziom 1  
  • #9 15165955
    ASMnauka_
    Poziom 15  
    Marek_Skalski napisał:
    Jesteś wyjątkowo uparty i na siłę tworzysz coś, co wcale nie będzie efektywne, ale będzie Twoje, prawda?

    Marek , z wyrazami szacunku, nie chcę wymyślać, lub też tworzyć.
    Pragnę jedynie nie wzorować się na rozwiązaniach innych, lecz napisać coś, co mi przyniesie satysfakcję.
    Marek_Skalski napisał:
    Kluczem jest umiejętne operowanie wskaźnikiem i adresowanie względne, a nie szukanie za każdym razem właściwego adresu w pamięci programu.

    Ja nie chcę go szukać, lecz wskazywać.
    Marek_Skalski napisał:
    A co będzie jak będziesz miał kilka czcionek?

    Właśnie z tego powodu proszę o radę, ten pod pod program ma być uniwersalny czyli zarówno dla czcionki o stałym rozmiarze, jak i zmiennym.
    Marek_Skalski napisał:
    Twój pomysł ma jeszcze tę słabość, że nie pozwala dodać kolorów, ani transparentności.

    Marek koloru czcionki, czy też jej przezroczystości nie chcę uzyskiwać przed odczytem z tablicy czcionek.
    Dopiero po odczycie danego bitu decyduję o jego kolorze.
    Innymi słowami jeśli piksel o współrzędnych X = 100, Y = 100 jest równy 1 to jego kolor = czarny.
    Nie mam pojęcia jakk to wytłumaczyć lepiej.
REKLAMA