Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Task Pool-Bibliothek
Wichtig
Dies ist eine archivierte Version des FreeRTOS-Benutzerhandbuchs zur Verwendung mit der FreeRTOS-Version 202012.00. Die neueste Version dieses Dokuments finden Sie im FreeRTOS-Benutzerhandbuch.
Übersicht
FreeRTOS unterstützt die Aufgabenverwaltung mit der FreeRTOS Task Pool-Bibliothek. Die Task Pool-Bibliothek ermöglicht es Ihnen, Hintergrundaufgaben zu planen und ermöglicht eine sichere, asynchrone Aufgabenplanung und den Abbruch. Mithilfe des Task Pools können Sie die Aufgaben Ihrer Anwendung konfigurieren APIs, um den Kompromiss zwischen Leistung und Speicherbedarf zu optimieren.
Die Task Pool-Bibliothek basiert auf zwei Hauptdatenstrukturen: Task Pool und Task Pool Jobs.
Task Pool (IotTaskPool_t
)
Der Task Pool enthält eine Dispatch-Warteschlange, die die Auftragswarteschlange für die Ausführung und die Worker-Threads für die Ausführung von Jobs verwaltet.
Task Pool-Aufgaben (IotTaskPoolJob_t
)
Task Pool Jobs können als Hintergrundjobs oder als zeitgesteuerte Hintergrundjobs ausgeführt werden. Hintergrundjobs werden der Reihe nach gestartet First-In-First-Out und unterliegen keinen zeitlichen Einschränkungen. Zeitgesteuerte Jobs werden für die Hintergrundausführung gemäß einem Timer eingeplant.
Anmerkung
Der Task Pool kann nur garantieren, dass eine zeitabhängige Aufgabe nach Ablauf eines Timeout ausgeführt wird, nicht innerhalb eines bestimmten Zeitfensters.
Abhängigkeiten und Anforderungen
Die Task Pool-Bibliothek weist die folgenden Abhängigkeiten auf:
-
Die Linear Containers-Bibliothek (Liste/Warteschlange) zur Pflege der Datenstrukturen für geplante und laufende Task Pool-Operationen.
-
Die Logging-Bibliothek (wenn die Konfigurationseinstellung
IOT_LOG_LEVEL_TASKPOOL
nichtIOT_LOG_NONE
ist). -
Eine Plattformschicht, die eine Schnittstelle zum Betriebssystem für Thread-Management, Timer, Taktgeberfunktionen usw. bereitstellt.

