Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32][CodeSourcery] memcpy

08 Mar 2011 14:27 1681 6
  • Poziom 20  
    Witam
    Panowie mam takie pytanie:
    używając pętli for kopiowanie np 5 tys elementów z jednego bufora od drugiego trwa jakieś ~1,85ms. Mierzę to timerem robiąc przerwania co 50us.
    Jak używam memcpy to 5tys elementów kopiuje w 50us a dla 10 tys jest 100us .
    Czy to możliwe ? czy po prostu memcpy blokuje przerwania od mojego timera
  • Użytkownik usunął konto  
  • Poziom 35  
    memcpy nie ma prawa blokować jakiegokolwiek timera. To jest zwykła funkcja biblioteczna, i na pewno nie sprawdza ktory akurat timer masz włączony i również nie ma kodu aby go wyłączyć.

    Memcpy jest najpewniej napisany w assemblerze i został odpowiednio zoptymalizowany.

    Kopiowanie duzej tablicy bajtów w pętli spowoduje kopiowanie się bajtu po bajcie, zamiast pracować na całych 32bitowych słowach tu gdzie to mozliwe. Memcpy może taką opcję przewidywać.

    Ja radziłbym ci użyć niewykorzystanego kanału DMA w trybie mem2mem. DMA zrobi to znacznie szybciej niż jakakolwiek pętla, bo jest oddzielnym busmasterem AHB a licznik ma w krzemie :]
    Wtedy wystarczy, że odpalisz DMA i poczekasz na bit TCIF w rejestrze DMAxChannelx->SR (a nastepnie zgasisz bit). Przerwan nie musisz włączać ani w DMA, ani w NVICu.

    Straszne jest to:
    Smashing napisał:
    Mierzę to timerem robiąc przerwania co 50us.

    Po co ci przerwanie od timera ktore wprowadza ci błędy pomiaru?
    Użyj preskalera, każ timerowi 'cykać' co 10us, włącz przed wywołaniem funkcji, wyłącz po wyjsciu z funkcji, i przechwyc wartość z rejestru TMRx (chyba tak sie nazywał). Masz w jednostkach 10us czas w miarę precyzyjnie, bez przerwań timera. I naliczysz max 655360us.
  • Poziom 20  
    Witam
    tak czy siak nie chodzi mi tutaj o pomiar czasu, miało to być tylko orientacyjnie.
    Pętli for użyłem tylko żeby zobaczyć orientacyjny czas... dla pętli for
    W FreeRtos kopiując "kolejkę" używają właśnie memcpy, myślałem żeby użyć tam DMA, ale teraz się zastanawiam (stąd ten post ) czy goście z CodeSourcery nie zrobili tego memcpy na DMA, bo czas kopiowania jest bardzo krótki.
  • Specjalista - Mikrokontrolery
    Smashing napisał:
    ale teraz się zastanawiam (stąd ten post ) czy goście z CodeSourcery nie zrobili tego memcpy na DMA, bo czas kopiowania jest bardzo krótki.


    Nie zrobili, nie wszystkie uC maja DMA, poza tym kompilator nie ingeruje w żadne peryferia.
  • Użytkownik usunął konto  
  • Poziom 35  
    smashing napisał:
    bo czas kopiowania jest bardzo krótki.

    50us to nie jest krótko. A juz na pewno nie "bardzo krótko". Tak na prawdę nie wiesz, czy funkcja wykonuje się 50us czy 80us, bo lipnie mierzysz czas...