Gerenciamento de Tarefas e Prioridades com FreeRTOS STM32

Gerenciar tarefas e prioridades é essencial em sistemas embarcados com RTOS. No FreeRTOSIntrodução ao FreeRTOS no STM32Introdução ao FreeRTOS no STM32Descubra como otimizar projetos STM32 usando FreeRTOS com exemplos práticos de tarefas, sincronização, comunicação e gestão de recursos. + STM32, isso define como seu sistema aloca recursos do microcontrolador. Vamos explorar técnicas práticas, erros comuns e exemplos reais para dominar multitarefa em projetos complexos, integrando conceitos fundamentais e aplicações avançadas.

👉 Exemplo Inicial:

Imagine um sistema que coleta dados de sensores (ADCConfigurando e usando o ADC no STM32Configurando e usando o ADC no STM32Este tutorial para STM32 ensina a configurar o ADC via registradores e HAL, explicando calibração, DMA, filtragem e resolução de problemas práticos.), processa em tempo real e transmite via Wi-Fi. Sem priorização adequada, uma tarefa de baixa prioridade (ex: log em SD) pode bloquear o processamento crítico. Outro exemplo é um sistema com LED indicador e log de dados, onde a priorização garante resposta imediata ao LED enquanto o log opera em segundo plano.

Conteúdo🔗

Fundamentos de Tarefas no FreeRTOS🔗

No FreeRTOSIntrodução ao FreeRTOS no STM32Introdução ao FreeRTOS no STM32Descubra como otimizar projetos STM32 usando FreeRTOS com exemplos práticos de tarefas, sincronização, comunicação e gestão de recursos., cada tarefa é uma função independente com:

  • Stack próprio
  • Prioridade (0 = mais baixa, configMAX_PRIORITIES-1 = mais alta)
  • Estado: Running, Ready, Blocked, Suspended

Diagrama de Estados:

stateDiagram-v2 [*] --> Ready Ready --> Running : Scheduler escolhe Running --> Blocked : vTaskDelay()/Semaphore Blocked --> Ready : Evento ocorre Running --> Ready : Time slice expira Running --> Suspended : vTaskSuspend() Suspended --> Ready : vTaskResume()

Pontos-chave:

Criação de Tarefas no STM32🔗

Use xTaskCreate() (alocação dinâmica) ou xTaskCreateStatic() (alocação estática).

Exemplo 1: Leitura de Sensor (STM32CubeIDEConfigurando o ambiente de desenvolvimento para STM32Configurando o ambiente de desenvolvimento para STM32Aprenda a configurar o ambiente para desenvolvimento em STM32 usando STM32CubeIDE, debuggers e ferramentas integradas com dicas de troubleshooting práticas.):

void vSensorTask(void *pvParameters) {
    while(1) {
        HAL_ADC_Start(&hadc1);
        uint32_t value = HAL_ADC_GetValue(&hadc1);
        vTaskDelay(pdMS_TO_TICKS(100)); // Delay de 100ms
    }
}
int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_ADC1_Init();
    xTaskCreate(vSensorTask, "Sensor", 128, NULL, 2, NULL);
    vTaskStartScheduler();
    while(1);
}

Exemplo 2: LED e Log (Prioridades Diferentes):

