Mecanismos de Planificación e Interrupciones de Tick en FreeRTOS

  1. Fundamentos del Planificador en FreeRTOS

FreeRTOS gestiona la ejecución de tareas mediante un planificador (Scheduler) que determina cuándo cambiar entre tareas y cuál ejecutar, asegurando cumplimiento de prioridades y uso eficiente de recursos. Funciones clave:

1.1. Operación Básica del Planificador

  • Cambio de contexot: Almacena registros y estado de la tarea actual, restaura el estado de la nueva tarea
  • Seleccción de tareas: Elige la próxima tarea ejecutable basado en prioridad y estado

Disparadores de planificación:

  • Llmaadas explícitas (taskYIELD())
  • Interrupciones del temporizador del sistema
  • Eventos en manejadores de interrupción (ISR)

1.2. Estrategias de Planificación

Apropiativa (Preemptive)

Predeterminada en FreeRTOS. Tareas de mayor prioridad interrumpen inmediatamente las de menor prioridad.

void TareaUrgente(void *param) {
  while(1) {
    procesarEventosCriticos();
    vTaskDelay(50); // Libera CPU temporalmente
  }
}

void TareaSecundaria(void *param) {
  while(1) {
    ejecutarProcesosNoCriticos();
    vTaskDelay(500);
  }
}

Cooperativa (Cooperative)

Requiere que las tareas liberen explícitamente el control mediante taskYIELD().

1.3. Estados de Tareas

Estado Descripción
Preparada (Ready) Lista para ejecución
En ejecución (Running) Usando actualmente la CPU
Bloqueada (Blocked) Esperando evento o recurso
Suspendida (Suspended) Inactiva hasta reanudación explícita

1.4. Implementación Interna

Mecanismo de Cambio de Contexto:

  1. Generación de interrupción PendSV

  2. Almacenamiento de registros en la pila actual

  3. Selección de nueva tarea mediante vTaskSwitchContext()

  4. Restauración de registros desde la pila de destino

  5. Funcionamiento de la Interrupción de Tick


Proporciona la base temporal del sistema mediante interrupciones periódicas configuradas en configTICK_RATE_HZ.

2.1. Funciones Principales

  • Mantener contador global de ticks (xTickCount)
  • Gestionar tiempos de espera en tareas bloqueadas
  • Activar temporizadores software
  • Habilitar alternancia entre tareas de igual prioridad

2.2. Configuración Hardware

#define configTICK_RATE_HZ 1000  // 1000Hz = 1ms por tick

Inicializado durante vTaskStartScheduler() usando SysTick o temporizadores hardware.

2.3. Procesamiento de Interrupciones

void SysTick_Handler(void) {
  portENTER_CRITICAL();
  if(xTaskIncrementTick() != pdFALSE) {
    portYIELD_FROM_ISR(pdTRUE);
  }
  portEXIT_CRITICAL();
}

2.4. Ejemplo de Gestión de Tareas

void TareaPeriodica(void *param) {
  const TickType_t intervalo = pdMS_TO_TICKS(20);
  while(1) {
    realizarLecturaSensores();
    vTaskDelay(intervalo);
  }
}

Sin vTaskDelay(), tareas de mayor prioridad pueden monopolizar la CPU.

Etiquetas: FreeRTOS planificacion InterrupciónTick CambioContexto TareasRTOS

Publicado el 8-5 19:18