Ereignisflaggengruppen:Einführung und grundlegende Dienste
RTOS Revealed-Serie anzeigen
Ereigniskennzeichengruppen wurden in einem früheren Artikel eingeführt. In Nucleus SE sind sie den Signalen etwas ähnlich, jedoch mit größerer Flexibilität. Sie bieten eine kostengünstige, aber flexible Möglichkeit, einfache Nachrichten zwischen Aufgaben zu übertragen.
Verwendung von Ereignis-Flags
In Nucleus SE werden Ereignis-Flags zur Build-Zeit konfiguriert. Es können maximal 16 Ereignis-Flag-Gruppen für eine Anwendung konfiguriert werden. Wenn keine Ereignis-Flag-Gruppen konfiguriert sind, sind keine Datenstrukturen oder Service-Call-Codes, die zu Ereignis-Flag-Gruppen gehören, in der Anwendung enthalten.
Eine Ereignis-Flag-Gruppe ist einfach ein Satz von acht 1-Bit-Flags, deren Zugriff so gesteuert wird, dass er von mehreren Tasks sicher verwendet werden kann. Eine Aufgabe kann eine beliebige Kombination von Ereignis-Flags setzen oder löschen. Eine andere Task kann jederzeit die Ereignis-Flag-Gruppe lesen oder auf ein bestimmtes Muster von Flags warten (abfragen oder anhalten).
Konfigurieren von Ereigniskennzeichengruppen
Anzahl der Ereigniskennzeichengruppen
Wie bei den meisten Aspekten von Nucleus SE wird die Konfiguration von Ereignis-Flag-Gruppen hauptsächlich durch #define . gesteuert Anweisungen in nuse_config.h . Die Schlüsseleinstellung ist NUSE_EVENT_GROUP_NUMBER , die bestimmt, wie viele Ereignis-Flag-Gruppen für die Anwendung konfiguriert sind. Die Standardeinstellung ist 0 (dh es werden keine Ereignis-Flag-Gruppen verwendet) und Sie können sie auf einen beliebigen Wert bis 16 setzen. Ein falscher Wert führt zu einem Kompilierzeitfehler, der durch einen Test in nuse_config_check generiert wird. h (dies ist in nuse_config.c enthalten und daher mit diesem Modul kompiliert), was zu einem #error führt Anweisung wird zusammengestellt.
Die Wahl eines Werts ungleich Null ist die „Masterfreigabe“ für Ereignis-Flag-Gruppen. Dies führt dazu, dass einige Datenstrukturen entsprechend definiert und dimensioniert werden, von denen später in dieser Serie mehr. Es aktiviert auch die API-Aktivierungseinstellungen.
API aktiviert
Jede API-Funktion (Dienstaufruf) in Nucleus SE hat eine aktivierende #define Symbol in nuse_config.h . Für Ereigniskennzeichengruppen sind dies:
NUSE_EVENT_GROUP_SET NUSE_EVENT_GROUP_RETRIEVE NUSE_EVENT_GROUP_INFORMATION NUSE_EVENT_GROUP_COUNT
Standardmäßig sind diese alle auf FALSCH eingestellt , wodurch jeder Dienstaufruf deaktiviert und die Aufnahme jeglichen Implementierungscodes verhindert wird. Um Ereignis-Flag-Gruppen für eine Anwendung zu konfigurieren, müssen Sie die API-Aufrufe auswählen, die Sie verwenden möchten, und ihre Aktivierungssymbole auf TRUE setzen .
Hier ist ein Auszug aus der standardmäßigen nuse_config.h Datei.
#define NUSE_EVENT_GROUP_NUMBER 0 /* Anzahl der Ereignisgruppen im System - 0-16 */ #define NUSE_EVENT_GROUP_SET FALSE /* Service Call Enabler */ #define NUSE_EVENT_GROUP_RETRIEVE FALSE /* Service Call Enabler */ #define NUSE_EVENT_GROUP_INFORMATION FALSE /* Service Call Enabler */ #define NUSE_EVENT_GROUP_COUNT FALSE /* Service Call Enabler */
Ein Kompilierzeitfehler tritt auf, wenn eine API-Funktion für Ereigniskennzeichengruppen aktiviert ist und keine Ereigniskennzeichengruppen konfiguriert sind (außer für NUSE_Event_Group_Count() was immer erlaubt ist). Wenn Ihr Code einen API-Aufruf verwendet, der nicht aktiviert wurde, kommt es zu einem Linkzeitfehler, da kein Implementierungscode in die Anwendung eingefügt wurde.
Event Flag Service Calls
Nucleus RTOS unterstützt sieben Serviceaufrufe, die sich auf Ereignis-Flags beziehen und die folgende Funktionalität bieten:
Event-Flags setzen. Implementiert von NUSE_Event_Group_Set() in Nucleus SE.
Ereignis-Flags abrufen. Implementiert von NUSE_Event_Group_Retrieve() in Nucleus SE.
Geben Sie Informationen zu einer angegebenen Ereignis-Flag-Gruppe an. Implementiert von NUSE_Event_Group_Information() in Nucleus SE.
Gibt einen Zähler zurück, wie viele Ereignis-Flag-Gruppen (derzeit) für die Anwendung konfiguriert sind. Implementiert von NUSE_Event_Group_Count() in Nucleus SE.
Fügen Sie der Anwendung eine neue Ereigniskennzeichengruppe hinzu (erstellen). Nicht in Nucleus SE implementiert.
Entfernen Sie eine Ereigniskennzeichengruppe aus der Anwendung (löschen). Nicht in Nucleus SE implementiert.
Geben Sie Zeiger auf alle Event-Flag-Gruppen (derzeit) in der Anwendung zurück. Nicht in Nucleus SE implementiert.
Die Implementierung jedes dieser Service Calls wird im Detail untersucht.
Es sei darauf hingewiesen, dass keine Rücksetzfunktion bereitgestellt wird (weder in Nucleus RTOS noch in Nucleus SE). Dies ist beabsichtigt. Ein Reset impliziert, dass eine spezielle Bedingung vorherrscht. Für eine Event-Flag-Gruppe wäre die einzige „besondere“ Bedingung nur Nullen, die mit NUSE_Event_Group_Set() eingerichtet werden können .
Ereigniskennzeichengruppe festlegen und Dienste abrufen
Die grundlegenden Operationen, die an einer Ereignis-Flag-Gruppe ausgeführt werden können, sind das Setzen eines oder mehrerer Flags und das Abrufen der aktuellen Zustände der Flags. Nucleus RTOS und Nucleus SE bieten jeweils zwei grundlegende API-Aufrufe für diese Operationen, die hier besprochen werden.
Da Ereignisflags Bits sind, werden sie am besten als Binärzahlen visualisiert. Da Standard-C keine Darstellung von binären Konstanten (nur oktal und hexadezimal) unterstützt, enthält die Nucleus SE-Distribution eine nützliche Header-Datei – nuse_binary.h – das enthält #define Symbole der Form b01010101 für alle 256 8-Bit-Werte.
Ereigniskennzeichen festlegen
Der Nucleus RTOS API-Aufruf zum Setzen von Ereignis-Flags ist sehr flexibel, sodass Sie Ereignis-Flags mit UND set setzen und löschen können und ODER Operationen. Nucleus SE bietet den gleichen Service, außer dass das Aussetzen von Aufgaben optional ist.
Nucleus RTOS API-Aufruf zum Setzen von Flags
Prototyp für Serviceruf:
STATUS NU_Set_Events(NU_EVENT_GROUP *group, UNSIGNED event_flags,
OPTION-Vorgang);
Parameter:
Gruppe – Zeiger auf den vom Benutzer bereitgestellten Ereignis-Flag-Gruppensteuerblock
event_flags – der Bitwert des zu bearbeitenden Merkermusters
Betrieb – die durchzuführende Operation; kann NU_OR sein (um Flags zu setzen) oder NU_AND (um Flags zu löschen)
Rückgabe:
NU_SUCCESS – der Anruf wurde erfolgreich abgeschlossen
NU_INVALID_GROUP – Der Gruppenzeiger des Ereignis-Flags ist ungültig
NU_INVALID_OPERATION – die angegebene Operation war nicht NU_OR oder NU_AND
Nucleus SE API-Aufruf zum Setzen von Flags
Dieser API-Aufruf unterstützt die Schlüsselfunktionalität der Nucleus RTOS API.
Prototyp für Serviceruf:
STATUS NUSE_Event_Group_Set(NUSE_EVENT_GROUP Gruppe,
U8 event_flags, OPTION-Operation);
Parameter:
Gruppe – der Index (ID) der Ereignisgruppe, in der Flags gesetzt/gelöscht werden sollen
event_flags – der Bitwert des zu bearbeitenden Merkermusters
Betrieb – die durchzuführende Operation; kann NUSE_OR sein (um Flags zu setzen) oder NUSE_AND (um Flags zu löschen)
Rückgabe:
NUSE_SUCCESS – der Anruf wurde erfolgreich abgeschlossen
NUSE_INVALID_GROUP – der Gruppenindex des Ereignis-Flags ist ungültig
NUSE_INVALID_OPERATION – die angegebene Operation war nicht NUSE_OR oder NUSE_AND
Nucleus SE-Implementierung von Set-Ereignis-Flags
Der Anfangscode von NUSE_ Event_Group_Set() API-Funktion – nach Parameterüberprüfung – ist üblich, unabhängig davon, ob die Unterstützung für das Blockieren (Task-Suspendieren) von API-Aufrufen aktiviert ist oder nicht. Die Logik ist ganz einfach:
NUSE_CS_Enter();if (Operation ==NUSE_OR){ NUSE_Event_Group_Data[group] |=event_flags;}else /* NUSE_AND */{ NUSE_Event_Group_Data[group] &=event_flags;}
Das Bitmuster, event_flags , wird einfach ODER- oder UND-verknüpft in die angegebene Ereignis-Flag-Gruppe.
Der verbleibende Code ist nur enthalten, wenn die Aufgabenblockierung aktiviert ist:
#if NUSE_BLOCKING_ENABLE while (NUSE_Event_Group_Blocking_Count[group] !=0) { U8-Index; /* prüfen, ob Aufgaben blockiert sind */ /* in dieser Ereignisgruppe */ für (index=0; index{ if ((LONIB(NUSE_Task_Status[index]) == NUSE_EVENT_SUSPEND) &&(HINIB(NUSE_Task_Status[index]) ==Gruppe)) { NUSE_Task_Blocking_Return[index] =NUSE_SUCCESS; NUSE_Task_Status[index] =NUSE_READY; Pause; } } NUSE_Event_Group_Blocking_Count[group]--; } #if NUSE_SCHEDULER_TYPE ==NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK); #endif #endif NUSE_CS_Exit(); NUSE_SUCCESS zurückgeben;
Wenn Aufgaben in dieser Ereigniskennzeichengruppe angehalten werden (von dieser abgerufen werden), werden sie alle wieder aufgenommen. Wenn sie die Möglichkeit zur Ausführung haben, was vom Scheduler abhängt, können sie feststellen, ob ihre Rückgabebedingungen erfüllt sind – siehe Abrufen von Ereignis-Flags unten.
Weiter mit Seite zwei>>
Eingebettet
- Eine Einführung in Nockenschlösser und wie sie funktionieren
- Eine Einführung in Augenschrauben und ihre Funktionsweise
- Eine Einführung in Ösen und ihre Funktionsweise
- Eine Einführung in Edelstahl und seine Herstellung
- C# Grundlegende Ein- und Ausgabe
- Postfächer:Einführung und grundlegende Dienste
- Semaphoren:Versorgungsdienste und Datenstrukturen
- Semaphoren:Einführung und grundlegende Dienste
- Ereigniskennzeichengruppen:Versorgungsdienste und Datenstrukturen
- Warteschlangen:Einführung und grundlegende Dienste