Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial Internet of Things >> Eingebettet

Semaphoren:Versorgungsdienste und Datenstrukturen


RTOS Revealed-Serie anzeigen

Dieser Artikel setzt den Blick auf Semaphoren fort.

Semaphore Utility Services

Nucleus RTOS hat vier API-Aufrufe, die mit Semaphoren verbundene Hilfsfunktionen bereitstellen:Semaphor zurücksetzen, Informationen über einen Semaphor zurückgeben, Anzahl der Semaphoren in der Anwendung zurückgeben und Zeiger auf alle Semaphoren in der Anwendung zurückgeben. Die ersten drei davon sind in Nucleus SE implementiert.

Zurücksetzen eines Semaphors

Dieser API-Aufruf stellt den Semaphor in seinen ursprünglichen, nicht verwendeten Zustand zurück. Diese API-Funktion ist im Vergleich zu der für andere Kernel-Objekte verfügbaren ungewöhnlich, da sie, obwohl sie ein Reset ist, ihren Zähler nicht einfach auf den Startwert initialisiert; ein neuer Anfangszähler wird in dem Anruf bereitgestellt. Alle Aufgaben, die auf dem Semaphor angehalten wurden, werden wieder aufgenommen und erhalten einen Rückkehrcode von NUSE_SEMAPHORE_WAS_RESET (in Nucleus SE oder NU_SEMAPHORE_RESET mit Nucleus RTOS).

Nucleus RTOS API-Aufruf zum Zurücksetzen eines Semaphors

Prototyp für Serviceruf:

STATUS NU_Reset_Semaphore(NU_SEMAPHORE  *Semaphore,
UNSIGNED initial_count);

Parameter:

Semaphor – Zeiger auf den vom Benutzer bereitgestellten Semaphor-Kontrollblock

initial_count – der Wert, auf den der Zähler des Semaphors gesetzt werden soll

Rückgabe:

NU_SUCCESS – der Anruf wurde erfolgreich abgeschlossen

NU_INVALID_SEMAPHORE – der Semaphor-Zeiger ist nicht gültig

Nucleus SE API-Aufruf zum Zurücksetzen eines Semaphors

Dieser API-Aufruf unterstützt die Schlüsselfunktionalität der Nucleus RTOS API.

Prototyp für Serviceruf:

STATUS NUSE_Semaphore_Reset(NUSE_SEMAPHORE Semaphor,
U8 initial_count);

Parameter:

Semaphor – der Index (ID) des zurückzusetzenden Semaphors

initial_count – der Wert, auf den der Zähler des Semaphors gesetzt werden soll

Rückgabe:

NUSE_SUCCESS – der Anruf wurde erfolgreich abgeschlossen

NUSE_INVALID_SEMAPHORE – der Semaphor-Index ist nicht gültig

Nucleus SE-Implementierung von Semaphore Reset

Die Hauptaufgabe des NUSE_Semaphore_Reset() API-Funktion – nach Parameterüberprüfung – einfach den entsprechenden Eintrag in NUSE_Semaphore_Counter[] set setzen auf den angegebenen Anfangswert.

Wenn die Blockierung aktiviert ist, ist weiterer Code erforderlich, um die Blockierung von Aufgaben aufzuheben:

