Die ganze Wahrheit über RTOS. Artikel 12. Dienstleistungen für die Arbeit mit Aufgaben



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 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.

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 RTOS
Prototyp 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 herausfordern
Dieser 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 aus
Die 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 RTOS
Prototyp 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 abrufen
Dieser 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.

Implementierung
Fü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 RTOS
Prototyp 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 SE
Dieser 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 SE
Der 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 auf
Prototyp 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 auf
Dieser 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 SE
Die 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 ermitteln
Prototyp 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 ermitteln
Dieser 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.

Implementierung
Die 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.

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


All Articles