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

[stm32f105][C/Eclipse] - FreeRTOS Taski się nie zmieniają

DuMaM 01 Paź 2015 16:59 1089 5
REKLAMA
  • #1 15035116
    DuMaM
    Poziom 10  
    Posty: 60
    Witam,

    Problem polega na tym, że po dodaniu do projektu bibliotek FreeRTOS'a i "poprawnym" jego skonfigurowaniu mam problem z SysTickiem i jego przerwaniem.

    Samo w sobie przerwanie działa poprawnie. Są zgłaszane przerwania co określony czas jednak taski nie są w stanie się przełączać. Planista ciągle siedzi w ostanio utworzonym tasku. Początkowo myślałem, że system gryzie się z ustawionymi przeze mnie przerwaniami więc je wyłączyłem. Nie przyniosło to pożądanego efektu.

    Chciałem sprawdzić jak wyglądają rejestry w trakcie pracy programu. Konfiguracja przebiega prawidłowo i rejestry są ustawione identycznie jak gdybym to robił za pomocą SysTick_Config. Zaś konfiguracja RTOSa była zaczerpnięta z dema dla stm32f107 oraz z poradnika Elektroniki praktycznej. Nie posiadam też nigdzie indziej zadeklarowanych funkcji Handlerow. Nie zauważyłem, żadnego problemu jeśli chodzi o priorytety tasków oraz przerwań więc już naprawdę nie wiem gdzie szukać błędu.

    Używam:
    heap_4.c
    FreeRTOS v8.2.2
    Gcc 4.9

    Poniżej wstawiam kod.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 15044313
    DuMaM
    Poziom 10  
    Posty: 60
    Kurcze zrobiłem czysty projekt, z 2-woma taskami które były pętlą for(;;) i nic więcej i podobny objaw. Ciągle siedzi w jednym tasku.

    Naprawdę nikomu nic do głowy nie przychodzi? ;c
  • REKLAMA
  • #3 15044359
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    Oba taski maja ten sam priorytet ? Sprobuj sprawdzic czy przerwanie od SysTiicka dziala (breakpoint). Mozesz tez sprobowac wrzucic tutaj kod, ktory nie dziala (okrojony najbardziej jak to mozliwe).
  • REKLAMA
  • #4 15045056
    DuMaM
    Poziom 10  
    Posty: 60
    GrzegorzKostka napisał:
    Oba taski maja ten sam priorytet ? Spróbuj sprawdzić czy przerwanie od SysTiicka działa (breakpoint). Możesz tez spróbować wrzucić tutaj kod, który nie działa (okrojony najbardziej jak to możliwe).


    Powiem tak, na stm32f105 jeśli dobrze pamiętam to timer działa, a zmiana priorytetów nic nie dawała. Dzisiaj jednak pomęczyłem się z gołym projektem dla stm32f429. Tu udało mi się uruchomić system. Fakt działa to dobrze gdy są identyczne priorytety, w przeciwnym wypadku jest problem.

    Z tego co czytałem to RTOS powinien zmieniać taski pomiędzy sobą w zależności o priorytetu. Ja to sobie tak tłumaczyłem, że to jest coś na kształt kolejki, że są po kolei włączane odpowiednie taski. Gdzie może od czasu do czasu zgłosić się task z wyższym priorytetem wywłaszczając inne. Tu tak się nie dzieje jeśli są inne priorytety. Teraz czym to jest spowodowane? Tym, że zadanie jest za często zgłasza chęć wywołania i "wygryza" inne o mniejszym priorytecie? Jeśli tak jak temu zaradzić?

    Co do kodu. Jutro postaram się wrzucić.
  • REKLAMA
  • Pomocny post
    #5 15045152
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    FreeRTOS dziala w uproszczeniu tak, że wykonuje zadanie o najwyższym priorytecie, które jest gotowe do wykonania. Jezeli masz 2 taski o tym samym priorytecie i oba mają nieskończone pętle to planista przyjmie politykę szeregowania zadan Round Robin. W naszym przypadku naprzemiennie wykona będzie wykonywał 2 zadania. Jeżeli obniżysz priorytet jednemu zadaniu to zostanie ono zagłodzone bo zadanie o wyższym priorytecie zawsze będzie gotowe do wykonania i planista nigdy nie przełączy kontekstu. Jeżeli chcesz aby zadane o niższym priorytecie się wykonało to dodaj vTaskDelay do zadania o wyższym priorytecie. Wtedy planista przydzieli czas procesora obu zadaniom.
  • #6 15048008
    DuMaM
    Poziom 10  
    Posty: 60
    GrzegorzKostka napisał:
    FreeRTOS dziala w uproszczeniu tak, że wykonuje zadanie o najwyższym priorytecie, które jest gotowe do wykonania. Jezeli masz 2 taski o tym samym priorytecie i oba mają nieskończone pętle to planista przyjmie politykę szeregowania zadan Round Robin. W naszym przypadku naprzemiennie wykona będzie wykonywał 2 zadania. Jeżeli obniżysz priorytet jednemu zadaniu to zostanie ono zagłodzone bo zadanie o wyższym priorytecie zawsze będzie gotowe do wykonania i planista nigdy nie przełączy kontekstu. Jeżeli chcesz aby zadane o niższym priorytecie się wykonało to dodaj vTaskDelay do zadania o wyższym priorytecie. Wtedy planista przydzieli czas procesora obu zadaniom.


    Dzięki za pomoc. Faktycznie zagłodzenie i mój inny błąd było źródłem problemów. Po zastosowaniu vTaskDelay wszystko działa jak powinno.

    Zamykam temat.
REKLAMA