En aquest estudi de cas, explorarem com utilitzar Ada per desenvolupar un sistema empotrat. Els sistemes empotrats són dispositius de computació especialitzats que formen part d'un sistema més gran i estan dissenyats per realitzar funcions específiques. Aquests sistemes es troben en una àmplia varietat d'aplicacions, des de dispositius mèdics fins a sistemes de control industrial.
Objectius de l'Estudi de Cas
- Comprendre els requisits d'un sistema empotrat.
 - Aprendre a dissenyar i implementar un sistema empotrat utilitzant Ada.
 - Explorar les tècniques de programació en temps real i concurrència en el context dels sistemes empotrats.
 - Implementar un projecte complet que inclogui la gestió de tasques, la comunicació entre components i la gestió d'entrades/sortides.
 
Requisits del Sistema Empotrat
Per a aquest estudi de cas, desenvoluparem un sistema de control per a un robot mòbil senzill. El sistema ha de complir els següents requisits:
- Control de Moviment: El robot ha de poder moure's cap endavant, cap enrere, girar a l'esquerra i a la dreta.
 - Sensors: El robot ha de poder llegir dades de sensors per evitar obstacles.
 - Comunicació: El robot ha de poder comunicar-se amb un ordinador central per rebre instruccions i enviar dades de sensors.
 - Temps Real: El sistema ha de respondre a les instruccions i als esdeveniments dels sensors en temps real.
 
Disseny del Sistema
Arquitectura del Sistema
El sistema es compon de diversos components que treballen junts per complir els requisits. Aquests components inclouen:
- Controlador de Moviment: Gestiona els motors del robot per controlar el moviment.
 - Gestor de Sensors: Llegeix les dades dels sensors i detecta obstacles.
 - Mòdul de Comunicació: Gestiona la comunicació amb l'ordinador central.
 - Gestor de Tasques: Coordina les diferents tasques del sistema per assegurar una operació en temps real.
 
Diagrama de Blocs del Sistema
+-------------------+
| Ordinador Central |
+---------+---------+
          |
          v
+---------+---------+
| Mòdul de Comunicació |
+---------+---------+
          |
          v
+---------+---------+
| Gestor de Tasques |
+---------+---------+
|         |         |
v         v         v
+---------+---------+---------+
| Controlador de Moviment | Gestor de Sensors |
+--------------------------+------------------+Implementació en Ada
Controlador de Moviment
El controlador de moviment gestiona els motors del robot. Utilitzarem tasques per controlar els motors de manera concurrent.
task type Motor_Controller is
    entry Move_Forward;
    entry Move_Backward;
    entry Turn_Left;
    entry Turn_Right;
end Motor_Controller;
task body Motor_Controller is
begin
    loop
        select
            when Move_Forward'Count > 0 =>
                -- Codi per moure el robot cap endavant
                null;
            when Move_Backward'Count > 0 =>
                -- Codi per moure el robot cap enrere
                null;
            when Turn_Left'Count > 0 =>
                -- Codi per girar el robot a l'esquerra
                null;
            when Turn_Right'Count > 0 =>
                -- Codi per girar el robot a la dreta
                null;
        end select;
    end loop;
end Motor_Controller;Gestor de Sensors
El gestor de sensors llegeix les dades dels sensors i detecta obstacles.
task type Sensor_Manager is
    entry Read_Sensors;
    entry Detect_Obstacles;
end Sensor_Manager;
task body Sensor_Manager is
begin
    loop
        select
            when Read_Sensors'Count > 0 =>
                -- Codi per llegir dades dels sensors
                null;
            when Detect_Obstacles'Count > 0 =>
                -- Codi per detectar obstacles
                null;
        end select;
    end loop;
end Sensor_Manager;Mòdul de Comunicació
El mòdul de comunicació gestiona la comunicació amb l'ordinador central.
task type Communication_Module is
    entry Send_Data;
    entry Receive_Commands;
end Communication_Module;
task body Communication_Module is
begin
    loop
        select
            when Send_Data'Count > 0 =>
                -- Codi per enviar dades a l'ordinador central
                null;
            when Receive_Commands'Count > 0 =>
                -- Codi per rebre instruccions de l'ordinador central
                null;
        end select;
    end loop;
