Die ganze Wahrheit über RTOS. Artikel 24. Warteschlangen: Nebendienstleistungen und Datenstrukturen



In diesem Artikel werden wir weiterhin Warteschlangen berücksichtigen.

Sekundäre Warteschlangendienste


Nucleus RTOS verfügt über vier API-Aufrufe, die Zusatzfunktionen für Warteschlangen bereitstellen: Zurücksetzen einer Warteschlange, Empfangen von Warteschlangeninformationen, Abrufen der Anzahl der Warteschlangen in einer Anwendung und Abrufen von Zeigern auf alle Warteschlangen in einer Anwendung. Die ersten drei Funktionen sind in Nucleus SE implementiert.

Frühere Artikel in der Reihe:

Artikel 23. Warteschlangen: Einführung und Grundversorgung
Artikel 22. Postfächer: Nebendienstleistungen und Datenstrukturen
Artikel 21. Postfächer: Einführung und Basisdienste
Artikel Nr. 20. Semaphoren: Nebendienstleistungen und Datenstrukturen
Artikel Nr. 19. Semaphoren: Einführung und Grundversorgung
Artikel Nr. 18. Ereignisflag-Gruppen: Hilfsdienste und Datenstrukturen
Artikel Nr. 17. Ereignisflag-Gruppen: Einführung und Basisdienste
Artikel 16. Signale
Artikel Nr. 15. Speicherpartitionen: Dienste und Datenstrukturen
Artikel # 14. Speicherbereiche: Einführung und Grundversorgung
Artikel Nr. 13. Aufgabendatenstrukturen und nicht unterstützte API-Aufrufe
Artikel 12. Dienstleistungen für die Arbeit mit Aufgaben
Artikel 11. Aufgaben: Konfiguration und Einführung in die API
Artikel 10. Scheduler: Erweiterte Funktionen und Kontexterhaltung
Artikel 9. Scheduler: Implementierung
Artikel 8. Nucleus SE: Internes Design und Bereitstellung
Artikel 7. Nucleus SE: Einführung
Artikel 6. Andere RTOS-Dienste
Artikel 5. Aufgabeninteraktion und Synchronisation
Artikel 4. Aufgaben, Kontextwechsel und Interrupts
Artikel 3. Aufgaben und Planung
Artikel 2. RTOS: Struktur und Echtzeitmodus
Artikel 1. RTOS: Einführung.

Zurücksetzen der Warteschlange


Dieser API-Aufruf setzt die Warteschlange auf ihren ursprünglichen, nicht verwendeten Status zurück. Alle Nachrichten, die in der Warteschlange gespeichert sind, gehen verloren. Alle in der Warteschlange angehaltenen Aufgaben werden mit dem Rückkehrcode NUSE_QUEUE_WAS_RESET fortgesetzt .

Warteschlangen-Reset-Aufruf in Nucleus RTOS
Prototyp eines Serviceabrufs:
STATUS NU_Reset_Queue (NU_QUEUE * Warteschlange);

Parameter:
Warteschlange - Ein Zeiger auf einen vom Benutzer bereitgestellten Warteschlangensteuerblock.

Rückgabewert:
NU_SUCCESS - Der Anruf wurde erfolgreich abgeschlossen.
NU_INVALID_QUEUE - ungültiger Warteschlangenzeiger.

Anruf zum Zurücksetzen der Warteschlange in Nucleus SE
Dieser Dienstprogrammaufruf unterstützt die Kernfunktionalität der Nucleus RTOS-API.

Prototyp eines Serviceabrufs:
STATUS NUSE_Queue_Reset (NUSE_QUEUE-Warteschlange);

Parameter:
Warteschlange - Index (ID) der abgelegten Warteschlange.

Rückgabewert:
NUSE_SUCCESS - Der Anruf wurde erfolgreich abgeschlossen.
NUSE_INVALID_QUEUE - ungültiger Warteschlangenindex.

