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

FreeRTOS (obsługa przerwania)

markopololop 12 Cze 2013 13:46 1380 7
  • #1 12 Cze 2013 13:46
    markopololop
    Poziom 19  

    Witam
    Jestem początkującym w temacie FreeRTOS i mam parę problemów ze zrozumieniem działania tego systemu.
    Jeśli mam jakąś obsługę przerwania i w czasie jego wystąpienia ustawiam semafor na który czeka jakieś zadanie o niskim priorytecie (albo nie najwyższym) to po wyjściu z tego przerwania to zadanie będzie niezwłocznie wykonywane czy system poczeka do przerwania SysTick (w STM32) w nim sprawdzi czy priorytety zadań i jak to zadanie które ma być odblokowane będzie miało najwyższy priorytet to dopiero będzie wykonywane??

    Proszę o wyjaśnienie tego zagadnienia bo nie daje mi spokoju
    Pozdrawiam
    Marek

    0 7
  • CControls
  • #2 12 Cze 2013 15:51
    michalko12
    Specjalista - Mikrokontrolery

    Będzie czekać aż do następnego wywołania PendSV, który jest aktywowany przez SysTick.
    Można wymusić przełączenie tasków poprzez "ręczne" wymuszenie przerwania PendSV
    za pomocą makra

    Kod: c
    Zaloguj się, aby zobaczyć kod


    lub wg takiego przykładu

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #3 13 Cze 2013 15:29
    markopololop
    Poziom 19  

    Dzięki wielkie za odpowiedź.
    Mam jeszcze jedno pytanie. Jak mam np wykonać obsługę jakiegoś czujnika komunikującego się przy pomocy SPI lub I2C to jak to zrobić pod FreeRTOS?.
    Mam przykładowo jakiś task który odczytuje stan czujnika ale powiedzmy zostanie przerwany przez jakiś inny task o wyższym priorytecie to to odczytywanie czujnika może się nie powieść. Jak takie rzeczy pisze się pod FreeRTOS. Czy mógł by mnie ktoś nakierować jak się tym posługiwać bo jakoś nie mogę się przestawić z takich zwykłych programów jakie pisze się na mikrokontrolery.

    Pozdrawiam
    Marek

    0
  • CControls
  • #4 13 Cze 2013 18:53
    alagner
    Poziom 25  

    Rzeczy atomowe np. pakujesz w sekcję krytyczną (portENTERCRITAL() i portEXITCRITICAL() ).
    Albo sprawdzasz stan transmisji przy każdym wejściu do taska, synchronizujesz je jakoś (semafory np.). Trudno powiedzieć czego dokładnie potrzebujesz...

    0
  • Pomocny post
    #5 13 Cze 2013 19:18
    michalko12
    Specjalista - Mikrokontrolery

    1.Tworzysz Mutexa żeby tylko jeden task miał dostęp do interfejsu SPI I2C ...
    2. Tworzysz semafor na dany interfejs.
    3. Tworzysz driver do obsługi interfejsu, najlepiej z obsługa przerwań od tego interfejsu.

    1. Blokujesz dostęp do interfejsu mutexem
    2. Zlecasz driverowi co gdzie ma wysłać lub skąd odebrać. Driver w tym czasie blokuje semafor aż do wykonania zadania.
    3 Czekasz w tasku, aż semafor zostanie odblokowany przez driver po wykonaniu zadania
    4. Zwalniasz mutex

    0
  • #6 14 Cze 2013 02:20
    markopololop
    Poziom 19  

    Ten driver to też jest jakiś task uruchomiony w systemie ??

    0
  • #7 14 Cze 2013 03:10
    alagner
    Poziom 25  

    Lub zespół tasków. Popatrz jak to jest zrobione w demówkach na UARTcie.

    0
  • #8 14 Cze 2013 08:20
    michalko12
    Specjalista - Mikrokontrolery

    markopololop napisał:
    Ten driver to też jest jakiś task uruchomiony w systemie ??

    Może być task, może być funkcja która jest wywoływana wspólnie z innymi z jednego wspólnego taska, może być tylko obsługa w przerwaniu. Jak driver będzie działać nie ma znaczenia oby tylko zrobił co do niego należy.

    0