end Communication_Module;Gestor de Tasques
El gestor de tasques coordina les diferents tasques del sistema.
task body Task_Manager is
    Motor : Motor_Controller;
    Sensor : Sensor_Manager;
    Comm : Communication_Module;
begin
    loop
        -- Codi per coordinar les tasques
        -- Per exemple, llegir instruccions de l'ordinador central i enviar-les al controlador de moviment
        null;
    end loop;
end Task_Manager;Exercicis Pràctics
- Implementar el Control de Moviment: Completa el codi del controlador de moviment per controlar els motors del robot.
 - Lectura de Sensors: Implementa el codi per llegir dades dels sensors i detectar obstacles.
 - Comunicació: Implementa el codi per gestionar la comunicació amb l'ordinador central.
 - Coordinació de Tasques: Completa el codi del gestor de tasques per coordinar les diferents tasques del sistema.
 
Solucions
Solució 1: Control de Moviment
task body Motor_Controller is
begin
    loop
        select
            when Move_Forward'Count > 0 =>
                -- Codi per moure el robot cap endavant
                Put_Line("Moving Forward");
                delay 1.0;
            when Move_Backward'Count > 0 =>
                -- Codi per moure el robot cap enrere
                Put_Line("Moving Backward");
                delay 1.0;
            when Turn_Left'Count > 0 =>
                -- Codi per girar el robot a l'esquerra
                Put_Line("Turning Left");
                delay 1.0;
            when Turn_Right'Count > 0 =>
                -- Codi per girar el robot a la dreta
                Put_Line("Turning Right");
                delay 1.0;
        end select;
    end loop;
end Motor_Controller;Solució 2: Lectura de Sensors
task body Sensor_Manager is
begin
    loop
        select
            when Read_Sensors'Count > 0 =>
                -- Codi per llegir dades dels sensors
                Put_Line("Reading Sensors");
                delay 0.5;
            when Detect_Obstacles'Count > 0 =>
                -- Codi per detectar obstacles
                Put_Line("Detecting Obstacles");
                delay 0.5;
        end select;
    end loop;
end Sensor_Manager;Solució 3: Comunicació
task body Communication_Module is
begin
    loop
        select
            when Send_Data'Count > 0 =>
                -- Codi per enviar dades a l'ordinador central
                Put_Line("Sending Data");
                delay 0.2;
            when Receive_Commands'Count > 0 =>
                -- Codi per rebre instruccions de l'ordinador central
                Put_Line("Receiving Commands");
                delay 0.2;
        end select;
    end loop;
end Communication_Module;Solució 4: Coordinació de Tasques
task body Task_Manager is
    Motor : Motor_Controller;
    Sensor : Sensor_Manager;
    Comm : Communication_Module;
begin
    loop
        -- Codi per coordinar les tasques
        -- Per exemple, llegir instruccions de l'ordinador central i enviar-les al controlador de moviment
        select
            when Comm.Receive_Commands'Count > 0 =>
                -- Simulació de rebre una comanda de moviment
                Motor.Move_Forward;
        end select;
        delay 1.0;
    end loop;
end Task_Manager;Conclusió
En aquest estudi de cas, hem explorat com utilitzar Ada per desenvolupar un sistema empotrat. Hem après a dissenyar i implementar un sistema de control per a un robot mòbil, utilitzant tècniques de programació en temps real i concurrència. Aquest estudi de cas proporciona una base sòlida per a la creació de sistemes empotrats més complexos utilitzant Ada.
Curs de Programació en Ada
Mòdul 1: Introducció a Ada
Mòdul 2: Conceptes Bàsics
- Variables i Tipus de Dades
 - Operadors i Expressions
 - Estructures de Control
 - Bucles en Ada
 - Subprogrames: Procediments i Funcions
 
Mòdul 3: Tipus de Dades Avançats
Mòdul 4: Programació Modular
Mòdul 5: Concurrència i Programació en Temps Real
Mòdul 6: Temes Avançats
Mòdul 7: Millors Pràctiques i Optimització
- Estil de Codi i Millors Pràctiques
 - Depuració i Proves
 - Optimització del Rendiment
 - Consideracions de Seguretat
 
