Zakres laboratorium:
  • praca z system FreeRtos
  • sekcja krytyczna (link)
  • kolejki, wymiana danych pomiędzy wątkami (link)

 

Forma oceny-sprawozdanie:
  • sprawozdanie z wykonanych zadań,
  • działania każdego programu należy udokumentować przez wykonanie zrzutu ekranu i wklejenie go do sprawozdania z odpowiednim opisem,
  • odpowiedzi na pytania do zadań należy umieścić w sprawozdaniu,
  • sprawozdanie wysyłamy przez eportal w wyznaczonym terminie i prezentujemy prowadzącemu na zajęciach,
  • na prezentacji sprawozdania należy mieć przygotowane wszystkie programu ze sprawozdania w w celu ich pokazania.
Zadanie 1

Symulator interfejsu komunikacyjnego, w jednym czasie tylko jeden wątek może wysyłać swoje informacje. W poniższym zadaniu będziemy symulować interfejs komunikacyjny na podstawie tablicy. Wątki wysyłają swój własny numer przez wykorzystanie funkcji “sendData”. Funkcja wysyła/dopisuje kolejną wiadomość/liczbę do tablicy i czeka losowy czas- symulacja interfejsu gdzie następuje komunikacja z inną maszyną, wysyłamy jakieś dane a operacja może potrwać od 2-10 sekund.

  • co to jest sekcja krytyczna, opisać i wymienić kilka przykładów takiej sekcji,
  • utworzyć program składający się z 4 wątków wykonywanych co 5 sekund,
  • utworzyć tablicę składająca się z 100 elementów typu int – symulacja jakiego interfejsu komunikacyjnego,
  • utworzyć semafor do blokady sekcji krytycznej,
  • utworzyć funkcję “sendData(int numerWatku)”:
    • parametr numerWatku  – numer wątku przez jaki została wywołana,
    • funkcja na początku sprawdza czy może wejść do sekcji krytycznej – czy semafor jest wolny,
    • jeśli sekcja krytyczna jest używana przez jakiś inny wątek to funkcja zwraca false,
    • jeśli sekcja krytyczna jest nieużywana to blokuje do niej dostęp i wykonuje operacje w podanej kolejności:
      • dodaje numerWatku jako kolejną pozycję do tablicy,
      • jeśli tablica się przepełni to wyświetlamy na ekranie “koniec bufora” i nie dodajemy kolejnej liczby,
      • czeka losowy czas od 2-10 sekund,
      • wypisuje na ekranie czas programu i zawartość tablicy, kolejne liczby rozdzielone przecinkiem przykładowy (48454545-1,2,3,4,3,2,1)
      • odblokowuje sekcje krytyczną
      • funkcja kończy swoje działanie i zwraca true
  • każdy wątek uruchamia funkcje sendData ze swoim numerem:
    • jeśli funkcja zwróci false to wątek wypisuje na ekranie “dostęp zabroniony przez sekcje krytyczną”
    • jeśli zwróci true to nic nie wyświetla
Zadanie 2

Program zaprezentuje schemat klasycznego problemu producent-konsument. Należy utworzyć następujący program i przetestować jego działanie:

  • stworzyć 3 wątki wykonywane co 5-10-15 sekund, będą to producenci,
  • stworzyć jeden wątek konsumenta wykonywany co 1 sekundę,
  • stworzyć strukturę danych zawierającą 3 pola (int numerWatku, int numerWywolania, TickType_t czasProdukcji),
  • na podstawie struktury danych utworzyć kolejkę “xQueueCreate” na 10 elementów,
  • każdy wątek producenta dodaje do kolejki strukturę uzupełnioną swoimi danymi “xQueueSend”, jeśli nie ma miejsca to musi poczekać,
  • konsument oczekuje (blokuje się na kolejce-“xQueueReceive”) na nowe dane, jeśli przyjdą nowe dane to wyświetla na ekranie w jednej linii: K1:numerWatku;numerWywolania;roznicaCzasu,iloscPozostala, gdzie “roznicaCzasu” to różnica między aktualnym czasem programu a czasem produkcji dla danej informacji,  “iloscPozostala” to ilość pozostałych wiadomości w kolejce,
  • jak działa ten program, narysować schemat blokowy i dodać do sprawozdania, czy może dojść do zablokowania programu?
Zadanie 3

Zmodyfikować program z zdania 2:

  • ustawić wątki producentów aby uruchamiały się co 5 sekund,
  • ustawić wątek konsumenta aby uruchamiał się co 5 sekund,
  • jak teraz będzie działał program, czy dojdzie do zablokowania producentów? Dlaczego, jak możemy rozwiązać problem?
Zadanie 4

Zmodyfikować program z zadania 3:

  • dodać jeszcze jeden wątek konsumenta uruchamiany co 2 sekundy, wątek ma wyświetlać komunikat rozpoczynający się od K2,
  • jak teraz działa program, który konsument częściej zostanie wywołany i dlaczego?
Zadanie 5

Zmodyfikować program z zadania 4:

  • ustawić priorytety dla wątków producentów na 4, konsument-1 na 1 i konsument-2 na 2,
  • jak teraz działa program, który konsument częściej zostanie wywołany i dlaczego? Czy są zmiany w porównaniu do programu 4?