Implementieren des Zurücksetzens der Warteschlange in Nucleus SE
Der Code der Funktion NUSE_Queue_Reset (nach Überprüfung der Parameter) ist recht einfach. Indizes des Kopfes und Endes der Warteschlange sowie des Nachrichtenzählers in der Warteschlange wird ein Nullwert zugewiesen.

Wenn die Task-Sperre aktiviert ist, ist zusätzlicher Code für die Wiederherstellung angehaltener Tasks verantwortlich:

while (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; /* check whether any tasks are blocked */ /* on this queue */ for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { NUSE_Task_Blocking_Return[index] = NUSE_QUEUE_WAS_RESET; NUSE_Task_Status[index] = NUSE_READY; break; } } NUSE_Queue_Blocking_Count[queue]--; } #if NUSE_SCHEDULER_TYPE == NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK); #endif 

Jeder angehaltenen Aufgabe in der Warteschlange wird der Status "Bereit" mit dem Rückkehrcode NUSE_QUEUE_WAS_RESET zugewiesen . Nach Abschluss dieses Vorgangs wird bei Verwendung des Prioritätsplaners die Funktion NUSE_Reschedule () aufgerufen , da möglicherweise eine oder mehrere Aufgaben mit hoher Priorität zur Ausführung bereit sind.

Abrufen von Warteschlangeninformationen


Dieser Serviceabruf enthält Informationen zur Warteschlange. Die Implementierung dieses Aufrufs in Nucleus SE unterscheidet sich von Nucleus RTOS darin, dass weniger Informationen zurückgegeben werden, da die Objektbenennung, die variable Nachrichtenlänge und die Reihenfolge der Aufgabenpausen nicht unterstützt werden und das Sperren von Aufgaben deaktiviert werden kann.

Aufruf für Warteschlangeninformationen in Nucleus RTOS
Prototyp eines Serviceabrufs:

