
Wir überprüfen weiterhin die RTOS-Dienste, die zusätzliche Informationen zu Aufgaben und Vorgängen mit ihnen bereitstellen.
Zusätzliche API-Aufrufe, die mit Aufgaben verknüpft sind, umfassen Aufrufe zum Abrufen der Aufgaben-ID, zum Überprüfen der Stapelgröße, zum Zurücksetzen der Aufgabe, zum Abrufen von Informationen zur Aufgabe und zum Bestimmen der Anzahl der Aufgaben im System. Nucleus RTOS und Nucleus SE bieten 4 wichtige API-Aufrufe für diese Vorgänge, auf die ich in diesem Artikel eingehen werde.
Frühere Artikel in der Reihe:
Artikel 11. Aufgaben: Konfiguration und Einführung in die APIArtikel 10. Scheduler: Erweiterte Funktionen und KontexterhaltungArtikel 9. Scheduler: ImplementierungArtikel 8. Nucleus SE: Internes Design und BereitstellungArtikel 7. Nucleus SE: EinführungArtikel 6. Andere RTOS-DiensteArtikel 5. Aufgabeninteraktion und SynchronisationArtikel 4. Aufgaben, Kontextwechsel und InterruptsArtikel 3. Aufgaben und PlanungArtikel 2. RTOS: Struktur und Echtzeitmodus
Artikel 1. RTOS: Einführung.
Abrufen der ID der aktuellen Aufgabe
Dieser Dienstprogrammaufruf gibt die ID der aufgerufenen Aufgabe zurück. Für Nucleus RTOS ist dies ein Zeiger auf die Steuereinheit der aktuellen Aufgabe. Für Nucleus SE der Index (0-15) der aktuellen Aufgabe.
Aufruf der aktuellen Aufgabe in Nucleus RTOSPrototyp eines Serviceabrufs:
NU_TASK * NU_Current_Task_Pointer (VOID);Parameter:
Sind abwesend.
Rückgabewert:
Zeiger auf die Steuereinheit der aktuellen Aufgabe;
NU_NULL - Es wird keine Aufgabe ausgeführt.
Eine laufende Aufgabe in Nucleus SE herausfordernDieser API-Aufruf unterstützt die Kernfunktionalität der Nucleus RTOS-API.
Prototyp eines Serviceabrufs:
NUSE_TASK NUSE_Task_Current (void);Parameter:
Sind abwesend.
Rückgabewert:
Index der aktuellen (aufgerufenen) Aufgabe.
Führen Sie eine laufende Aufgabe in Nucleus SE ausDie Implementierung des API-Aufrufs ist in diesem Fall recht einfach: Der Wert der globalen Variablen
NUSE_Task_Active wird zurückgegeben .
Überprüfen der verfügbaren Stapelgröße
Dieser Dienstprogrammaufruf gibt die verfügbare Stapelgröße (in Byte) für die aktuelle Aufgabe zurück. Dies ist nur für Planer ratsam, bei denen jede Aufgabe einen eigenen Stapel hat. d.h. Nicht geeignet für den RTC-Scheduler (Run To Completion) in Nucleus SE.
Abrufen von Stapelvolumeninformationen in Nucleus RTOSPrototyp eines Serviceabrufs:
UNSIGNED NU_Task_Check_Stack (VOID);Parameter:
Sind abwesend.
Rückgabewert:
Die Größe der verfügbaren Stapelgröße für die aktuelle Aufgabe in Byte.
Informationen zur Stapelgröße in Nucleus SE abrufenDieser API-Aufruf unterstützt die Kernfunktionalität der Nucleus RTOS-API. Nucleus SE erfordert jedoch einen formalen (Dummy-) Parameter, um das Abrufen des Werts des Zeigers auf den verwendeten Stapel zu erleichtern.
Prototyp eines Serviceabrufs:
U16 NUSE_Task_Check_Stack (U8-Dummy);Parameter:
Dummy - ein beliebiger Wert, da er tatsächlich nicht verwendet wird.
Rückgabewert:
Die Größe der verfügbaren Stapelgröße für die aktuelle Aufgabe in Byte.
ImplementierungFür einen solchen Anruf muss der Code portabel sein:

