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.
xxxxxxxxxx
BaseType_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:xxxxxxxxxx
void 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 tarefas
void TaskFunction1(void *pvParameters);
void TaskFunction2(void *pvParameters);
// Estrutura de dados para passar como parâmetro para a tarefa
typedef 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 TaskFunction1
void 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 TaskFunction2
void 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.