STATUS NU_Queue_Information (NU_QUEUE * Warteschlange, CHAR * Name, VOID ** Startadresse, UNSIGNED * Warteschlangengröße, UNSIGNED * verfügbar, UNSIGNED * Nachrichten, OPTION * Nachrichtentyp, UNSIGNED * Nachrichtengröße, OPTION * Suspend_Typ, UNSIGNt_t_

Parameter:

Warteschlange - ein Zeiger auf einen vom Benutzer bereitgestellten Warteschlangensteuerblock;
name - Zeiger auf den 8-stelligen Bereich für den Namen der Nachricht in der Warteschlange;
start_address - ein Zeiger auf einen Zeiger, in den die Adresse des Anfangs des Warteschlangendatenbereichs geschrieben wird;
queue_size - ein Zeiger auf eine Variable zum Speichern der Gesamtzahl der UNSIGNED- Elemente in der Warteschlange;
verfügbar - ein Zeiger auf eine Variable zum Speichern der Anzahl verfügbarer UNSIGNED- Elemente in der Warteschlange;
Nachrichten - ein Zeiger auf eine Variable zum Speichern der aktuellen Anzahl von Nachrichten in der Warteschlange;
message_type - Ein Zeiger auf eine Variable zum Speichern des von der Warteschlange unterstützten Nachrichtentyps. Gültige Werte sind NU_FIXED_SIZE und NU_VARIABLE .
message_size - Ein Zeiger auf eine Variable zum Speichern der Anzahl der UNSIGNED- Datenelemente in jeder Nachricht der Warteschlange. Wenn die Warteschlange Nachrichten mit variabler Länge unterstützt, gibt diese Nummer die maximale Nachrichtenlänge an.
suspend_type - Ein Zeiger auf eine Variable zum Speichern der Art der Unterbrechung von Aufgaben. Gültige Werte sind NU_FIFO und NU_PRIORITY .
task_waiting - ein Zeiger auf eine Variable zum Speichern der Anzahl der in dieser Warteschlange angehaltenen Aufgaben;
first_task - Zeiger auf den Aufgabenzeiger, in dem der Zeiger der ersten angehaltenen Aufgabe platziert ist.

Rückgabewert:

NU_SUCCESS - Der Anruf wurde erfolgreich abgeschlossen.
NU_INVALID_QUEUE - ungültiger Warteschlangenzeiger.

Informationen zur Warteschlange in Nucleus SE anfordern
Dieser API-Aufruf unterstützt die Kernfunktionalität der Nucleus RTOS-API.

Prototyp eines Serviceabrufs:

STATUS NUSE_Queue_Information (NUSE_QUEUE-Warteschlange, ADDR * Startadresse, U8 * Warteschlangengröße, U8 * verfügbar, U8 * Nachrichten, U8 * Aufgaben warten, NUSE_TASK * first_task);

Parameter:

Warteschlange - Index der Warteschlange, über die Informationen angefordert werden;
start_address - ein Zeiger auf eine Variable vom Typ ADDR , in der die Adresse des Beginns des Datenbereichs der Warteschlange gespeichert wird;
queue_size - ein Zeiger auf eine Variable vom Typ U8 , in der die Gesamtzahl der Nachrichten gespeichert wird, die in die Warteschlange passen können;
verfügbar - ein Zeiger auf eine Variable vom Typ U8 , in der die Anzahl der freien Plätze in der Warteschlange gespeichert wird;
Nachrichten - ein Zeiger auf eine Variable vom Typ U8 , die die aktuelle Anzahl von Nachrichten in der Warteschlange speichert;
task_waiting - ein Zeiger auf eine Variable, in der die Anzahl der in dieser Warteschlange angehaltenen Tasks gespeichert wird (bei deaktivierter Task-Sperre wird nichts zurückgegeben);
first_task - Ein Zeiger auf eine Variable vom Typ NUSE_TASK, in der der Index der ersten angehaltenen Task gespeichert wird (bei deaktivierter Task-Sperre wird nichts zurückgegeben).

Rückgabewert:

NUSE_SUCCESS - Der Anruf wurde erfolgreich abgeschlossen.
NUSE_INVALID_QUEUE - ungültiger Warteschlangenindex;
NUSE_INVALID_POINTER - Ein oder mehrere Zeigerparameter sind falsch.

Implementieren der Anzeige von Warteschlangeninformationen in Nucleus SE

Die Implementierung dieses API-Aufrufs ist ziemlich einfach:

 *start_address = NUSE_Queue_Data[queue]; *queue_size = NUSE_Queue_Size[queue]; *available = NUSE_Queue_Size[queue] - NUSE_Queue_Items[queue]; *messages = NUSE_Queue_Items[queue]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Queue_Blocking_Count[queue]; if (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { *first_task = index; break; } } } else { *first_task = 0; } #else *tasks_waiting = 0; *first_task = 0; #endif 

Die Funktion gibt den Status der Warteschlange zurück. Wenn dann die Aufgabenverriegelung aktiviert ist, werden die Anzahl der ausstehenden Aufgaben und der Index der ersten zurückgegeben (andernfalls werden beide Parameter auf 0 gesetzt).

Abrufen der Anzahl der Warteschlangen


Dieser Dienstprogrammaufruf gibt die Anzahl der in der Anwendung konfigurierten Warteschlangen zurück. In Nucleus RTOS kann sich ihre Anzahl im Laufe der Zeit ändern, und der Rückgabewert gibt die aktuelle Anzahl von Warteschlangen an. In Nucleus SE wird der Rückgabewert während der Erstellungsphase festgelegt und kann nicht geändert werden.

Aufrufen des Warteschlangenzählers in Nucleus RTOS
Prototyp eines Serviceabrufs:
UNSIGNED NU_Established_Queues (VOID);

Parameter:
Sind abwesend.

Rückgabewert:
Die Anzahl der im System erstellten Warteschlangen.

Aufrufen des Warteschlangenzählers in Nucleus SE
Dieser API-Aufruf unterstützt die Kernfunktionalität der Nucleus RTOS-API.