Wenn der RTC-Scheduler verwendet wird, ist der Rückgabewert 0, da es nicht möglich ist (unter Verwendung von portablem Code), den für die Aufgabe verfügbaren Stapelspeicher zu bestimmen.
In anderen Fällen wird der Wert des Stapelzeigers bestimmt, indem die Adresse des Dummy-Parameters ermittelt wird, der sich fast am Anfang des Stapels befindet. Genau genommen hängt eine solche Methode von den Entwicklungs- / Compiler-Tools ab, funktioniert aber immer. Der Rückgabewert ist die Differenz zwischen diesem Wert und dem ursprünglichen Wert des Stapelspeichers, übersetzt in Bytes.
Task zurückgesetzt
In diesem Fall bringt ein API-Aufruf die Aufgabe in ihren ursprünglichen nicht verwendeten Zustand zurück. Eine solche API-Funktion unterscheidet sich von den üblichen API-Rücksetzfunktionen für andere Kernelobjekte, schon allein deshalb, weil es sich um ein Zurücksetzen handelt und nicht nur um das Setzen der Aufgabe in den Ausgangszustand (für Nucleus SE ist es entweder
NUSE_READY oder der Eintrag
NUSE_Task_Initial_State [] (siehe Datenstrukturen in nächster Artikel)); Die Aufgabe wird
angehalten (
NUSE_PURE_SUSPEND ) und muss fortgesetzt werden, um erneut geplant zu werden. Diese Logik ähnelt der Funktionalität des entsprechenden API-Aufrufs in Nucleus RTOS.
Task Reset Call in Nucleus RTOSPrototyp eines Serviceabrufs:
STATUS NU_Reset_Task (NU_TASK * -Aufgabe, UNSIGNED argc, VOID * argv);Parameter:
task - ein Zeiger auf einen Task-Steuerblock;
argc - ein Datenelement, mit dem Informationen an die Aufgabe übertragen werden können;
argv ist ein Zeiger, mit dem Informationen an die Aufgabe übergeben werden können.
Rückgabewert:
NU_SUCCESS - Aufruf erfolgreich abgeschlossen;
NU_INVALID_TASK - ungültiger Zeiger auf die Aufgabe;
NU_NOT_TERMINATED - Die beschriebene Aufgabe befindet sich nicht in einem Zustand vollständiger
Unterbrechung (beendet) oder Abschluss (beendet). Nur Aufgaben in einem angehaltenen oder abgeschlossenen Zustand können zurückgesetzt werden.
Aufruf zum Zurücksetzen der Aufgabe in Nucleus SEDieser API-Aufruf unterstützt die Kernfunktionalität der Nucleus RTOS-API.
Prototyp eines Serviceabrufs:
STATUS NUSE_Task_Reset (NUSE_TASK-Task);Parameter:
Task - Index (ID) der zurückzusetzenden Task.
Rückgabewert:
NUSE_SUCCESS - Aufruf erfolgreich abgeschlossen;
NUSE_INVALID_TASK - ungültiger Aufgabenindex.
Implementieren Sie Reset-Aufgaben in Nucleus SEDer Hauptzweck der API-Funktion
NUSE_Task_Reset () nach Überprüfung des Parameters besteht darin, alle Aufgabendatenstrukturen neu zu
initialisieren :

