Arquitectura de Tareas FreeRTOS¶
El firmware de LAMULA DRx se organiza en una arquitectura de múltiples tareas sobre el núcleo de FreeRTOS v10.4. Cada tarea tiene asignada una responsabilidad específica, un tamaño de pila (stack) ajustado y una prioridad explícita para garantizar la atención inmediata de los eventos del radar.
Tabla Resumen de Tareas FreeRTOS¶
| Nombre Tarea | Función C / Archivo | Prioridad | Stack (Palabras) | Tipo de Activación | Descripción Principal |
|---|---|---|---|---|---|
main_thrd |
main_thread( main.c) |
1 (DEFAULT_THREAD_PRIO) |
1024 | Efímera (Arranque) | Inicializa hardware (Timing, Estímulo, Rayos, AFC), arranca tareas y se auto-elimina (vTaskDelete). |
NW_THRD |
network_thread( main.c) |
1 (DEFAULT_THREAD_PRIO) |
1024 | Efímera (Red) | Configura la interfaz de red Ethernet (192.168.1.10), lanza xemacif_input_thread y crea drx_transport. |
xemacif_input |
xemacif_input_thread(lwIP BSP) |
1 (DEFAULT_THREAD_PRIO) |
1024 | Por Evento (Rx EMAC) | Procesa las tramas de red Ethernet de bajo nivel desde el driver de Xilinx (xemacps). |
drx_status |
DrxStatusTask( drx_status_task.c) |
2 (DRX_STATUS_TASK_PRIO) |
1024 | Periódica (1000 ms) | Lee y limpia (W1C) los registros de diagnóstico sticky AXI-Lite, acumula contadores BITE y formatea mensajes status. |
drx_ray |
ray_task( drx_ray.c) |
2 (DRX_RAY_TASK_PRIORITY) |
2048 | Por Evento (g_sem) |
Despierta con la ISR del AXI DMA S2MM, vacía el anillo de descriptores, valida la cabecera en banda y entrega el rayo. |
drx_transport |
DrxTransportTask( drx_transport.c) |
2 (DRX_TRANSPORT_PRIO) |
2048 | Bloqueante (recv) |
Gestiona el socket servidor TCP en el puerto 5000, acepta conexiones del DSP y parsea tramas de control entrantes. |
drx_tx |
DrxTxTask( drx_transport.c) |
2 (DRX_TRANSPORT_PRIO) |
2048 | Por Evento (g_listos) |
Transmite de forma asíncrona sobre el socket TCP las tramas de rayos y estado preparadas en la cola de salida. |
Jerarquía de Prioridades y Modelo de Planificación¶
FreeRTOS opera en modo preemptevolutivo (configUSE_PREEMPTION = 1) con un tick de reloj de 1000 Hz (configTICK_RATE_HZ = 1000).
gantt
title Cronograma Ilustrativo de Ejecución de Tareas en FreeRTOS
dateFormat SS
axisFormat %S s
section ISR DMA
Interrupción s2mm_introut : active, isr1, 00, 01
section Prioridad 2
drx_ray (Procesamiento Rayo) : crit, ray1, after isr1, 03s
drx_tx (Transmisión TCP) : active, tx1, after ray1, 02s
drx_status (Sondeo BITE 1s) : status1, 06, 08s
section Prioridad 1
xemacif_input / lwIP IP : net1, 08, 10s
Principios de asignación de prioridades¶
- Atención Prioritaria al Dato Radar (Prioridad 2):
- La tarea
drx_raytiene la prioridad más alta del sistema junto condrx_tx,drx_transportydrx_status. Al ser liberada por la ISR mediante el semáforog_sem, desaloja de inmediato a las tareas de menor prioridad para evitar desbordamiento (overrun) en el anillo de descriptores de la PL. - Ceder la CPU Eficientemente:
- La tarea
drx_rayúnicamente se ejecuta cuando hay rayos listos en el anillo; el resto del tiempo se mantiene bloqueada enxSemaphoreTake(g_sem, portMAX_DELAY). - La tarea
drx_transportse mantiene bloqueada en llamadas alwip_recv()esperando comandos de control. - La tarea
drx_txpermanece bloqueada en la cola de FreeRTOSxQueueReceive(g_listos, ..., portMAX_DELAY).
Descripción Detallada de Tareas Clave¶
Tarea de Recepción de Rayos (drx_ray)¶
- Archivo:
fw/src/app/drx_ray.c. - Función:
static void ray_task(void *arg). - Bucle principal:
for (;;) { if (xSemaphoreTake(g_sem, portMAX_DELAY) == pdTRUE) { reap(); } } - Responsabilidad: La función
reap()consulta al AXI DMA medianteXAxiDma_BdRingFromHw(). Para cada descriptor completado, invalida la línea de caché de la CPU, invoca adeliver()para validar las 4 palabras de cabecera en banda (magic0x52415931,trig_count,ray_index), invoca el callbackg_sink(que copia los datos hacia los slots de transmisión) y re-encola el descriptor en la PL mediantesubmit_buffer().
Tarea de Monitoreo de Estado (drx_status)¶
- Archivo:
fw/src/app/drx_status_task.c. - Función:
static void DrxStatusTask(void *pvParameters). - Periodicidad: Se activa cada 1000 ms ejecutando
vTaskDelay(pdMS_TO_TICKS(1000)). - Responsabilidad: Lee los registros
STATUS,OVERFLOW,GATE_TRUNCATEDyTIMING_STATUS. Debido a que la lectura de estos registros borra las banderas en la PL (semántica W1C), esta tarea es el único consumidor autorizado en todo el firmware para leerlos y limpiarlos. Acumula los eventos BITE en la estructuraDrxStatusInputsy envía periódicamente el mensajestatusal DSP.
Tarea de Transporte Servidor TCP (drx_transport)¶
- Archivo:
fw/src/app/drx_transport.c. - Función:
static void DrxTransportTask(void *pvParameters). - Responsabilidad: Abre un socket en el puerto
DRX_DSP_TCP_PORT(5000) y ejecutalwip_accept(). Al recibir una conexión, se bloquea enlwip_recv()y pasa el stream de bytes al parserdrx_contract_io.