![]() |
NiboRoboLib 3.6 - MThread Library
|
Semaphoren sind die klassische Methode um in Multitasking Systemen auf Resourcen zuzugreifen. Mehr ...
#include "thread.h"
gehe zum Quellcode dieser Datei
Datenstrukturen | |
struct | semaphore_t |
Funktionen | |
void | semaphore_init (semaphore_t *semaphore) |
void | semaphore_delete (semaphore_t *semaphore) |
uint8_t | semaphore_acquire (semaphore_t *semaphore, uint16_t timeout) |
Wenn der Wert der Semaphore größer Null ist wird der Wert um ein verringert und der Aufruf kehr erfolgreich zurück. Mehr ... | |
void | semaphore_signal (semaphore_t *semaphore) |
Der Wert der Semaphore wird um eins erhöht, falls Threads warten werden sie benachrichtigt. | |
uint8_t | semaphore_acquireISR (semaphore_t *semaphore) |
Wenn der Wert der Semaphore größer Null ist wird der Wert um ein verringert und der Aufruf kehr erfolgreich zurück. Mehr ... | |
void | semaphore_signalISR (semaphore_t *semaphore) |
Der Wert der Semaphore wird um eins erhöht, falls Threads warten werden sie benachrichtigt. | |
Semaphoren sind die klassische Methode um in Multitasking Systemen auf Resourcen zuzugreifen.
Jeder signal() Aufruf erzeugt dabei eine virtuelle Resource, jeder acquire() Aufruf verbraucht eine Resource. Sollten gerade keine Resourcen mehr vorhanden sein wartet der acquire() Aufruf solange, bis wieder eine Verfügbar ist. Beispiel: Ein Büro mit 20 Computern und 5 Druckern. Jeder Druckauftrag von einem Computer ist ein signal() Aufruf. Die Drucker warten jeweils mit einem acquire() Aufruf auf einen Auftrag. Kommt ein neuer Druckauftrag dann wird ein acquire() Aufruf erfolgreich zurückkehren. Ist ein Drucker fertig ruft er wieder acquire auf um einen weiteren Auftrag zu bekommen.
uint8_t semaphore_acquire | ( | semaphore_t * | semaphore, |
uint16_t | timeout | ||
) |
Wenn der Wert der Semaphore größer Null ist wird der Wert um ein verringert und der Aufruf kehr erfolgreich zurück.
Falls der Wert der Semaphore Null ist wird solange gewartet bis er sich erhöht hat. Sollte die Semaphore innerhalb der gegebenen Zeit nicht aquiriert werden können liefert die Routine eine Null zurück.
timeout,: | Wert in Ticks / TO_POLL (nicht warten) / TO_INF (ewig warten) |
uint8_t semaphore_acquireISR | ( | semaphore_t * | semaphore | ) |
Wenn der Wert der Semaphore größer Null ist wird der Wert um ein verringert und der Aufruf kehr erfolgreich zurück.
Ansonsten liefert er Null zurück.