void TaskLED(void *pvParameters) {
    for(;;) {
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}
void TaskLog(void *pvParameters) {
    for(;;) {
        printf("Log: Sistema operando...\n");
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}
int main(void) {
    xTaskCreate(TaskLED, "LED", 128, NULL, 3, NULL); // Prioridade alta
    xTaskCreate(TaskLog, "Log", 128, NULL, 1, NULL);  // Prioridade baixa
    vTaskStartScheduler();
}

Parâmetros Chave:

ParâmetroDescriçãoExemplo
Stack SizeTamanho em words (32-bit)128
PrioridadeNível (0 a N)2 ou 3

Escolha de Alocação:

  • xTaskCreate: Ideal para sistemas dinâmicos, mas requer gerenciamento de heap.
  • xTaskCreateStatic: Previsível e seguro para sistemas críticos.

Gerenciamento de Prioridades🔗

Prioridades determinam a ordem de execução das tarefasImplementando um sistema multitarefa com STM32 e RTOSImplementando um sistema multitarefa com STM32 e RTOSAprenda a migrar de código bare-metal para multitarefa robusta usando FreeRTOS no STM32. Descubra técnicas avançadas e exemplos práticos..

Regras:

1. Tarefa de maior prioridade sempre executa primeiro.

2. TarefasImplementando um sistema multitarefa com STM32 e RTOSImplementando um sistema multitarefa com STM32 e RTOSAprenda a migrar de código bare-metal para multitarefa robusta usando FreeRTOS no STM32. Descubra técnicas avançadas e exemplos práticos. com mesma prioridade dividem tempo via Round-Robin.

⚠️ Cuidado:

xSemaphore = xSemaphoreCreateMutex();
xSemaphoreTake(xSemaphore, portMAX_DELAY);

Exemplo de Configuração:

#define PRIORIDADE_SENSOR   2
#define PRIORIDADE_WIFI     3
#define PRIORIDADE_ALARME   5
xTaskCreate(vSensorTask, "Sensor", 128, NULL, PRIORIDADE_SENSOR, NULL);
xTaskCreate(vWiFiTask, "WiFi", 256, NULL, PRIORIDADE_WIFI, NULL);

Diagrama de Prioridades:

flowchart TD A[Tarefa Alarme: PRIORIDADE_ALARME] --> CPU B[Tarefa WiFi: PRIORIDADE_WIFI] --> CPU C[Tarefa Sensor: PRIORIDADE_SENSOR] --> CPU

Exemplo Prático 1: Sistema de Controle com 4 Tarefas🔗

Aplicação Industrial:

1. Leitura de Sensor (Prioridade 2)

2. Processamento de Dados (Prioridade 3)

3. Comunicação CAN (Prioridade 4)

4. Interface do Usuário (Prioridade 1)

Sincronização com Semáforo:

SemaphoreHandle_t xDataSemaphore;
void vSensorTask(void *pvParameters) {
    while(1) {
        // Coleta dados
        xSemaphoreGive(xDataSemaphore);
        vTaskDelay(pdMS_TO_TICKS(50));
    }
}
void vProcessTask(void *pvParameters) {
    while(1) {
        if(xSemaphoreTake(xDataSemaphore, pdMS_TO_TICKS(100))) {
            // Processa dados
        }
    }
}

Exemplo Prático 2: Blinking LED com Tarefas🔗

Objetivo: Demonstrar prioridades entre tarefa crítica (LED) e não crítica (Log).

Implementação:

  • Tarefa LED (Prioridade 3): Alterna LED a cada 500ms.
  • Tarefa Log (Prioridade 1): Simula log a cada 1s.

Resultado:

  • O LED pisca sem atrasos, mesmo que o Log esteja em execução.

Debugging e Análise de Desempenho🔗

Ferramentas:

1. FreeRTOSIntrodução ao FreeRTOS no STM32Introdução ao FreeRTOS no STM32Descubra como otimizar projetos STM32 usando FreeRTOS com exemplos práticos de tarefas, sincronização, comunicação e gestão de recursos.+Trace: Visualização gráfica da execução.

2. STM32CubeMonitor: Monitoramento de recursos.

3. vTaskList(): Retorna status via serial:

Task Name   State   Priority    Stack    Num
Sensor      R       2           56       1
WiFi        B       3           112      2

Cálculo de Stack:

$$ \text{Stack Size} = (\text{Variáveis Locais} + \text{Chamadas de Função} \times 8) \times 1.5 $$

Armadilhas Comuns e Soluções🔗

1. Stack Overflow:

  • Sintoma: Crashes aleatórios.
  • Solução: Use uxTaskGetStackHighWaterMark().

2. Tempo de Execução Excessivo:

  • Regra: Inclua vTaskDelay() ou taskYIELD() em loops intensivos.

3. Configuração do Heap:

  • Ajuste configTOTAL_HEAP_SIZE no FreeRTOSConfig.h:
#define configTOTAL_HEAP_SIZE ((size_t)(15 * 1024)) // 15KB para STM32F4

Considerações Finais🔗

Dica Final:

void vCPUTask(void *pvParameters) {
    while(1) {
        // Processamento pesado
        taskYIELD(); // Libera a CPU voluntariamente
    }
}

Recursos Recomendados:

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados