Libreria Pool di attività - FreeRTOS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Libreria Pool di attività

Importante

Questa è una versione archiviata della FreeRTOS User Guide da utilizzare con la versione FreeRTOS 202012.00. Per l'ultima versione di questo documento, consulta la FreerTOS User Guide.

Panoramica

FreerTOS supporta la gestione delle attività con la libreria FreerTOS Task Pool. Oltre a consentire di pianificare le attività in background, la libreria Pool di attività supporta la pianificazione e l'annullamento delle attività in modalità asincrona e sicura. Utilizzando il Task Pool APIs, è possibile configurare le attività dell'applicazione per ottimizzare il compromesso tra prestazioni e ingombro di memoria.

La libreria Pool attività si basa su due strutture di dati fondamentali, ovvero il pool delle attività e i processi del pool delle attività.

Pool delle attività (IotTaskPool_t)

Il pool delle attività include una coda di distribuzione che gestisce l'esecuzione della coda dei processi, nonché i thread dei processi di esecuzione.

Processi del pool delle attività (IotTaskPoolJob_t)

I processi del pool delle attività possono essere eseguiti come processi in background oppure come processi in background programmati. I lavori in background vengono avviati in First-In-First-Out ordine e non hanno vincoli di tempo. I processi programmati sono caratterizzati da un'esecuzione in background pianificata in base a un timer.

Nota

I pool delle attività possono solo garantire che un processo pianificato venga eseguito al termine di un intervallo di timeout e non all'interno di una finestra temporale specifica.

Dipendenze e requisiti

La libreria Pool di attività dispone delle seguenti dipendenze:

  • Libreria di Linear Container (elenchi/code) per la gestione delle strutture dati per le operazioni dei pool delle attività pianificate e in corso.

  • La libreria di log (se l'impostazione di configurazione IOT_LOG_LEVEL_TASKPOOL non è IOT_LOG_NONE).

  • Il livello piattaforma che fornisce un'interfaccia al sistema operativo per la gestione dei thread, i timer, le funzioni di clock e così via.

Diagram showing task pool connections to components like logging, static memory, and thread management.

Funzionalità

Utilizzando la libreria Task Pool APIs, è possibile effettuare le seguenti operazioni:

  • Pianificare processi immediati e differiti mediante le funzioni API non bloccanti della libreria.

  • Creare processi allocati a livello statico e dinamico.

  • Configurare le impostazioni della libreria per garantire la scalabilità a livello di prestazioni e footprint, in base alle risorse del sistema.

  • Personalizzare la memorizzazione nella cache in caso di sovraccarico causato da memoria insufficiente durante la creazione dinamica di processi.

Risoluzione dei problemi

Le funzioni della libreria Pool di attività restituiscono codici di errore sotto forma di valori enumerati IotTaskPoolError_t. Per ulteriori informazioni su ciascun codice di errore, consulta la documentazione di riferimento per il tipo di dati enumerati IotTaskPoolError_t nella Documentazione di riferimento sull'API C SDK per i pool di attività.

Limitazioni d'uso

La libreria Pool di attività non può essere utilizzata dall'interno di una routine del servizio di interrupt (IRS).

È consigliabile evitare l'esecuzione di callback a livello di utente del pool delle attività che eseguono operazioni di blocco, in particolar modo operazioni di blocco a tempo indefinito. Le operazioni di blocco di lungo termine intercettano infatti il thread di un pool di attività e pertanto generano potenziali situazioni di blocco critico (deadlock) o uso eccessivo delle risorse.

Inizializzazione

Prima di poter utilizzare il pool di attività, un'applicazione deve chiamare IotTaskPool_CreateSystemTaskPool per inizializzare un'istanza di un pool di attività di sistema. L'applicazione deve accertarsi che il pool di attività a livello di sistema venga inizializzato all'inizio della sequenza di avvio prima che qualsiasi libreria possa utilizzare il pool di attività e prima che il codice dell'applicazione pubblichi un processo nel pool di attività. Poco dopo l'avvio, il sistema inizializza il pool di attività a livello di sistema per tutte le librerie da condividere. Dopo l'inizializzazione, l'handle del pool di attività può essere recuperato per essere usato con l'API IOT_SYSTEM_TASKPOOL.

Nota

La chiamata a IotTaskPool_CreateSystemTaskPool non alloca la memoria per la memorizzazione di strutture e stati dei dati del pool di attività, ma potrebbe allocare memoria per la memorizzazione di entità e strutture di dati dipendenti, ad esempio i thread del pool di dati.

Riferimento API

Per informazioni di riferimento complete sull'API, consulta Documentazione di riferimento sull'API SDK C del pool di attività.

Esempio di utilizzo

Supponiamo di dover pianificare una raccolta ricorrente di AWS IoT Device Defender metriche e di decidere di utilizzare un timer per pianificare la raccolta con le chiamate alla connessione, alla sottoscrizione e alla pubblicazione di MQTT. APIs Il codice seguente definisce una funzione di callback per accettare AWS IoT Device Defender metriche su MQTT, con un callback di disconnessione che si disconnette dalla connessione MQTT.

/* 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 ); }