En este estudio de caso, desarrollaremos una aplicación en tiempo real utilizando Ada. Este ejercicio integrará varios conceptos aprendidos en los módulos anteriores, especialmente aquellos relacionados con la concurrencia, la programación en tiempo real y la sincronización.
Objetivos del Estudio de Caso
- Comprender los requisitos de una aplicación en tiempo real.
- Implementar tareas concurrentes en Ada.
- Utilizar objetos protegidos para la sincronización.
- Manejar la comunicación entre tareas.
- Asegurar el cumplimiento de los plazos en un sistema en tiempo real.
Descripción del Proyecto
Desarrollaremos un sistema de control de tráfico aéreo simplificado. Este sistema gestionará múltiples aviones que se aproximan a un aeropuerto, asegurando que no haya colisiones y que los aviones aterricen de manera segura y ordenada.
Requisitos del Sistema
-
Gestión de Aviones:
- Cada avión se representará como una tarea en Ada.
- Los aviones deben comunicarse con la torre de control para recibir instrucciones de aterrizaje.
-
Torre de Control:
- La torre de control será responsable de coordinar los aterrizajes.
- Utilizará objetos protegidos para gestionar la cola de aterrizaje y la pista.
-
Sincronización y Comunicación:
- Las tareas de los aviones deben sincronizarse con la torre de control.
- La comunicación debe ser eficiente y garantizar que no haya conflictos en la pista.
Implementación
Paso 1: Definición de Tipos y Constantes
Primero, definimos los tipos y constantes necesarios para nuestro sistema.
package Traffic_Control is type Plane_ID is new Integer; Max_Planes : constant Integer := 10; end Traffic_Control;
Paso 2: Definición de la Torre de Control
La torre de control se implementará como un objeto protegido que gestionará la cola de aterrizaje y la pista.
package body Traffic_Control is protected type Control_Tower is procedure Request_Landing (Plane : Plane_ID); procedure Land_Plane (Plane : Plane_ID); entry Get_Next_Plane (Plane : out Plane_ID); private Queue : array (1 .. Max_Planes) of Plane_ID; Queue_Length : Integer := 0; Runway_Free : Boolean := True; end Control_Tower; protected body Control_Tower is procedure Request_Landing (Plane : Plane_ID) is begin if Queue_Length < Max_Planes then Queue_Length := Queue_Length + 1; Queue(Queue_Length) := Plane; end if; end Request_Landing; procedure Land_Plane (Plane : Plane_ID) is begin Runway_Free := False; -- Simular el tiempo de aterrizaje delay 5.0; Runway_Free := True; end Land_Plane; entry Get_Next_Plane (Plane : out Plane_ID) when Runway_Free and then Queue_Length > 0 is begin Plane := Queue(1); for I in 1 .. Queue_Length - 1 loop Queue(I) := Queue(I + 1); end loop; Queue_Length := Queue_Length - 1; end Get_Next_Plane; end Control_Tower; end Traffic_Control;
Paso 3: Definición de las Tareas de los Aviones
Cada avión se implementará como una tarea que solicitará permiso para aterrizar y esperará su turno.
with Ada.Text_IO; use Ada.Text_IO; with Traffic_Control; procedure Air_Traffic_Control is package TC renames Traffic_Control; task type Plane_Task (ID : TC.Plane_ID) is entry Start; end Plane_Task; task body Plane_Task is begin accept Start; Put_Line ("Plane " & Integer'Image(ID) & " requesting landing."); TC.Control_Tower.Request_Landing(ID); TC.Control_Tower.Get_Next_Plane(ID); Put_Line ("Plane " & Integer'Image(ID) & " landing."); TC.Control_Tower.Land_Plane(ID); Put_Line ("Plane " & Integer'Image(ID) & " has landed."); end Plane_Task; Planes : array (1 .. TC.Max_Planes) of Plane_Task; begin for I in 1 .. TC.Max_Planes loop Planes(I).Start; end loop; end Air_Traffic_Control;
Paso 4: Ejecución y Pruebas
Compilamos y ejecutamos el programa para observar cómo los aviones solicitan aterrizaje, esperan su turno y aterrizan de manera ordenada.
Salida Esperada
Plane 1 requesting landing. Plane 2 requesting landing. Plane 3 requesting landing. Plane 4 requesting landing. Plane 5 requesting landing. Plane 6 requesting landing. Plane 7 requesting landing. Plane 8 requesting landing. Plane 9 requesting landing. Plane 10 requesting landing. Plane 1 landing. Plane 1 has landed. Plane 2 landing. Plane 2 has landed. ...
Conclusión
En este estudio de caso, hemos desarrollado una aplicación en tiempo real utilizando Ada. Hemos implementado tareas concurrentes para representar aviones y un objeto protegido para gestionar la torre de control. Este ejercicio ha demostrado cómo Ada facilita la programación en tiempo real y la sincronización entre tareas.
Resumen de Conceptos Clave
- Tareas y Concurrencia: Utilizamos tareas para representar aviones que operan de manera concurrente.
- Objetos Protegidos: Implementamos la torre de control como un objeto protegido para gestionar la sincronización y la comunicación.
- Sincronización y Comunicación: Aseguramos que los aviones aterricen de manera ordenada utilizando entradas protegidas y procedimientos.
Este estudio de caso prepara al estudiante para abordar aplicaciones más complejas en tiempo real y sistemas concurrentes, consolidando los conocimientos adquiridos en los módulos anteriores.
Curso de Programación en Ada
Módulo 1: Introducción a Ada
Módulo 2: Conceptos Básicos
- Variables y Tipos de Datos
- Operadores y Expresiones
- Estructuras de Control
- Bucles en Ada
- Subprogramas: Procedimientos y Funciones
Módulo 3: Tipos de Datos Avanzados
Módulo 4: Programación Modular
Módulo 5: Concurrencia y Programación en Tiempo Real
Módulo 6: Temas Avanzados
Módulo 7: Mejores Prácticas y Optimización
- Estilo de Código y Mejores Prácticas
- Depuración y Pruebas
- Optimización del Rendimiento
- Consideraciones de Seguridad