Prototyp eines Serviceabrufs:
U8 NUSE_Queue_Count (void);

Parameter:
Sind abwesend.

Rückgabewert:
Die Anzahl der in der Anwendung konfigurierten Warteschlangen.

Implementieren des Warteschlangenzählers in Nucleus SE
Die Implementierung dieses API-Aufrufs ist sehr einfach: Der Wert des Symbols #define NUSE_QUEUE_NUMBER wird zurückgegeben .

Datenstrukturen


Warteschlangen verwenden fünf oder sechs Datenstrukturen (entweder im RAM oder im ROM), bei denen es sich um Tabellensätze handelt (wie bei anderen Nucleus SE-Objekten), deren Anzahl und Größe der Anzahl der Warteschlangen in der Anwendung und den ausgewählten Parametern entspricht.

Kerneldaten im RAM


Diese Daten haben folgende Struktur:

NUSE_Queue_Head [] ist ein Array von Zeigern vom Typ U8 , hat einen Eintrag für jede konfigurierte Warteschlange und zeigt auf den Kopf der Nachrichtenwarteschlange. Wird als Adressindex in NUSE_Queue_Data [] verwendet (siehe unten);
NUSE_Queue_Tail [] ist ein Array vom Typ U8 , hat einen Eintrag für jede in der Anwendung konfigurierte Warteschlange und zeigt auf das Ende der Nachrichtenwarteschlange. Wird als Adressindex in NUSE_Queue_Data [] verwendet (siehe unten);
NUSE_Queue_Items [] ist ein Array vom Typ U8 , hat einen Eintrag für jede konfigurierte Warteschlange und ist ein Zähler für Nachrichten in der Warteschlange. Diese Daten können als redundant betrachtet werden, da diese Werte über die Indizes am Anfang und Ende der Warteschlange abgerufen werden können. Das Speichern des Zählers vereinfacht jedoch den Code.
NUSE_Queue_Blocking_Count [] - Dieses Array vom Typ U8 enthält Zähler für die Anzahl der Aufgaben, die in jeder Warteschlange angehalten wurden. Dieses Array wird nur erstellt, wenn die Unterstützung für Task-Sperren aktiviert ist.

Diese Datenstrukturen werden beim Start von Nucleus SE von der Funktion NUSE_Init_Queue () auf Null initialisiert. Dies ist logisch, da alle Warteschlangen leer erstellt (nicht verwendet) werden.

Im Folgenden sind die Definitionen dieser Strukturen in der Datei nuse_init.c aufgeführt :

 RAM U8 NUSE_Queue_Head[NUSE_QUEUE_NUMBER]; RAM U8 NUSE_Queue_Tail[NUSE_QUEUE_NUMBER]; RAM U8 NUSE_Queue_Items[NUSE_QUEUE_NUMBER]; #if NUSE_BLOCKING_ENABLE RAM U8 NUSE_Queue_Blocking_Count[NUSE_QUEUE_NUMBER]; #endif 

RAM-Benutzerdaten


Der Benutzer ist dafür verantwortlich, einen RAM-Bereich zum Speichern jeder Warteschlange bereitzustellen. Die Größe dieses Bereichs sollte ein Array vom Typ ADDR enthalten , in dem jeder Datensatz einer Nachricht in der Warteschlange entspricht

ROM-Daten


Diese Daten haben folgende Struktur:

NUSE_Queue_Data [] - Ein Array vom Typ ADDR hat einen Eintrag für jede konfigurierte Warteschlange und zeigt auf den Datenbereich der Warteschlange (siehe Benutzer-RAM-Daten).
NUSE_Queue_Size [] - Ein Array vom Typ U8 hat einen Eintrag für jede konfigurierte Warteschlange und zeigt die maximale Anzahl von Nachrichten an, die jede Warteschlange empfangen kann.

