- 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:
-
Generación de interrupción PendSV
-
Almacenamiento de registros en la pila actual
-
Selección de nueva tarea mediante
vTaskSwitchContext() -
Restauración de registros desde la pila de destino
-
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.