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

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:

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

  1. Eine Einführung in Nockenschlösser und wie sie funktionieren
  2. Eine Einführung in Augenschrauben und ihre Funktionsweise
  3. Eine Einführung in Ösen und ihre Funktionsweise
  4. Eine Einführung in Edelstahl und seine Herstellung
  5. C# Grundlegende Ein- und Ausgabe
  6. Postfächer:Einführung und grundlegende Dienste
  7. Semaphoren:Versorgungsdienste und Datenstrukturen
  8. Semaphoren:Einführung und grundlegende Dienste
  9. Ereigniskennzeichengruppen:Versorgungsdienste und Datenstrukturen
  10. Warteschlangen:Einführung und grundlegende Dienste