Diese Datenstrukturen werden in der Datei nuse_config.c deklariert und (statisch) initialisiert:

 ROM ADDR *NUSE_Queue_Data[NUSE_QUEUE_NUMBER] = { /* addresses of queue data areas ------ */ }; ROM U8 NUSE_Queue_Size[NUSE_QUEUE_NUMBER] = { /* queue sizes ------ */ }; 

Die Speichermenge für Warteschlangen


Wie bei allen Nucleus SE-Kernelobjekten ist die für Warteschlangen benötigte Speichermenge leicht vorhersehbar.

Die Datenmenge im ROM (in Byte) für alle Warteschlangen in der Anwendung kann wie folgt berechnet werden:
NUSE_QUEUE_NUMBER * (Größe von (ADDR) + 1)

Die Menge der Kerneldaten im RAM (in Byte) für alle Warteschlangen in der Anwendung mit aktivierter Task-Sperre wird wie folgt berechnet:
NUSE_QUEUE_NUMBER * 3

Wenn die Sperre deaktiviert ist:
NUSE_QUEUE_NUMBER * 4

Die Menge der Benutzerdaten im RAM (in Byte) für die Warteschlange mit dem Warteschlangenindex :
NUSE_Queue_Size [Warteschlange] * sizeof (ADDR)

Nicht realisierte API-Aufrufe


Vier API-Aufrufe, die in Nucleus RTOS enthalten sind, sind in Nucleus SE nicht implementiert:

Warteschlangenerstellung


Dieser API-Aufruf erstellt eine Warteschlange. In Nucleus SE ist dies nicht erforderlich, da Warteschlangen statisch erstellt werden.

Prototyp eines Serviceabrufs:
STATUS NU_Create_Queue (NU_QUEUE * Warteschlange, Zeichen * Name, VOID * Startadresse, UNSIGNED Warteschlangengröße, OPTION Nachrichtentyp, UNSIGNIERT Nachrichtengröße, OPTION Suspend_Typ);

Parameter:

Warteschlange - Ein Zeiger auf eine vom Benutzer bereitgestellte Steuereinheit, mit der Warteschlangen in anderen API-Aufrufen verwaltet werden.
name - ein Zeiger auf einen 7-stelligen Warteschlangennamen mit einem Null-Abschlussbyte;
start_address - Adresse des Beginns der Warteschlange;
Nachrichtentyp - Nachrichtentyp, der von der Warteschlange unterstützt wird. Es kann die Werte NU_FIXED_SIZE oder NU_VARIABLE_SIZE annehmen .
message_size - Wenn die Warteschlange Nachrichten mit fester Länge unterstützt, legt dieser Parameter die genaue Länge jeder Nachricht fest. Wenn die Warteschlange Nachrichten mit variabler Länge unterstützt, ist dieser Wert die maximale Nachrichtenlänge.
suspend_type - Bestimmt den Typ der Suspend-Aufgaben in der Warteschlange. Es kann die Werte NU_FIFO und NU_PRIORITY annehmen , die das FIFO-Prinzip (First-In-First-Out) bzw. das Prinzip der Priorität der Aussetzung von Aufgaben bedeuten.

Rückgabewert:

NU_SUCCESS - Der Anruf wurde erfolgreich abgeschlossen.
NU_INVALID_QUEUE - Nullzeiger auf den Warteschlangensteuerblock ( NULL ) oder der Zeiger wird bereits verwendet;
NU_INVALID_MEMORY - ungültiger Speicherbereich in start_address angegeben ;
NU_INVALID_MESSAGE - ungültiger Parameter message_type ;
NU_INVALID_SIZE - Die Warteschlange unterstützt keine Nachrichten dieser Länge, oder die Warteschlangengröße und / oder Nachrichtenlänge beträgt 0.
NU_INVALID_SUSPEND - ungültiger suspend_type- Parameter.

Warteschlange löschen


Dieser API-Aufruf löscht die zuvor erstellte Warteschlange. Nucleus SE benötigt dies nicht, da Warteschlangen statisch erstellt werden und nicht gelöscht werden können.

