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

Wykorzystanie systick do delay a FreeRTOS

szefkozak 23 Kwi 2012 21:48 1870 11
  • #1 23 Kwi 2012 21:48
    szefkozak
    Poziom 11  

    Witam, i od razu przepraszam jeżeli temat się pojawił, ale jakoś nic nie byłem w stanie znaleźć. Stworzyłem sobie projekt wyjściowy(ustawienie PLL itp..) do pisania większych projektów dla LPC1768 i planuję napisać sobie biblioteki do peryferii typu timery uart wyświetlacz lcd. Jak wiadomo większość takich sterowników musi korzystać z funkcji typu delay(). Bardzo łatwym rozwiązaniem wydaje się użycie systick. Jednak w przyszłości chciałbym również pobawić się z freeRTOS'em, o którym wiem niewiele, ale wiem że korzysta on z systick. Czy w takim razie jeżeli w swoich bibliotekach wykorzystam funkcje delay oparte na systick ,sprawi to że staną się one bezużyteczne w połączeniu z freeRTOS? Innym pomysłem jest wykorzystanie po prostu układów licznikowych do odmierzania opóźnień. Bardzo bym prosił o porady na co uważać pisząc funkcje opóźniające tak aby w przyszłości nie powodowały konfliktów z freeRTOS. Z góry dzięki:)

    0 11
  • #2 23 Kwi 2012 21:57
    gaskoin
    Poziom 38  

    freertos ma systemową funkcję do opóźnień (w ms). Generalnie korzystanie z opóźnień to zło, ale jeśli już musisz z nich korzystać, to w nagłówkach bibliotek możesz zrobić makro, w którym to wybierzesz sobie sam z czego korzystać :)

    0
  • #3 23 Kwi 2012 22:10
    szefkozak
    Poziom 11  

    Faktycznie korzystanie z opóźnień przynosi same problemy, przynajmniej mi:), ale moim zamiarem jest napisanie uniwersalnych funkcji opóźnień niezależnych od prędkości procesora, aby zawsze opóźnienie trwało tyle samo, a konkretnie aby sprzęt nigdy się nie "opierdzielał" dłużej niż musi. Reasumując budować biblioteki tak aby w przypadku wykorzystania RTOS korzystały z systemowych funkcji opóźnień, a w przeciwnym razie z moich funkcji? Wiem, że praktycznie powtórzyłem to co napisałeś ale wole mieć pewność zanim zabrnę w pisanie bezużytecznego kodu. BTW dzięki za szybką odpowiedź.

    0
  • #4 23 Kwi 2012 22:12
    gaskoin
    Poziom 38  

    Coś w tym stylu. Przemyśl jeszcze, czy nie da się tego napisać całkiem bez delaya.

    0
  • #5 23 Kwi 2012 22:20
    szefkozak
    Poziom 11  

    Mam nadzieję że nie pisze teraz głupot, ale na przykład w sterowaniu wyświetlaczem z sterownikiem hd44780 niektóre sygnały muszą trwać pewną minimalna chwilę czasu i nie jest możliwe zastosowanie kombinacji: while("jakiś bit" != 0);

    Tak czysto hipotetycznie gdybym jednak wykombinował coś nie korzystającego z timerów, powinienem unikać jakichś konkretnych nazw funkcji, żeby nie powodować konfliktu z funkcjami systemowymi?

    0
  • #6 23 Kwi 2012 22:28
    gaskoin
    Poziom 38  

    Polecałbym Ci wyświetlacz graficzny bo są w miarę tanie a obsłużysz je sprzętowo.
    HD44780 ma flagę zajętości (jako linię IO) dzięki któremu można zrobić to o czym piszesz :)

    0
  • #7 23 Kwi 2012 22:41
    szefkozak
    Poziom 11  

    Ok, nie udało się bez pisania głupot:). Wielkie dzięki.

    0
  • #8 23 Kwi 2012 22:43
    michcior
    Poziom 30  

    We FreeRTOS pisze się wątki. Jak użyjesz w wątku funkcji vTaskDelay to system nie zwiesi się cały na ten czas tylko wątek z którego wołamy tą funkcję. W tym czasie system będzie robił inne rzeczy. Można przyjąć iż użycie tej funkcji gwarantuje opóźnienie nie mniejsze niż zadane ale może być większe - jak system będzie miał zadania o wyższym priorytecie.

    Porządne drajwery nie używają sztywnych opóźnień tylko działają asynchronicznie, to znaczy korzystają z przerwań, np. UART ma przerwania od FIFO. Czy jak wspomniano już tutaj, monitoruje się przerwaniem linie "BUSY".

    Ciężko napisać drajwery uniwersalne, specyfika systemy, takiego choćby jak FreeRTOS zakłada komunikację pomiędzy wątkami, co kosmicznie ułatwia pisanie programów. Radziłbym skupić się na napisaniu bibliotek tzw. HAL - czyli Hardware Abstraction Layer, a potem do tego warstwę "klejącą" do systemu FreeRTOS. Tak jest profesjonalnie.

    0
  • #9 23 Kwi 2012 22:52
    gaskoin
    Poziom 38  

    Zgadza się, dość fajnie można rozdzielić np wyświetlanie obrazu na LCD od innych rzeczy nie gimnastykując się z warunkami "jakby tu to oddzielić".

    STMy mają dość dużo IO więc postaraj się raczej użyć tej flagi R/W do sprawdzania czy wyświetlacz nie jest zajęty. W przypadku np one wire można użyć uarta żeby nie martwić się czasówkami, co jest zalecane w przypadku szybkich procesorów.

    Z reguły większość sprzętu na który trzeba czekać, a jest on obsługiwany przez szybkie kontrolery, ma sprzętowe flagi.

    0
  • #10 23 Kwi 2012 23:19
    szefkozak
    Poziom 11  

    A jak mniej więcej wygląda to rozgraniczenie między sterownikiem HAL a warstwą "klejącą". Z tego co mi podpowiada wiki oraz intuicja to należy tak napisać sterowniki, aby w warstwie klejącej połączyć funkcje systemowe z funkcjami sterownika?

    0
  • #11 24 Kwi 2012 07:15
    michcior
    Poziom 30  

    Np. UART może mieć takie funkcje:
    - OpenUart(<numer, paramtery, opcje itd>)
    - ReadChar(), WriteChar()
    - ReadBuffer, WriteBuffer(<wskaznik na bufor, ile znakow>)
    - IsFifoEmpty
    - IsFifoFull
    Użycie przerwań to już trochę bardziej skomplikowane, bo można to zrobić na wiele sposobów. Np. dany otwarty UART powinien mieć bufory do których czyta i zapisuje w wyniku działania przerwań. Jeśli mikrokontroler jest dość szybki i ma trochę pamięci to można stworzyć strukturę tzw "kontekstu" i podawać ją jako wskaźnik do każdej z funkcji sterownika. Taka struktura przechowuje wszystkie informacje o stanie, bufory i inne ustawienia. Wygodne, przejrzyste tylko odrobinę zabiera kodu, wydajności i pamięci.

    0
  • #12 24 Kwi 2012 10:08
    szefkozak
    Poziom 11  

    Dzieki wszystkim za odpowiedź. Moge teraz jakoś wiedzę poukładać, a na pewno mam kierunek poszukiwań:)

    0