Zadania wykonywane w czasie laboratorium należy dokumentować w postaci zdjęć przedstawiających postępy prac.

 

Zadanie 1 – 3

  • skonfigurować projekt na zestawie sprzętowym zawierający system FreeRTOS,
  • utworzyć 3 wątki,
  • zbudować funkcję do wysyłania po porcie UART danych bezpieczną wątkową, przez zastosowanie sekcji krytycznej (semafor),
  • sprawdzić działanie takiej funkcji przy jednoczesnym wykorzystaniu przez 3 wątki, do czego służy sekcja krytyczna?
  • W kolejnych zadaniach należy zawsze wykorzystywać sekcje krytyczną jeśli więcej niż jeden wątek musi mieć jednoczesny dostęp do jakiegoś zasobu sprzętowego.

Zadanie 2 – 3,5

Kolejki: link

Zadanie 2.5a

  • utworzyć kolejkę 10 dwuelementową, przechowującą strukturę (uint8_t numerWatku, int krokWatku),
  • utworzyć 3 wątki będące producentami, dodają elementy do kolejki, gdzie każdy ma swój unikatowy numer, i wykonuje dodaje wątku przy jednoczesnej inkrementacji licznika (krokWatku). Wątki dodają do kolejki, co 3 sekundy,
  • jeśli kolejka jest pełna to wątki są blokowane,
  • dodać wątek konsumenta, pobiera informacje z kolejki i wyświetla komunikat o pobranych danych na terminalu. Wątek działa, co w 2 sekundy, i pobiera tylko jedną dostępną pozycje kolejki,
  • czy dojdzie do zablokowania kolejki? Kiedy?

Zadanie 2.5b

  • zmienić czas wykonywania wątku konsumenta, tak aby pobierał natychmiast informacje z kolejki,
  • czy dojdzie do zapełnienia kolejki?
  • czy odbierane komunikaty są zawsze w takiej samej kolejności?

Zadanie 3 – 4

Dodać obsługę komunikacji po interfejsie I2C, podłączyć moduł IMU – MPU6050 (dokumentacja techniczna, mapa rejestrów)

Przykładowa obsługa czujnika MPU6050: link

Do obsługi modułu podłączone po interfejsie I2C potrzebujemy znać jego adres (dokumentacja techniczna – 9.2). Moduł posiada AD0 podpięte do GND.

 

  • utworzyć wątek do obsługi czujnika, odczytać temperaturę i wyświetlić ja na terminalu w stopniach Celsjusza. Odczyt dokonywać z częstotliwością 10Hz,

Odczytywanie danych z czujnika wykonuje jeden wątek, często zachodzi potrzeba przekazania takich danych do innych wątków w celu ich dalszego wykorzystania. W tym celu nie należy stosować zmiennych globalnych, ponieważ nie jest to mechanizm gwarantujący spójność danych. Każdy system posiada odpowiednie mechanizmy do dzielenia danych, czy zasobów pomiędzy wątkami. Można wykorzystać sekcję krytyczną, której zadaniem będzie zabezpieczenie dostępu do wrażliwych danych lub bardziej wyspecjalizowane struktury wbudowane w system FreeRTOS jakimi są kolejki jednoelementowe. Zapis do takiej kolejki dokonujemy przy użyciu funkcji “xQueueOverwrite” a odczyt “xQueuePeek”.

  • utworzyć kolejką jednoelementową i publikować do niej informacje o temperaturze,
  • utworzyć drugi wątek, który odczytuje temperaturę z kolejki i wyświetla na terminalu,
  • jak działa taka kolejka jednoelementowa, czy różni się od kolejki wieloelementowej z wcześniejszego zadania?

 

Zadanie 4 – 4,5

  • dodać do wątku obsługi czujnika, odczytywanie i przeliczanie wartości mierzonych z akcelerometru i żyroskopu, dane udostępniać przy użyciu odpowiedniego mechanizmu. Odczyt dokonywać z częstotliwością 10Hz,
  • dodać wątek, który na podstawie danych pomiarowych z akcelerometru wyznaczy położenie kątowe modułu w dwóch osiach (poziomnica), dane przekaże do nowej kolejki,
  • zmodyfikować wątek wyświetlający informacje w terminalu o nowe pomiary,

Zadanie 5 – 5

  • dodać kolejny wątek zajmujący się obliczaniem i dystrybucją wyników:
    • oblicza kąt obrotu modułu na podstawie całkowania danych z żyroskopu dla 3 osi. Porównać nowe kąty z wynikami z poprzedniego zadania,
    • częstotliwość wykonywania wątku musi być bardzo dokładna – zastosować funkcję “vTaskDelayUntil”,
    • polepszyć wyniki wyznaczania orientacji, przez zastosowanie jakiejś metody: uśrednianie, filtr komplementarnego, filtr alfa/beta, filtr Kalmana,
  • wszystkie nowe dane mają być wyświetlane przez wątek obsługujący komunikację z terminalem.