Biblioteca de Grupo de tarefas - FreeRTOS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Biblioteca de Grupo de tarefas

Importante

Esta é uma versão arquivada do Guia do usuário do FreeRTOS para usar com a versão 202012.00 do FreeRTOS. Para obter a versão mais recente deste documento, consulte o Guia do usuário do FreeRTOS.

Visão geral

O FreeRTOS é compatível com o gerenciamento de tarefas usando a biblioteca de Pool de tarefas do FreeRTOS. A biblioteca do Grupo de tarefas permite agendar tarefas em segundo plano, além de agendar e cancelar tarefas assíncronas com segurança. Usando o Pool de Tarefas APIs, você pode configurar as tarefas do seu aplicativo para otimizar a compensação entre desempenho e espaço ocupado pela memória.

A biblioteca do Grupo de tarefas é feita de duas estruturas de dados principais: o Grupo de tarefas e os trabalhos do Grupo de tarefas.

Grupo de tarefas (IotTaskPool_t)

O Grupo de tarefas contém uma fila de expedição que gerencia a fila de trabalhos a serem executados, além de gerenciar os threads de operadores que executam os trabalhos.

Trabalhos de grupo de tarefas (IotTaskPoolJob_t)

Os trabalhos do Grupo de tarefas podem ser executados como trabalhos em segundo plano ou trabalhos temporizados em segundo plano. Os trabalhos em segundo plano são iniciados em First-In-First-Out ordem e não têm restrições de tempo. Os trabalhos temporizados são programados para execução em segundo plano e seguem um temporizador.

nota

O grupo de tarefas pode garantir apenas que um trabalho temporizado será executado após um determinado momento, e não dentro de um intervalo de tempo específico.

Dependências e requisitos

A biblioteca do Grupo de tarefas tem as seguintes dependências:

  • A biblioteca de contêineres lineares (lista/fila) para manter as estruturas de dados de operações de grupo de tarefas programadas e em andamento.

  • A biblioteca de registro em log (se a configuração IOT_LOG_LEVEL_TASKPOOL não for IOT_LOG_NONE).

  • Uma camada de plataforma que fornece uma interface para o sistema operacional para o gerenciamento de threads, temporizadores, funções de relógio, etc.

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

Atributos

Usando a biblioteca do Pool de Tarefas APIs, você pode fazer o seguinte:

  • Programar trabalhos imediatos e adiados com as funções da API sem bloqueio da biblioteca.

  • Criar trabalhos alocados estaticamente e dinamicamente.

  • Configurar a biblioteca para escalar o desempenho e a capacidade, de acordo com os recursos de seu sistema.

  • Personalizar o armazenamento em cache para a sobrecarga de memória baixa ao criar trabalhos dinamicamente.

Solução de problemas

As funções da biblioteca de Grupo de tarefas retornam códigos de erro como valores enumerados IotTaskPoolError_t. Para obter mais informações sobre cada código de erro, consulte a documentação de referência dos tipos de dados enumerados IotTaskPoolError_t em Referência de API para o SDK de C de grupo de tarefas.

Restrições de uso

A biblioteca de Grupo de tarefas não pode ser usada em uma rotina de serviço de interrupção (ISR).

Não recomendamos retornos de chamada de usuários do grupo de tarefas que realizam operações de bloqueio, especialmente operações de bloqueio indefinidas. As operações de bloqueio de longa duração basicamente roubam um thread do grupo de tarefas e criam um possível bloqueio ou esgotamento.

Inicialização

Antes de usar o grupo de tarefas, uma aplicação precisa chamar IotTaskPool_CreateSystemTaskPool para iniciar uma instância de um grupo de tarefas do sistema. A aplicação precisa garantir que o grupo de tarefas no nível do sistema seja inicializado com antecedência suficiente na sequência de inicialização, antes de qualquer biblioteca usá-lo e antes de qualquer código de aplicação publicar um trabalho no grupo de tarefas. Após a inicialização, o sistema inicia o grupo de tarefas único no sistema compartilhado por todas as bibliotecas. Após a inicialização, o identificador do grupo de tarefas pode ser recuperado para utilização com a API IOT_SYSTEM_TASKPOOL.

nota

Chamar IotTaskPool_CreateSystemTaskPool não aloca memória para armazenar as estruturas de dados e os estados do grupo de tarefas, no entanto, pode alocar memória para armazenar as entidades dependentes e as estruturas de dados, como por exemplo, os threads do grupo de tarefas.

Referência da API

Para obter uma referência completa de API, consulte Referência de API para o SDK de C de grupo de tarefas.

Exemplo de uso

Suponha que você precise agendar uma coleção recorrente de AWS IoT Device Defender métricas e decida usar um cronômetro para agendar a coleta com chamadas para a conexão, assinatura e publicação do MQTT. APIs O código a seguir define uma função de retorno de chamada para aceitar AWS IoT Device Defender métricas em todo o MQTT, com um retorno de chamada de desconexão que se desconecta da conexão 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 ); }