No FreeRTOS, a prioridade de uma tarefa determina a ordem em que as tarefas são escalonadas. Tarefas com prioridades mais altas são escalonadas antes das tarefas com prioridades mais baixas.
a prioridade de uma tarefa é estabelecida no momento de sua criação através da função xTaskCreate ou xTaskCreatePinnedToCore.
A prioridade de uma tarefa é um valor inteiro, onde números maiores indicam prioridades mais altas.
Além disso, você pode ajustar a prioridade de uma tarefa existente usando a função vTaskPrioritySet.
Ao criar uma tarefa com xTaskCreate ou xTaskCreatePinnedToCore, você especifica a prioridade com o 5 dos parâmetros. Por exemplo:
// Criação de uma tarefa com prioridade 1xTaskCreate( TaskFunction, // 1. Função da tarefa "TaskName", // 2. Nome da tarefa (para fins de depuração) stackSize, // 3. Tamanho da pilha da tarefa NULL, // 4. Parâmetro passado para a função da tarefa 1, // 5. Prioridade da tarefa &taskHandle // 6. Handler da tarefa (opcional));Para criar uma tarefa com uma prioridade mais alta, basta usar um valor maior para o parâmetro de prioridade:
xxxxxxxxxx// Criação de uma tarefa com prioridade 2 (mais alta)xTaskCreate( TaskFunction, // Função da tarefa "TaskName", // Nome da tarefa (para fins de depuração) stackSize, // Tamanho da pilha da tarefa NULL, // Parâmetro passado para a função da tarefa 2, // Prioridade da tarefa &taskHandle // Handle da tarefa (opcional));Para alterar a prioridade de uma tarefa existente, use a função vTaskPrioritySet.
Sintaxe de vTaskPrioritySet:
xxxxxxxxxxvoid vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority);xTask: Handlre da tarefa cuja prioridade você deseja ajustar. Se xTask for NULL, a prioridade da tarefa chamadora será ajustada.uxNewPriority: Nova prioridade da tarefa.Aqui está um exemplo:
xxxxxxxxxx// Suponha que taskHandle é o handle da tarefa que queremos alterar a prioridadevTaskPrioritySet(taskHandle, 3); // Define a prioridade da tarefa para 3Você pode obter a prioridade atual de uma tarefa usando a função uxTaskPriorityGet:
xUBaseType_t uxPriority;// Obtém a prioridade da tarefauxPriority = uxTaskPriorityGet(taskHandle);// Se quiser obter a prioridade da própria tarefa que está executandouxPriority = uxTaskPriorityGet(NULL);Para ajustar a prioridade de uma tarefa específica, você precisa do handler dessa tarefa. Você pode obter o handler no momento da criação da tarefa ou posteriormente usando xTaskGetHandle.
Exemplo de obtenção do handle na criação da tarefa:
xxxxxxxxxxTaskHandle_t xHandleTask_LED;xTaskCreate(Task_LED, "Task_LED", 1024, NULL, 1, &xHandleTask_LED);
Aqui está um exemplo completo que demonstra a criação de três tarefas com diferentes prioridades e como alterar a prioridade de uma tarefa durante a execução.
xxxxxxxxxx// Protótipos das funções das tarefasvoid TaskLowPriority(void *pvParameters);void TaskMediumPriority(void *pvParameters);void TaskHighPriority(void *pvParameters);// Handles das tarefasTaskHandle_t lowPriorityHandle = NULL;TaskHandle_t mediumPriorityHandle = NULL;TaskHandle_t highPriorityHandle = NULL;void setup() { Serial.begin(115200); // Criação das tarefas com diferentes prioridades xTaskCreate(TaskLowPriority, "LowPriorityTask", 1024, NULL, 1, &lowPriorityHandle); xTaskCreate(TaskMediumPriority, "MediumPriorityTask", 1024, NULL, 2, &mediumPriorityHandle); xTaskCreate(TaskHighPriority, "HighPriorityTask", 1024, NULL, 3, &highPriorityHandle);}void loop() { // Loop vazio}// Tarefa de baixa prioridadevoid TaskLowPriority(void *pvParameters) { while (true) { Serial.println("Low Priority Task is running"); vTaskDelay(pdMS_TO_TICKS(1000)); }}// Tarefa de prioridade médiavoid TaskMediumPriority(void *pvParameters) { while (true) { Serial.println("Medium Priority Task is running"); vTaskDelay(pdMS_TO_TICKS(1000)); }}// Tarefa de alta prioridadevoid TaskHighPriority(void *pvParameters) { while (true) { Serial.println("High Priority Task is running"); // Alterar a prioridade da tarefa de baixa prioridade vTaskPrioritySet(lowPriorityHandle, 4); vTaskDelay(pdMS_TO_TICKS(1000)); }}Criação de Tarefas com Diferentes Prioridades:
TaskLowPriority é criada com prioridade 1.TaskMediumPriority é criada com prioridade 2.TaskHighPriority é criada com prioridade 3.Execução das Tarefas:
Alteração da Prioridade:
TaskHighPriority altera a prioridade da tarefa TaskLowPriority para 4, tornando-a a tarefa de mais alta prioridade no sistema.É recomendado definir prioridades de maneira cuidadosa para evitar problemas de inversão de prioridade, onde tarefas de alta prioridade são indiretamente bloqueadas por tarefas de baixa prioridade. Além disso, evite definir todas as tarefas com a mesma prioridade, a menos que você tenha um motivo específico para isso.
Esse conjunto de exemplos e explicações permite entender como configurar e manipular prioridades de tarefas no FreeRTOS para ESP32.