Zakres laboratorium:
- wymiana danych pomiędzy zadaniami
- kolejki zadań wieloelemenetowe
- kolejki zadań jednoelementowe
- strumienie
- bufory wiadomości
Materiały:
Zadanie 1
Co to są kolejki, do czego można ich używać? Jak działa funkcja “xQueueCreate”, czym są argumenty? Czym są elementy na kolejce?
Utworzyć kolejkę zawierającą miejsce na 10 elementów zawierających:
- zmienna int – indeks wiadomości, zwiększany za każdym razem po dodania nowej wiadomości
- zmienna int – indeks producenta – numer wątku producenta jaki dodał wiaodmość
- zmienna TickType_t – czas dodania wiadomości na kolejkę
Utworzyć trzy wątki:
- wątek 1 – producenta 1, który co 1 sekundę dodaje do kolejki kolejną wiadomość i wyświetla odpowiedni komunikat. Jeśli nie może dodać wiadomość do kolejki to wyświetla stosowną informacje
- wątek 2 – producenta 2, który co 1 sekundę dodaje do kolejki kolejną wiadomość i wyświetla komunikaty jak wątek 1
- wątek 3 – konsument, który co 1 sekundę pobiera wiadomość, i wyświetla jej zawartość na terminalu. Oblicza czas przechowywania pobranej wiadomości w kolejce. Wyświetla informcje o ilości wiaodmości w kolejce.
jak działa taki program? co się stanie jak kolejka zostanie zapełniona? Jakie są parametry funkcji dodających i pobierających? Jak synchronizować indeksy wiadomości?
Należy pamiętać, aby zasób wspólny – interfejs komunikacyjny zabezpieczyć odpowiednim mechanizmem.
Zadanie 2
Czym rożni się funkcja “xQueuePeek” od funkcji “xQueueReceive”.
przerobić program z zadania 1 tak aby:
- watek 1 dodaje do kolejki informacje i oczekuje na wolne miejsce w przypadku zapełnienia kolejki, przez odpowiedni argument funkcji dodającej do kolejki
- wątek 2 dodaje informacje do kolejki, a w przypadku braku miejsca nie oczekuje na jego zwolnienie w funkcji dodające. Pracuje bez oczekiwania w pętli z opóźnieniem 500ms i migał diodą LED
- zaproponować i wdrożyć mechanizm synchronizacji indeksów wiadomości dodawanych do kolejki, tak aby indeksy były unikatowe
- wątek 3 pracuje jak w zadaniu 1
- dodać wątek 4 – który nadzoruje stopień zapełnienia kolejki, jeśli kolejka jest pełna to sygnalizuje to odpowiednią diodą LED
Zadanie 3
Kolejka jako mechanizm dzielenia danych. Jak działa funkcja “xQueueOverwrite”
Utworzyć program który:
- 1 wątek dokonuje pomiarów analogowych raz na 0,5s, wykorzystać odpowiednie kanały ADC i zadajniki napięcia z płytki. Pomiaru dokonujmy z dwóch potencjometrów (piny na płytce A_POT2 i A_PHOTO (to jest 2 potencjometr, w opisach na płytce jest błąd)). Wartości zapisujemy do kolejki z znaczkiem ostatniego pomiaru (czas pomiaru).
- 2 wątek – odbiera informacje o nowych pomiarach, i dokonuje przeliczenia na wartość w mV, jak i również wylicza średnią z ostatnich 10 pomiarów. Gotowe dane publikuje do kolejki jednoelementowej z znacznikiem czasu.
- 3 wątek – pobiera informacje z kolejki jednoelementowej, ale ich nie kasuje. Sprawdza, czy są nowsze dane, jeśli tak to wyświetla informację o ich wartościach i czasie na terminalu
- 4 wątek – pobiera informacje z kolejki jednoelementowej i wykorzystuje je do wysterowania wskaźnikiem LED-owym napięcia (im większe napięcie tym świeci się więcej diod LED-wykorzystujemy diody LED_1-LED_7)- wykorzystujemy wartości uśrednione z jednego potencjometru.
- 5 wątek – porównuje uśrednione wartości z dwóch kanałów pomiarowych (odczytane z kolejki) i jeśli jedna wartość jest większa od drugiej to uruchamia diodę LED_8. Jeśli wartość jest mniejsza to wyłącza diodę LED_8. jak działa taki program gdy dwie wartości są prawie identyczne? Zaproponować rozwiązanie problemu.
- 6 wątek – oczekuje na naciśnięcie przycisku, jeśli przycisk zostanie wciśnięty na krótko, to wyświetla informacje o pomiarze na kanale 1. Jeśli przycisk będzie wciśnięty długo-ponad 1 sekundę to wyświetla na terminalu informacje o pomiarach na kanale drugim (czas ostatniego pomiaru, wartość chwilową, wartość uśrednioną)
Zaproponować odpowiednie mechanizmy wymiany danych, elementy kolejek itd. Narysować graf przepływu informacji między wątkami z dokładnym opisem wątków i mechanizmów wymiany danych.
cdn.