Prototyp eines Serviceabrufs:
STATUS NU_Delete_Queue (NU_QUEUE * Warteschlange);

Parameter:
Warteschlange - Ein Zeiger auf einen Warteschlangensteuerblock.

Rückgabewert:
NU_SUCCESS - Der Anruf wurde erfolgreich abgeschlossen.
NU_INVALID_QUEUE - ungültiger Warteschlangenzeiger.

Warteschlangenzeiger


Dieser API-Aufruf erstellt eine sequentielle Liste von Zeigern auf alle Warteschlangen im System. Nucleus SE benötigt dies nicht, da Warteschlangen anhand eines einfachen Index und nicht anhand eines Zeigers identifiziert werden.

Prototyp eines Serviceabrufs:
UNSIGNED NU_Queue_Pointers (NU_QUEUE ** Zeigerliste, UNSIGNED Maximum_Pointers);

Parameter:
pointer_list - Zeiger auf ein Array von Zeigern NU_QUEUE . Dieses Array wird mit Zeigern auf im System erstellte Warteschlangen gefüllt.
Maximum_Pointers - Die maximale Anzahl von Zeigern im Array.

Rückgabewert:
Die Anzahl der NU_QUEUE- Zeiger im Array.

Warteschlangen (Broadcast to Queue)


Dieser API-Aufruf leitet die Nachricht an alle in der Warteschlange angehaltenen Aufgaben weiter, die auf Nachrichten aus der angegebenen Warteschlange warten. Diese Funktion ist in Nucleus SE nicht implementiert, da dadurch Redundanz hinzugefügt wird.

Prototyp eines Serviceabrufs:
STATUS NU_Broadcast_To_Queue (NU_QUEUE * Warteschlange, VOID * Nachricht, UNSIGNED Größe, UNSIGNED Suspend);

Parameter:

Warteschlange - ein Zeiger auf einen Warteschlangensteuerblock;
Nachricht - Zeiger auf die übertragene Nachricht;
Größe - Die Anzahl der nicht signierten Elemente in der Nachricht. Wenn die Warteschlange Nachrichten mit variabler Länge unterstützt, muss dieser Parameter gleich oder kleiner als die von der Warteschlange unterstützte Nachrichtenlänge sein. Wenn die Warteschlange Nachrichten fester Länge unterstützt, muss dieser Parameter der Länge der von der Warteschlange unterstützten Nachricht entsprechen.
suspen - Gibt an, ob die aufrufende Aufgabe angehalten werden soll , wenn die Warteschlange bereits voll ist. Dies kann NU_NO_SUSPEND , NU_SUSPEND oder ein Timeout-Wert sein.

Rückgabewert:

NU_SUCCESS - Der Anruf wurde erfolgreich abgeschlossen.
NU_INVALID_QUEUE - ungültiger Warteschlangenzeiger;
NU_INVALID_POINTER - Nullzeiger auf eine Nachricht ( NULL );
NU_INVALID_SIZE - Die angegebene Nachrichtenlänge ist nicht mit der beim Erstellen der Warteschlange angegebenen Länge kompatibel.
NU_INVALID_SUSPEND - Versuch, eine Aufgabe von einem Thread anzuhalten, der der Aufgabe nicht zugeordnet ist;
NU_QUEUE_FULL - In der Warteschlange ist nicht genügend Platz für die Nachricht vorhanden.
NU_TIMEOUT - Die Warteschlange ist nach Ablauf des Zeitlimits noch voll.
NU_QUEUE_DELETED - Die Warteschlange wurde gelöscht, während die Aufgabe angehalten wurde.
NU_QUEUE_RESET - Die Warteschlange wurde zurückgesetzt, während die Aufgabe angehalten wurde.

Nucleus RTOS-kompatibel


