A função xTaskCreate() é usada para criar uma nova tarefa no FreeRTOS. Essa função inicializa a tarefa, aloca memória para sua pilha e adiciona a tarefa à lista de tarefas prontas para serem executadas pelo escalonador.
xxxxxxxxxxBaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, const uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask);pvTaskCode: Um ponteiro para a função que implementa a tarefa. Esta função deve seguir o seguinte protótipo:xxxxxxxxxxvoid TaskFunction(void *pvParameters);pcName: Um nome descritivo para a tarefa. Este nome é usado apenas para fins de depuração.usStackDepth: O tamanho da pilha da tarefa, em palavras (não bytes). Por exemplo, se configSTACK_DEPTH_TYPE for definido como uint16_t e o tamanho da palavra for 4 bytes, um usStackDepth de 100 significa que a pilha pode armazenar 100 palavras, ou seja, 400 bytes.pvParameters: Um ponteiro para os parâmetros que serão passados para a tarefa. Este valor é passado como argumento para a função da tarefa quando ela é executada.uxPriority: A prioridade da tarefa. Tarefas com prioridades mais altas preemptam tarefas com prioridades mais baixas.pxCreatedTask: Um ponteiro para o handle da tarefa criada. Este handle pode ser usado para referenciar a tarefa em outras chamadas do FreeRTOS. Este parâmetro é opcional e pode ser NULL.xTaskCreate() retorna pdPASS (1) se a tarefa foi criada com sucesso. Caso contrário, retorna errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY (0) se não houver memória suficiente disponível.
A pilha da tarefa é uma área de memória alocada especificamente para armazenar dados locais, variáveis automáticas e contextos de função durante a execução da tarefa. Cada tarefa no FreeRTOS tem sua própria pilha separada, que é usada para:
O tamanho da pilha é crítico para a estabilidade do sistema. Uma pilha muito pequena pode causar estouro de pilha, enquanto uma pilha muito grande pode desperdiçar memória. Algumas sugestões para definir o tamanho da pilha são:
Analisar o Código da Tarefa:
Uso de Ferramentas de Análise:
uxTaskGetStackHighWaterMark() para monitorar o uso da pilha durante a execução e ajustar o tamanho conforme necessário.Teste de Estresse:
Referência a Exemplos:
O parâmetro pvParameters permite que você passe dados para a tarefa quando ela é criada. Este parâmetro pode ser usado para:
Aqui está um exemplo que demonstra a criação de duas tarefas com diferentes prioridades e uso do parâmetro pvParameters.
xxxxxxxxxx// Protótipos das funções das tarefasvoid TaskFunction1(void *pvParameters);void TaskFunction2(void *pvParameters);// Estrutura de dados para passar como parâmetro para a tarefatypedef struct { int taskId; const char *taskMessage;} TaskParameters;void setup() { Serial.begin(115200); // Definir os parâmetros para as tarefas TaskParameters task1Params = {1, "Task 1 is running"}; TaskParameters task2Params = {2, "Task 2 is running"}; // Criação das tarefas com diferentes prioridades e parâmetros xTaskCreate(TaskFunction1, "Task1", 1024, &task1Params, 1, NULL); xTaskCreate(TaskFunction2, "Task2", 1024, &task2Params, 2, NULL);}void loop() { // Loop vazio}// Implementação da TaskFunction1void TaskFunction1(void *pvParameters) { TaskParameters *params = (TaskParameters *) pvParameters; while (true) { Serial.print("Task ID: "); Serial.print(params->taskId); Serial.print(", Message: "); Serial.println(params->taskMessage); vTaskDelay(pdMS_TO_TICKS(1000)); }}// Implementação da TaskFunction2void TaskFunction2(void *pvParameters) { TaskParameters *params = (TaskParameters *) pvParameters; while (true) { Serial.print("Task ID: "); Serial.print(params->taskId); Serial.print(", Message: "); Serial.println(params->taskMessage); vTaskDelay(pdMS_TO_TICKS(500)); }}Definição de Parâmetros:
TaskParameters é uma estrutura usada para passar múltiplos parâmetros para as tarefas.Criação de Tarefas:
xTaskCreate(TaskFunction1, "Task1", 1024, &task1Params, 1, NULL);xTaskCreate(TaskFunction2, "Task2", 1024, &task2Params, 2, NULL);TaskFunction1 e TaskFunction2 são criadas com diferentes prioridades e recebem seus respectivos parâmetros.Implementação das Funções das Tarefas:
A função xTaskCreate() é fundamental para a criação de tarefas no FreeRTOS. A pilha da tarefa é crucial para o armazenamento de variáveis locais e contextos de função. O parâmetro passado para a função da tarefa permite a passagem de dados personalizados para cada instância da tarefa, proporcionando flexibilidade e modularidade ao design do sistema. Ao definir o tamanho da pilha, é importante considerar o uso real da pilha pela tarefa para evitar problemas de estouro e otimizar o uso da memória do sistema.