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 - Program na przerwaniach - ilość taktów zegara.

25 Lip 2012 11:40 2036 4
  • Poziom 27  
    Robię program składający się głównie z przerwań. Program steruje 6 silnikami krokowymi. Uruchomiłem więc 6 timerów dla kazdego silnika w trybie PWM, wypełnienie zawsze 50%, sterowanie częstotliwością. Żeby każdy silnik mógł wykonać zadaną ilość kroków (a zalezności miedzy silnikami są skomplikowane i nieprzewidywalne), każdy timer po wykonaniu impulsu wywołuje przerwanie w którym dekrementuje swój licznik kroków i sprawdza czy =0, jeżeli tak, to zatrzymuje silnik (tez nie tak po prostu bo to duże silniki i wymagają miękkiego startu i stopu - tym zajmuje się inne przerwanie). Jest 6 silników, kazdy może pracować z częstotliwością max. 10kHz, czyli w kazdej sekundzie może być nawet 60000 przerwań (poza trzema innymi wywoływanymi co 10ms, 20ms). Na razie wszystko działa bardzo płynnie, ale chciałbym wiedzieć ile mam zapasu, ile % czasu procesora zajmują w najgorszej sytuacji przerwania. Kod jednego przerwania wygląda tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Licznik krok jest typu unsigned int. Ile cykli zegarowych (orientacyjnie) zajmuje takie przerwanie? Kiedy pisałem w asm, umiałem to policzyć, tu jakoś nie bardzo, wychodzi mi jakieś 8, ale nie jestem pewien. Procesor STM32F103ZET, 72MHz. Czy w procesorach STM32 wiekszość rozkazów wykonuje się w 1 cyklu zegarowym?
  • Pomocny post
    Poziom 38  
    dziechu napisał:
    Czy w procesorach STM32 wiekszość rozkazów wykonuje się w 1 cyklu zegarowym?


    Nie wszystkie. Jeśli chcesz mieć bardzo dokładnie oszacowany czas w cyklach to musisz zdeasemblować program, zajrzeć do dokumentacji, żeby sprawdzić ile czasu się wykonuje jeden rozkaz i sprawdzać rozkaz po rozkazie.

    Jak zależy Ci na prędkości i oszczędności co do rozkazu, to warto używać bitbandingu.

    10kHz to jest prędkość żółwia dla tego procesora.
  • Poziom 27  
    Ach, bitbanding używam nagminnie i bardzo mi się podoba:) Sugerujesz bitbanding dla kasowania flagi przerwania? Nie pomyślałem o tym, tak zrobię, dzięki. Czyli twiedzisz że 6*10kHz takich przerwań to dla tego procesora pikuś i nie ma co sie przejmować liczeniem?
  • Pomocny post
    Specjalista - Mikrokontrolery
    dziechu napisał:
    wychodzi mi jakieś 8

    8 cykli to zajmuje pierwsza linijka <; wejście do przerwania to następne kilkanaście + wyjście.

    dziechu napisał:
    Sugerujesz bitbanding dla kasowania flagi przerwania?

    No przecież właśnie o to chodzi - żebyś nie musiał odczytywać, modyfikować i zapisywać z powrotem.

    dziechu napisał:
    Czyli twiedzisz że 6*10kHz takich przerwań to dla tego procesora pikuś i nie ma co sie przejmować liczeniem?

    Policz sam - aby przerwania zajęły 100% czasu rdzenia, każde musiałoby trwać 1200 cykli...

    4\/3!!
  • Poziom 27  
    Czyli tak jak myślałem, dzięki:) Właśnie nie pomyślałem ze w C taka linijka TIM3->SR &= ~TIM_SR_UIF to przecież wczytanie rejestru, wykonanie operacji logicznej i zapis. Jest juz zrobione jako bitbanding. Muszę nauczyc sie pilnować takich rzeczy, do tej pory używałem bitbandingu tam gdzie często wykorzystywalem dany bit - dla wygody, ale przecież powinno sie tego używać także, a może przede wszystkim dla skrócenia kodu wynikowego. Dzięki jeszcze raz.