Wie bei allen anderen Nucleus SE-Objekten war es mein Ziel, die Kompatibilität des Anwendungscodes mit Nucleus RTOS zu maximieren. Warteschlangen sind keine Ausnahme und werden aus Anwendersicht auf die gleiche Weise wie in Nucleus RTOS implementiert. Es gibt auch eine gewisse Inkompatibilität, die ich für akzeptabel hielt, da der Code dadurch verständlicher und effizienter in Bezug auf den erforderlichen Speicher wird. Andernfalls können Nucleus RTOS-API-Aufrufe fast direkt auf Nucleus SE portiert werden.

Objektkennungen


In Nucleus RTOS werden alle Objekte durch eine Datenstruktur (Steuereinheiten) beschrieben, die einen bestimmten Datentyp hat. Ein Zeiger auf diese Steuereinheit dient als Kennung für die Warteschlange. Ich entschied, dass in Nucleus SE ein anderer Ansatz für die effiziente Nutzung des Speichers erforderlich ist: Alle Kernelobjekte werden durch eine Reihe von Tabellen im RAM und / oder ROM beschrieben. Die Größe dieser Tabellen wird durch die Anzahl der konfigurierten Objekte jedes Typs bestimmt. Die Kennung eines bestimmten Objekts ist der Index in dieser Tabelle. Also habe ich NUSE_QUEUE als das Äquivalent von U8 definiert . Eine Variable (kein Zeiger) dieses Typs dient als Warteschlangenkennung. Diese leichte Inkompatibilität ist leicht zu handhaben, wenn der Code von Nucleus SE nach Nucleus RTOS und umgekehrt portiert wird. In der Regel werden keine anderen Operationen an Objektkennungen als Verschieben und Speichern ausgeführt.

Nucleus RTOS unterstützt auch die Benennung von Warteschlangen. Diese Namen werden nur zum Debuggen verwendet. Ich habe sie von Nucleus SE ausgeschlossen, um Speicherplatz zu sparen.

Nachrichtengröße und -typ


In Nucleus RTOS kann eine Warteschlange so konfiguriert werden, dass Nachrichten verarbeitet werden, die aus einer beliebigen Anzahl von nicht signierten Elementen bestehen. In Nucleus SE werden Warteschlangen vereinfacht und unterstützen nur einzelne Nachrichten vom Typ ADDR . Die Datenkanäle von Nucleus SE sind etwas flexibler und können in einigen Fällen eine nützliche Alternative zu Warteschlangen sein. Kanäle werden in den nächsten beiden Artikeln dieser Reihe behandelt.

Nucleus SE unterstützt auch Nachrichtenwarteschlangen mit variabler Länge, die nur die maximale Nachrichtenlänge während der Erstellung angeben. Variable Nachrichtenlängen werden von Nucleus SE nicht unterstützt

Warteschlangengröße


In Nucleus SE beträgt die maximale Anzahl von Nachrichten in einer Warteschlange 256, da alle Variablen und Konstanten vom Typ U8 sind . Nucleus RTOS unterliegt keinen solchen Einschränkungen.

Nicht realisierte API-Aufrufe


Nucleus RTOS unterstützt zehn Warteschlangenverwaltungsaufrufe. Von diesen sind vier nicht in Nucleus SE implementiert. Details zu diesen Aufrufen sowie die Gründe für eine solche Entscheidung finden Sie in diesem Artikel oben im Abschnitt "Nicht realisierte API-Aufrufe".

Im nächsten Artikel werden Datenübertragungskanäle erläutert.

Über den Autor: Colin Walls ist seit über dreißig Jahren in der Elektronikindustrie tätig und widmet sich die meiste Zeit der Firmware. Heute ist er Firmware-Ingenieur bei Mentor Embedded (einer Abteilung von Mentor Graphics). Colin Walls spricht häufig auf Konferenzen und Seminaren, Autor zahlreicher technischer Artikel und zweier Bücher über Firmware. Lebt in Großbritannien. Colins professioneller Blog , E-Mail: colin_walls@mentor.com.

Source: https://habr.com/ru/post/de432804/


All Articles