# 6. Aufgabe 2 - Erstellung von Tasks
## 6.1. Wissen
### 6.1.1. Tasks
Ein Task ist für gewöhnlich eine Endlosschleife einer Funktion, die von dem Scheduler
der CPU zugeteilt wird. Es können mehrere Tasks gleichzeitig laufen, die dann entsprechend ihrer Priorität CPU-Zeit zugeteilt bekommen. In µC/OS-II wird ein Task mit der
Methode
```
INT8U OSTaskCreate (void (∗task)(void ∗pd), void ∗pdata, OS_STK ∗ptos, INT8U prio)
```
erstellt. Der Task benötigt eine Priorität, die gleichzeitig auch seine Identifikation darstellt. Kleinere Zahlen bedeuten eine höhere Priorität. Mit dem Funktionsaufruf von
```
UCOSStartup (CPU_FNCT_PTR initial_func)
```
wird unter anderem der Scheduler und somit das Multitasking gestartet. Ein Task be-
nötigt seinen eigenen Stack mit der entsprechenden Stack-Größe. Dieser sollte statisch
alloziert werden.
Empfohlene Literatur:
- µC/OS-II Micrium Documentation[[mic](references.md), µC/OS-II Quick Reference]
- Micrium: Inter Process Communication via Message Queues [[wik](references.md), Message Queues QuickStart Guide, S. 9]
- Technical Reference Manual : Zynq-7000 ZC-706 im Repository Ordner
## 6.2. Aufgabenstellung
### 6.2.1. Teil1
Das in der ersten Aufgabe programmierte Programm soll nun als Task ausgeführt werden. Zusätzlich sollen in einem weiteren Task Fibonaccizahlen berechnet und ausgegeben
werden.
- Das Programm weist zahlreiche Fehler auf, die es zu debuggen gilt

Abbildung 6.1.: Menü zum Inspizieren von Betriebssystemfunktionen

Abbildung 6.2.: Fenster zum Inspizieren der Stackausnutzung
- Eine sinnvolle Hilfe stellt die UCOS-2 Dokumentation zu dem Thema Task Management dar (siehe oben: ”Empfohlene Literatur”)
- Tipp: Die UART Schnittstelle ist fehlerhaft konfiguriert, die gewünschte Frequenz sollte auf 50000000 eingestellt sein, die erste der beiden UART Instanzen ausgewählt
sein. (siehe TRM Zynq 7000)
Dokumentieren Sie die gefundenen Fehler.
Die Lauterbach Umgebung bietet mehrere Möglichkeiten das Multitasking in UCOS
zu überwachen (siehe Abbildung 6.1):
- Überwachung der Tasks und ihrer Prioritäten (Beispiel siehe Abbildung 6.2)
- Überwachung von Stackgrößen, auch die der Tasks (Beispiel siehe Abbildung 6.3.: Diese Überwachung basiert auf der Überprüfung auf Nullen im Stack.)

Abbildung 6.3.: Fenster zum Inspizieren von laufenden Tasks, ihren Prioritäten und IDs
## 6.3. Post-Kolloquium
- Welche Bedeutung hat UCOSStartup()?
(Tipp: Suchen Sie in Eclipse nach der Funktion (Strg+H) und machen Sie sich mit
dem Inhalt vertraut. Ist der Aufruf dieser Funktion für die korrekte Funktion des
Programms notwendig?)
- Wie ist der Task Control Block aufgebaut? (Siehe Quellcode 6.1)
- Was ist eine Message Queue und warum wird sie genutzt?
- Welche Vorteile hat eine Message Queue?
- Über welche Parameter wird die UART Schnittstelle konfiguriert?
- In Aufgabe 1 haben Sie sich eingehend mit der Toolchain beschäftigt. Schauen sie
sich nun einmal die Dateien out/Aufgabe2_ps7_core0.lst und out/Aufgabe2_ps7_core0.map
an. Was steht in diesen Dateien und welche Informationen könnten Sie hier heraus
ziehen?
```
typedef struct os_tcb {
OS_STK *OSTCBStkPtr;
void *OSTCBExtPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
struct os_tcb *OSTCBNext;
struct os_tcb *OSTCBPrev;
OS_FLAGS OSTCBFlagsRdy;
INT8U OSTCBStat;
INT8U OSTCBPrio;
} OS_TCB;
```
Quellcode 6.1: Ausschnitt aus dem Task Control Blocks in µC/OS-II