Zakres laboratorium:
  • wymiana danych pomiędzy zadaniami
  • kolejki zadań wieloelemenetowe
  • kolejki zadań jednoelementowe
  • strumienie
  • bufory wiadomości
Materiały:
  • mechanizm kolejek: link
  • funkcje do obsługi kolejek: link
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.