Wenn die Aufgabe blockiert wird, während die API aufgerufen wird, um auf den Zugriff auf das Kernelobjekt zu warten, müssen Sie zunächst den Zähler für blockierte Aufgaben einrichten, die dem Objekt entsprechen. Dies erfolgt durch die switch-Anweisung.
Anschließend werden die Aufgabendatenstrukturen (im Grunde genommen mit Nullen, mit Ausnahme ihres Kontextblocks) durch Aufrufen der Initialisierungsfunktion
NUSE_Init_Task () initialisiert. Die Implementierung wird im nächsten Artikel, der die Initialisierung des Systems beschreibt, ausführlicher erläutert. Schließlich wird der Aufgabenstatus auf
NUSE_PURE_SUSPEND gesetzt .
Aufgabeninformationen abrufen
Dieser Serviceabruf enthält teilweise Informationen zur Aufgabe. Die Implementierung von Nucleus SE unterscheidet sich von Nucleus PLUS, bei dem weniger Informationen zurückgegeben werden, da die Benennung von Objekten, die eine Aufgabe mit niedrigerer Priorität und eine Zeitscheibe ersetzen, nicht unterstützt werden und die Priorität nicht als redundante Informationen zurückgegeben wird.
Rufen Sie Aufgabeninformationen in Nucleus RTOS aufPrototyp eines Serviceabrufs:
STATUS NU_Task_Information (NU_TASK * Task, CHAR * Name, DATA_ELEMENT * Task_status, UNSIGNED * Scheduled_Count, OPTION * Priorität, OPTION * Preempt, UNSIGNED * Time_Slice, VOID ** Stack_Base, UNSIGNED * Stack_Size, UNSIGNED * Minimum_Stack;Parameter:
Aufgabe - ein Zeiger auf die Aufgabe, für die Informationen angefordert werden;
name - Zeiger auf eine 8-stellige Zeichenfolge für den Aufgabennamen; enthält einen Bereich für Nullzeichen;
task_status - Zeiger auf eine Variable, die den aktuellen
Taskstatuswert empfängt;
Scheduled_Count - Zeiger auf eine Variable, die den Zählerwert empfängt, wie oft die Aufgabe zum Scheduler hinzugefügt wurde.
Priorität - ein Zeiger auf eine Variable, um die Priorität der Aufgabe zu erhalten;
preempt - ein Zeiger auf eine Variable für die Optionen zum Verdrängen einer Aufgabe mit niedrigerer Priorität;
NU_PREEMPT gibt an, dass die Aufgabe
verdrängt werden kann, und
NU_NO_PREEMPT gibt an, dass die Aufgabe nicht
verdrängt werden kann.
time_slice - Zeiger auf eine Variable, um den Wert des Task-
Zeitquantums zu erhalten; Ein Wert von 0 gibt an, dass für diese Aufgabe keine Zeitquantisierung möglich ist.
stack_base - Zeiger auf eine Variable, um die Adresse des
Taskstapels abzurufen ;
stack_size - Zeiger auf eine Variable, um die Größe des
Taskstapels zu ermitteln;
Minimum_stack - Ein Zeiger auf eine Variable, um die minimale Anzahl von Bytes auf dem Stapel
abzurufen .
Rückgabewert:
NU_SUCCESS - Aufruf erfolgreich abgeschlossen;
NU_INVALID_TASK - ungültiger Zeiger auf die Aufgabe.
Rufen Sie Aufgabeninformationen in Nucleus SE aufDieser Aufruf unterstützt die Kernfunktionalität der Nucleus PLUS-API.
Prototyp eines Serviceabrufs:
STATUS NUSE_Task_Information (NUSE_TASK-Task, U8 * Taskstatus, U16 * Scheduled_Count, ADDR * Stack_Base, U16 * Stack_Size);Parameter:
Aufgabe - Index der Aufgabe, über die Informationen angefordert werden;
task_status - ein Zeiger auf eine
U8- Variable, die den aktuellen Wert des
Taskstatus erhält (wenn der Wartezustand der Task nicht verfügbar ist, wird nichts zurückgegeben);
Scheduled_Count - Zeiger auf die Variable
U16 , die den Zählerwert der Anzahl der dem Scheduler hinzugefügten Aufgaben empfängt (wenn der Zähler für geplante Aufgaben deaktiviert ist, wird nichts zurückgegeben);
stack_base - ein Zeiger auf eine
ADDR- Variable, die die Adresse des
Taskstapels empfängt (wenn der RTC-Scheduler verwendet wird, wird nichts zurückgegeben);
stack_size ist ein Zeiger auf eine
U16- Variable, die die Größe des
Taskstapels erhält (wenn der RTC-Scheduler verwendet wird, wird nichts zurückgegeben).
Rückgabewert:
NUSE_SUCCESS - Aufruf erfolgreich abgeschlossen;
NUSE_INVALID_TASK - ungültiger Aufgabenindex;
NUSE_INVALID_POINTER -
Zeigerparameter (einer oder mehrere) sind falsch.
Implementieren Sie das Abrufen von Aufgabeninformationen in Nucleus SEDie Implementierung dieses API-Aufrufs ist ziemlich einfach:

Die Funktion gibt den Status der Aufgabe unter Berücksichtigung verschiedener Konfigurationsoptionen zurück.
Anzahl der Aufgaben ermitteln
Dieser Serviceabruf gibt Informationen über die Anzahl der in der Anwendung konfigurierten Aufgaben zurück. Während sich in Nucleus RTOS diese Anzahl ändern kann und der Rückgabewert die aktuelle Anzahl von Aufgaben im Moment darstellt, wird in Nucleus SE der Rückgabewert während der Montage festgelegt und ändert sich nicht mehr.
Die Herausforderung, die Anzahl der Aufgaben in Nucleus RTOS zu ermittelnPrototyp eines Serviceabrufs:
UNSIGNED NU_Established_Tasks (VOID);Parameter:
Sind abwesend
Rückgabewert:
Die Anzahl der installierten (erstellten und nicht gelöschten) Aufgaben in der Anwendung.
Die Herausforderung, die Anzahl der Aufgaben in Nucleus SE zu ermittelnDieser API-Aufruf unterstützt die Kernfunktionalität der Nucleus PLUS-API.
Prototyp eines Serviceabrufs:
U8 NUSE_Task_Count (void);Parameter:
Sind abwesend
Rückgabewert:
Die Anzahl der konfigurierten Aufgaben in der Anwendung.
ImplementierungDie Implementierung dieses API-Aufrufs ist recht einfach: Der Wert der Direktive
#define NUSE_TASK_NUMBER wird
zurückgegeben .
Im folgenden Artikel werden Datenstrukturen in Nucleus SE erläutert, die sich auf Aufgaben und einige Standard-API-Aufrufe beziehen, die von Nucleus SE nicht unterstützt werden.
Ü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.
Über die Übersetzung: Diese Artikelserie schien insofern interessant zu sein, als der Autor den schlecht ausgebildeten Leser trotz der an einigen Stellen veralteten beschriebenen Ansätze in die Funktionen des Echtzeit-Betriebssystems einführt. Ich selbst gehöre zu dem Team von Entwicklern des
russischen RTOS , das wir
kostenlos machen wollen , und ich hoffe, dass der Zyklus für unerfahrene Entwickler nützlich sein wird.