while (NUSE_Semaphore_Blocking_Count[Semaphore] !=0){ U8 index; /* prüfen ob Tasks blockiert sind */ /* auf diesem Semaphor */ for (index=0; index 

Jede auf dem Semaphor angehaltene Aufgabe wird mit dem Unterbrechungs-Rückkehrcode NUSE_SEMAPHORE_WAS_RESET als „bereit“ markiert . Wenn dieser Vorgang abgeschlossen ist und der Prioritätsplaner verwendet wird, wird NUSE_Reschedule() aufgerufen , da möglicherweise eine oder mehrere Aufgaben mit höherer Priorität vorbereitet wurden und ausgeführt werden müssen.

Semaphor-Informationen

Dieser Serviceaufruf ruft eine Auswahl von Informationen zu einem Semaphor ab. Die Nucleus SE-Implementierung unterscheidet sich von Nucleus RTOS dadurch, dass sie weniger Informationen zurückgibt, da Objektbenennung und Suspend-Reihenfolge nicht unterstützt werden und Task Suspend möglicherweise nicht aktiviert ist.

Nucleus RTOS API-Aufruf für Semaphor-Informationen

Prototyp für Serviceruf:

STATUS NU_Semaphore_Information(NU_SEMAPHORE *Semaphore,
CHAR *name, UNSIGNED *current_count, OPTION *suspend_type,
UNSIGNED *tasks_waiting, NU_TASK **first_task);

Parameter:

Semaphor – Zeiger oben auf den Kontrollblock des Semaphors, über den Informationen angefordert werden

Name – Zeiger auf einen 8-stelligen Zielbereich für den Namen des Semaphors; dies beinhaltet Platz für den Null-Terminator

aktueller_count – ein Zeiger auf eine Variable, die den aktuellen Wert des Semaphorzählers erhält

suspend_type – Zeiger auf eine Variable, die den Suspend-Typ der Aufgabe enthält; gültige Aufgaben-Aussetzungstypen sind NU_FIFO und NU_PRIORITY

tasks_waiting – ein Zeiger auf eine Variable, die die Anzahl der an diesem Semaphor ausgesetzten Tasks empfängt

first_task – ein Zeiger auf eine Variable vom Typ NU_TASK die einen Zeiger auf den Kontrollblock der ersten ausgesetzten Task erhält

Rückgabe:

NU_SUCCESS – der Anruf wurde erfolgreich abgeschlossen

NU_INVALID_SEMAPHORE – der Semaphor-Zeiger ist nicht gültig

Nucleus SE API-Aufruf für Semaphor-Informationen

Dieser API-Aufruf unterstützt die Schlüsselfunktionalität der Nucleus RTOS API.

Prototyp für Serviceruf:

STATUS NUSE_Semaphore_Information(NUSE_SEMAPHORE Semaphor,
U8 *current_count, U8 *tasks_waiting, NUSE_TASK *first_task);

Parameter:

Semaphor – der Index des Semaphors, über den Informationen angefordert werden

aktueller_count – ein Zeiger auf eine Variable, die den aktuellen Wert des Semaphorzählers erhält

tasks_waiting – ein Zeiger auf eine Variable, die die Anzahl der an diesem Semaphor ausgesetzten Tasks empfängt (keine Rückgabe, wenn Tasksuspendierung deaktiviert ist)

first_task – ein Zeiger auf eine Variable vom Typ NUSE_TASK die den Index der ersten ausgesetzten Aufgabe erhält (keine Rückgabe, wenn die Aufgabenaussetzung deaktiviert ist)

Rückgabe:

NUSE_SUCCESS – der Anruf wurde erfolgreich abgeschlossen

NUSE_INVALID_SEMAPHORE – der Semaphor-Index ist nicht gültig

NUSE_INVALID_POINTER – einer oder mehrere der Zeigerparameter sind ungültig

Nucleus SE-Implementierung von Semaphor-Informationen

Die Implementierung dieses API-Aufrufs ist recht einfach:

NUSE_CS_Enter(); *current_count =NUSE_Semaphore_Counter[Semaphore];#if NUSE_BLOCKING_ENABLE *tasks_waiting =NUSE_Semaphore_Blocking_Count[Semaphore]; if (NUSE_Semaphore_Blocking_Count[Semaphore] !=0) { U8-Index; for (index=0; index

Die Funktion gibt den Semaphorstatus zurück. Wenn das Blockieren von API-Aufrufen aktiviert ist, werden dann die Anzahl der wartenden Tasks und der Index des ersten Tasks zurückgegeben (sonst werden diese beiden Parameter auf 0 gesetzt).

Ermitteln der Anzahl der Semaphoren

Dieser Serviceaufruf gibt die Anzahl der in der Anwendung konfigurierten Semaphoren zurück. Während sich dies in Nucleus RTOS im Laufe der Zeit ändert und der zurückgegebene Wert die aktuelle Anzahl von Semaphoren darstellt, wird der zurückgegebene Wert in Nucleus SE zur Build-Zeit festgelegt und kann sich nicht ändern.

Nucleus RTOS API-Aufruf zur Semaphorenzählung

Prototyp für Serviceruf:

UNSIGNED NU_Established_Semaphores(VOID);

Parameter:

Keine

Rückgabe:

Die Anzahl der erstellten Semaphoren in der Anwendung

Nucleus SE API-Aufruf zur Semaphorenzählung

Dieser API-Aufruf unterstützt die Schlüsselfunktionalität der Nucleus RTOS API.

Prototyp für Serviceruf:

U8 NUSE_Semaphore_Count(void);

Parameter:

Keine

Rückgabe:

Die Anzahl der konfigurierten Semaphoren in der Anwendung

Nucleus SE-Implementierung von Semaphore Count

Die Implementierung dieses API-Aufrufs ist fast trivial einfach:Der Wert des #define Symbol NUSE_SEMAPHORE_NUMBER wird zurückgegeben.

Weiter mit Seite zwei:"Datenstrukturen">>


Eingebettet

  1. Die Vor- und Nachteile von Cloud- und Inhouse-Diensten
  2. Microsoft Azure' Blockchain Token und Datenverwaltungsdienste
  3. Begriffe und Konzepte des digitalen Speichers
  4. C#-Variablen und (primitive) Datentypen
  5. Strukturen und Klassen in C++
  6. Postfächer:Einführung und grundlegende Dienste
  7. Semaphoren:Einführung und grundlegende Dienste
  8. Ereigniskennzeichengruppen:Versorgungsdienste und Datenstrukturen
  9. Ereignisflaggengruppen:Einführung und grundlegende Dienste
  10. Warteschlangen:Einführung und grundlegende Dienste