Features
Mit der Task-Pool-Bibliothek APIs können Sie Folgendes tun:
-
Planen Sie sofortige und verzögerte Aufträge mit den blockierungsfreien API-Funktionen der Bibliothek.
-
Erstellen Sie statisch und dynamisch zugewiesene Jobs.
-
Konfigurieren Sie Bibliothekseinstellungen, um Leistung und Platzbedarf basierend auf den Ressourcen Ihres Systems zu skalieren.
-
Passen Sie das Caching an, um den Speicherbedarf beim dynamischen Erstellen von Jobs gering zu halten.
Fehlerbehebung
Die Task Pool-Bibliotheksfunktionen geben Fehlercodes als IotTaskPoolError_t
-Enumerationswerte zurück. Weitere Informationen zu den einzelnen Fehlercodes finden Sie in der Referenzdokumentation für den Ernumerator-Datentyp IotTaskPoolError_t
in der Task Pool C SDK API-Referenz.
Nutzungsbeschränkungen
Die Task Pool-Bibliothek kann nicht aus einer Interrupt-Serviceroutine (ISR) verwendet werden.
Wir raten dringend davon ab, Callbacks von Task Pool-Benutzern zu tätigen, die Blockierungsoperationen durchführen, insbesondere unbefristete Blockierungsoperationen. Langzeit-Blockierungsoperationen belegen effektiv einen Task Pool-Thread und schaffen ein Potenzial für Blockaden oder Unterdeckung.
Initialisierung
Eine Anwendung muss IotTaskPool_CreateSystemTaskPool
aufrufen, um eine Instance eines System-Task-Pools zu initialisieren, bevor sie den Task-Pool verwendet. Die Anwendung muss sicherstellen, dass der Task Pool auf Systemebene früh genug in der Boot-Sequenz initialisiert wird, bevor eine Bibliothek den Task Pool verwendet und bevor ein Anwendungscode einen Job in den Task Pool schreibt. Kurz nach dem Booten initialisiert das System den einzelnen, systemweiten Task Pool, den alle Bibliotheken gemeinsam nutzen können. Nach der Initialisierung kann das Task-Pool-Handle für die Verwendung mit der IOT_SYSTEM_TASKPOOL
-API abgerufen werden.
Anmerkung
Der Aufruf von IotTaskPool_CreateSystemTaskPool
weist keinen Speicher zu, um die Datenstrukturen und den Zustand des Task Pool zu speichern, aber er könnte Speicher zuweisen, um die abhängigen Entitäten und Datenstrukturen, wie die Threads des Task Pool zu speichern.
API-Referenz
Die vollständige API-Referenz finden Sie unter Task Pool C SDK API-Referenz.
Beispielverwendung
Angenommen, Sie müssen eine wiederkehrende Erfassung von AWS IoT Device Defender Metriken planen und entscheiden sich dafür, einen Timer zu verwenden, um die Erfassung mit Aufrufen der MQTT-Befehle Connect, Subscribe und Publish APIs zu planen. Der folgende Code definiert eine Callback-Funktion für die Annahme von AWS IoT Device Defender Metriken in MQTT mit einem Disconnect-Callback, der die Verbindung zur MQTT-Verbindung trennt.
/* An example of a user context to pass to a callback through a task pool thread. */ typedef struct JobUserContext { uint32_t counter; } JobUserContext_t; /* An example of a user callback to invoke through a task pool thread. */ static void ExecutionCb( IotTaskPool_t * pTaskPool, IotTaskPoolJob_t * pJob, void * context ) { ( void )pTaskPool; ( void )pJob; JobUserContext_t * pUserContext = ( JobUserContext_t * )context; pUserContext->counter++; } void TaskPoolExample( ) { JobUserContext_t userContext = { 0 }; IotTaskPoolJob_t job; IotTaskPool_t * pTaskPool; IotTaskPoolError_t errorSchedule; /* Configure the task pool to hold at least two threads and three at the maximum. */ /* Provide proper stack size and priority per the application needs. */ const IotTaskPoolInfo_t tpInfo = { .minThreads = 2, .maxThreads = 3, .stackSize = 512, .priority = 0 }; /* Create a task pool. */ IotTaskPool_Create( &tpInfo, &pTaskPool ); /* Statically allocate one job, then schedule it. */ IotTaskPool_CreateJob( &ExecutionCb, &userContext, &job ); errorSchedule = IotTaskPool_Schedule( pTaskPool, &job, 0 ); switch ( errorSchedule ) { case IOT_TASKPOOL_SUCCESS: break; case IOT_TASKPOOL_BAD_PARAMETER: // Invalid parameters, such as a NULL handle, can trigger this error. case IOT_TASKPOOL_ILLEGAL_OPERATION: // Scheduling a job that was previously scheduled or destroyed could trigger this error. case IOT_TASKPOOL_NO_MEMORY: // Scheduling a with flag #IOT_TASKPOOL_JOB_HIGH_PRIORITY could trigger this error. case IOT_TASKPOOL_SHUTDOWN_IN_PROGRESS: // Scheduling a job after trying to destroy the task pool could trigger this error. // ASSERT break; default: // ASSERT*/ } /* ................................. */ /* ... Perform other operations ... */ /* ................................. */ IotTaskPool_Destroy( pTaskPool ); }