Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Biblioteca de grupo de tareas
importante
Esta es una versión archivada de la Guía del usuario de FreeRTOS para su uso con la versión 202012.00 de FreeRTOS. Para obtener la última versión de este documento, consulte la Guía del usuario de FreeRTOS.
Descripción general
FreeRTOS admite la administración de tareas con la biblioteca de grupos de tareas de FreeRTOS. La biblioteca de grupo de tareas permite programar tareas en segundo plano así como programar y cancelar tareas de forma asincrónica y segura. Con el grupo de tareas APIs, puede configurar las tareas de su aplicación para optimizar la compensación entre el rendimiento y el consumo de memoria.
La biblioteca de grupo de tareas se basa en dos estructuras de datos principales: el grupo de tareas y los trabajos del grupo de tareas.
Grupo de tareas (IotTaskPool_t
)
El grupo de tareas contiene una cola de envío que administra la cola de trabajos para su ejecución y administra los subprocesos de trabajo que ejecutan los trabajos.
Trabajos del grupo de tareas (IotTaskPoolJob_t
)
Los trabajos del grupo de tareas se pueden ejecutar como trabajos en segundo plano o como trabajos en segundo plano temporizados. Los trabajos en segundo plano se inician en First-In-First-Out orden y no tienen restricciones de tiempo. Los trabajos temporizados están programados para ejecutarse en segundo plano de acuerdo con un temporizador.
nota
El grupo de tareas solo puede garantizar que un grupo de trabajos temporizado se ejecutará después de que transcurra un determinado tiempo de espera, pero no dentro de un margen de tiempo específico.
Dependencias y requisitos
La biblioteca del grupo de tareas tiene las siguientes dependencias:
-
La biblioteca de contenedores lineales (lista/cola) para mantener las estructuras de datos para las operaciones de grupo de tareas en curso y programadas.
-
La biblioteca de registros (si el ajuste de configuración de
IOT_LOG_LEVEL_TASKPOOL
no esIOT_LOG_NONE
). -
Una capa de plataforma que proporciona una interfaz con el sistema operativo para la administración de subprocesos, temporizadores, funciones de reloj, etc.

Características
Con la biblioteca del grupo de tareas APIs, puede hacer lo siguiente:
-
Programar trabajos para que se realicen de inmediato o más adelante con las funciones de API no bloqueantes de la biblioteca.
-
Crear trabajos asignados de forma estática y dinámica.
-
Configurar los ajustes de la biblioteca para adaptar el rendimiento y la huella en función de los recursos del sistema.
-
Personalizar el almacenamiento en caché para una sobrecarga de memoria baja al crear trabajos de forma dinámica.
Solución de problemas
Las funciones de la biblioteca del grupo de tareas devuelven códigos de error como valores enumerados IotTaskPoolError_t
. Para obtener más información acerca de cada código de error, consulte la documentación de referencia para tipos de datos enumerados IotTaskPoolError_t
en la Referencia de la API del SDK C: Task Pool.
Restricciones de uso
La biblioteca del grupo de tareas no se puede utilizar desde una rutina de servicio de interrupción (ISR).
Se desaconsejan las llamadas de devolución del usuario del grupo de tareas que realizan operaciones de bloqueo, en especial las operaciones de bloqueo indefinido. Las operaciones de bloqueo duraderas se apropian de un subproceso del grupo de tareas y crean la posibilidad de que se produzca un interbloqueo o colapso.
Inicialización
La aplicación tienen que llamar a IotTaskPool_CreateSystemTaskPool
para inicializar una instancia de un grupo de tareas del sistema, antes de usar el grupo de tareas. La aplicación debe asegurarse de que el grupo de tareas a nivel de sistema se inicializa con la suficiente antelación en la secuencia de arranque, antes de que cualquier biblioteca utilice el grupo de tareas y antes de cualquier código de aplicación publique un trabajo en el grupo de tareas. Después del arranque, el sistema inicializa el único grupo de tareas a nivel de sistema que compartirán todas las bibliotecas. Después de la inicialización, el controlador del grupo de tareas se puede recuperar para su uso con la API IOT_SYSTEM_TASKPOOL
.
nota
Llamar a IotTaskPool_CreateSystemTaskPool
no asigna memoria para almacenar las estructuras de datos y el estado del grupo de tareas, pero es posible asignar memoria para almacenar los entidades y estructuras de datos dependientes, como los subprocesos del grupo de tareas.
Referencia de la API
Para obtener una referencia de la API completa, consulte la Referencia de la API del SDK C: Task Pool.
Ejemplo de uso
Supongamos que necesita programar una recopilación periódica de AWS IoT Device Defender métricas y decide utilizar un temporizador para programar la recopilación con llamadas al MQTT para conectarse, suscribirse y publicar APIs. El código siguiente define una función de devolución de llamada para aceptar AWS IoT Device Defender métricas en MQTT, con una llamada de desconexión que se desconecta de la conexión 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 ); }