Witam.
klonyyy napisał(a):
....Mimo to mam kilka pytań na które odpowiedzi nie znalazłem:
1. Rozumumiem, że wątki daje się w pętli nieskończonej. Znalazłem wiele przykładów, że usunięcie "taska" znajduje się zaraz po zakończeniu pętli nieskończonej. Co to oznacza ? Czy wątek wykona się raz i się usunie, czy może wogóle się nie usunie ? Chodzi mi o coś takiego :
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Raz się wykona i sam się usunie. Czyli takie "One Touch"
. Czyli, aby go znowu użyć, trzeba znów xTaskCreate (....).
klonyyy napisał(a):
2. Jeśli mam funkcję wyświetlającą czas na wyśiwetlaczu i wygląda ona tak :
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jednak chciałbym dać ją w nowym wątku, by była aktualizowana. Jej argumenty muszą być wypełnione przez inną funkcję (wątek). Powieniem wtedy użyć kolejki ? Czy może wogóle robić z niej nowego zadania ?
Najlepiej, by wątki wymieniały się danymi jedynie poprzez kolejki. Można to zrobić na przykład poprzez przekazywanie wskaźnika na strukturę danych z wątku, który ją "wypełnia" ( zadeklarowaną jako static bądź dynamicznie przez pvPortMalloc(... ) ). Czyli stosujemy np taki mechanizm: wątek A coś tam liczy , a wątek B ( wyświetlacz ) nie robi nic ( jest w stanie suspend ), dopóki nie nadejdzie kolejka z wątku A. Istnieje co prawda możliwość przekazywania danych między wątkami powołując zmienne globalne, ale warto tego unikać za wszelką cenę. Choć ja osobiście nieraz z tego korzystam w celach testowych i tylko testowych !!!
klonyyy napisał(a):
3. Usuwanie wątków. Rozumiem, że jak usunę dany watek, pamięć RAM dla niego przeznaczona zostaje zwolniona ?
To zależy od modułu zarządzania pamięcią. W heap_1.c na pewno nie. Dla heap_2.c i heap_4.c usunięcie wątku powoduje zwolnienie pamięci, o szczegółach musisz doczytać. Z tego co pamiętam, heap_2.c po usunięciu taska pozostawia na stercie wolny obszar pamięci, ale jeśli stworzysz nowego taska, który potrzebuje więcej pamięci niż ta "dziura", to system z miej nie skorzysta, tylko poszuka większego wolnego bloku.
klonyyy napisał(a):
4. Zasady pisania przy uzyciu FreeRTOSA. Jakie funkcje powinno się uruchamiac jako wątki ? Te wyższego rzedu tzn wav_player(), lcd_bmp(), czy nawet te sprzętowe np spi_send() ? Wiem, że pewnie jest to głupie pytanie i sam powinienem znać na nie odpowiedź pisząc swój kod, ale może przynajmniej napiszcie co Wy uruchamiacie w wątkach.
Tak jak Ci pisałem powyżej, najlepiej zbytnio nie "rozdrabniać" programu, ze względu na wydajność systemu oraz wykorzystania pamięci ze sterty ( choć jeśli będziesz usuwał nieużywane wątki, to ten argument odpada ). W projekcie na STM32F072 mam takie wątki: 1.menu konfiguracyjne, 2.menu podręczne, 3.FATFS, 4.główny algorytm urządzenia, 5.pomiary OneWire, 6.display_refresh ( ale ten z vTaskDelay jako "podstawa czasu" do odświeżania - tak było po prostu najwygodniej ), 7. Klawiatura TSC i IR_Rec, 8.komunikacja przez 2 UARTY. To i tak w tej chwili wydaje mi się za dużo, nie wiem, czy jeszcze tego nie przebuduję. U mnie menu jest tak podzielone, bo mam baaardzo wolny wyświetlacz. U siebie wątków nie usuwam, bo samo ich tworzenie też trochę trwa.
klonyyy napisał(a):
EDIT: Wczoraj także zorientowałem się i wybrałem najlepszy według mnie mikrokontroler do tego zadania, a mianowicie STM32f407VGT6.
Mając do dyspozycji tyle RAM-u, co ma ten procek, możesz poszaleć, choć z drugiej strony dożo zależy od tego, jak będziesz obsługiwał wyświetlacz. I jeszcze taka jedna uwaga: ze względu na to, że przed przełączaniem tasków, musi nastąpić odłożenie wszystkich aktualnych zmiennych danego wątku na stercie, nie warto przesadzać z "zagłębieniami" jeśli chodzi o wywoływanie funkcji - tu to "kosztuje" duuużo więcej niż przy programowaniu "na piechotę". A... i jeszcze mi się coś przypomniało: jeśli deklarujesz stosy na poszczególne taski, wyrównuj ich rozmiary modulo 8, bo możesz się zdziwić
.
Pozdrawiam, QuadMan.