Publicado el 14 de Enero del 2017
1.078 visualizaciones desde el 14 de Enero del 2017
347,5 KB
21 paginas
Creado hace 18a (24/05/2006)
Instrumentación de Tiempo Real
UNIVERSIDAD DE CANTABRIA
Tema 1. Introducción
Tema 2. Recursos de acceso al hardware
Tema 3. Interrupciones
Tema 4. Puertas básicas de entrada/salida (I)
Tema 5. Recursos de temporización de bajo nivel
Tema 6. Multitarea en Ada
Tema 7. Puertas básicas de entrada/salida (II)
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
1
Necesidad de la concurrencia
UNIVERSIDAD DE CANTABRIA
Muchos problemas se expresan de forma natural mediante
varias actividades concurrentes:
• sistemas de control atendiendo a múltiples subsistemas y
eventos
Control de un automóvil
Medida de
Velocidad
C=4 ms.
T=20 ms.
Control de
Frenos ABS
C=10 ms.
T=40 ms.
Control de
Inyección
C=40 ms.
T=80 ms.
C = Tiempo de ejecución
T = Periodo
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
2
Solución no concurrente
UNIVERSIDAD DE CANTABRIA
procedure Control_Automóvil is
begin
loop
Medida_De_Velocidad;
Control_De_Frenos_ABS;
Control_De_Inyección_1;
Espera a que Tiempo = 20;
Medida_De_Velocidad;
Control_De_Inyección_2;
Espera a que Tiempo = 40;
Medida_De_Velocidad;
Control_De_Frenos_ABS;
Control_De_Inyección_3;
Espera a que Tiempo = 60;
Medida_De_Velocidad;
Control_De_Inyección_4;
Espera a que Tiempo = 80;
end loop;
end Control_Automóvil;
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
3
Solución no concurrente:
Problemas y limitaciones
UNIVERSIDAD DE CANTABRIA
Difícil de mantener:
• cualquier cambio en una tarea puede trastocar la
temporización
Difícil de entender
Obliga a partir la tarea Control_De_Inyección en trozos
• en ocasiones no será posible dividir una tarea
Solución más compleja cuando los periodos de las tareas no
son múltiplos
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
4
Concurrencia no soportada por el
lenguaje
UNIVERSIDAD DE CANTABRIA
procedure Control_Automóvil is
procedure Manejador_Tick is
...
begin
loop
if Han_Pasado_20ms then
Medida_De_Velocidad;
Han_Pasado_20ms:= False;
end if;
if Han_Pasado_40ms then
Control_De_Frenos_ABS;
Han_Pasado_40ms:= False;
end if;
if Han_Pasado_80ms then
Control_De_Inyección;
Han_Pasado_80ms:= False;
end if;
end loop;
end Control_Automóvil;
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
5
Concurrencia no soportada por el
lenguaje: problemas
UNIVERSIDAD DE CANTABRIA
procedure Control_Automóvil is
procedure Manejador_Tick is
...
begin
loop
if Han_Pasado_20ms then
Medida_De_Velocidad;
Han_Pasado_20ms:= False;
end if;
if Han_Pasado_40ms then
Control_De_Frenos_ABS;
Han_Pasado_40ms:= False;
end if;
if Han_Pasado_80ms then
Control_De_Inyección;
Han_Pasado_80ms:= False;
end if;
end loop;
end Control_Automóvil;
Medida de
Velocidad
C=4 ms.
T=20 ms.
Control de
Frenos ABS
C=10 ms.
T=40 ms.
Control de
Inyección
C=40 ms.
T=80 ms.
¡¡Pérdida de
plazos!!
20
30
40
50
60
70
80
90
100 110 120
130
140
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
6
Concurrencia en Ada
UNIVERSIDAD DE CANTABRIA
El Ada soporta la programación de procesos concurrentes
mediante las tareas (“tasks”)
Las tareas constan de especificación y cuerpo:
• en el cuerpo define una actividad que se ejecuta
independientemente de las demás tareas
task body Tarea is
declaración de variables;
begin
instrucciones (habitualmente un lazo infinito);
end Tarea;
Las tareas comienzan su ejecución de forma automática
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
7
Concurrencia en Ada
(cont.)
UNIVERSIDAD DE CANTABRIA
procedure Control_del_Automóvil is
task Medida_Velocidad; -- especificación
task body Medida_Velocidad is -- cuerpo
begin
loop
Acciones de Medida_de_Velocidad;
Esperar al próximo periodo (20 ms);
end loop;
end Medida_Velocidad;
task Control_ABS; -- especificación
task body Control_ABS is -- cuerpo
begin
loop
Acciones de Control_ABS;
Esperar al próximo periodo (40 ms);
end loop;
end Control_ABS;
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
8
Concurrencia en Ada
(cont.)
UNIVERSIDAD DE CANTABRIA
task Control_Inyeccion;
task body Control_Inyección is
begin
loop
Acciones de Control de Inyección;
Esperar al próximo periodo (80 ms);
end loop;
end Control_Inyección;
begin
null; -- el programa principal es otra tarea
end Control_del_Automovil;
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
9
UNIVERSIDAD DE CANTABRIA
Concurrencia en Ada:
Ejemplo sencillo
with MaRTE_OS;
with Text_IO; use Text_IO;
procedure Tareas is
task Tarea_1;
task body Tarea_1 is
begin
loop
Put_Line ("Tarea 1");
delay 1.0; -- espera 1 seg
end loop;
end Tarea_1;
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
10
Concurrencia en Ada:
Ejemplo sencillo
(cont.)
UNIVERSIDAD DE CANTABRIA
task Tarea_2;
task body Tarea_2 is
begin
loop
Put_Line ("Tarea 2");
delay 2.0; -- espera 2 seg
end loop;
end Tarea_2;
begin
loop
Put_Line ("Programa principal");
delay 3.0; -- espera 3 seg
end loop;
end Tareas;
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
11
Gestión del Tiempo
UNIVERSIDAD DE CANTABRIA
El Ada permite diversas formas de manejo del tiempo:
• Package Ada.Calendar, con funciones para saber la hora,
fecha, etc.
• Package Ada.Real_Time para acceder a un reloj monótono,
que se incrementa siempre
• Instrucciones delay until y delay, que permiten dormir a
una tarea hasta que transcurra el instante o intervalo
indicado
- mientras una tarea está dormida, otras pueden ejecutar
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
12
Paquete Ada.Calendar
package Ada.Calendar is
UNIVERSIDAD DE CANTABRIA
type Time is private;
subtype Year_Number is Integer range 1901 .. 2099;
subtype Month_Number is Integer range 1 .. 12;
subtype Day_Number is Integer range 1 .. 31;
subtype Day_Duration is Duration range 0.0 .. 86_400.0;
function Clock return Time;
function Year (Date : Time) return Year_Number;
function Month (Date : Time) return Month_Number;
function Day (Date : Time) return Day_Number;
function Seconds (Date : Time) return Day_Duration;
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
13
Paquete Ada.Calendar
(cont.)
UNIVERSIDAD DE CANTABRIA
function Time_Of
(Year : Year_Number;
Month : Month_Number;
Day : Day_Number;
Seconds : Day_Duration := 0.0)
return Time;
function "+" (Left : Time; Right : Duration)
return Time;
function "+" (Left : Duration; Right : Time)
return Time;
function "-" (Left : Time; Right : Duration)
return Time;
function "-" (Left : Time; Right : Time)
return Duration;
...
end Ada.Calendar;
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
14
Paquete Ada.Calendar
Ejemplo: mide intervalo
with MaRTE_OS;
with Ada.Calendar, Ada.Text_IO;
use Ada.Calendar, Ada.Text_IO;
procedure Mide_Dif_Tiempo is
T_Ini, T_Fin : Time;
Diferencia : Duration;
UNIVERSIDAD DE CANTABRIA
begin
T_Ini := Clock; -- lee hora de inicio
... -- Código bajo medida
T_Fin := Clock; -- lee hora de finalización
Diferencia := T_Fin - T_Ini; -- calcula la diferencia
Put_Line("Diferencia :" & Duration'Image (Diferencia));
end Mide_Dif_Tiempo;
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
15
Paquete Ada.Calendar
Ejemplo: lee fecha y hora
with MaRTE_OS;
with Ada.Calendar, Ada.Text_IO;
use Ada.Calendar, Ada.Text_IO;
UNIVERSIDAD DE CANTABRIA
procedure Muestra_Dia_Y_Hora is
Instante : Time := Clock;
Hora : Integer := Integer (Seconds (Instante)) /
3600;
Minuto : Integer := (Integer (Seconds (Instante)) -
Hora*3600) / 60;
begin
Put_Line("Hoy es " & Integer'Image(Day(Instante)) &
" del " & Integer'Image(Month(Instante)) &
" de " & Integer'Image(Year(Instante)));
Put_Line("La hora es : " & Integer'Image(Hora) &
":" & Integer'Image(Minuto));
end Muestra_Dia_Y_Hora;
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
16
Tareas periódicas
Instrucción "delay until"
UNIVERSIDAD DE CANTABRIA
Con la instrucción delay until es posible hacer tareas
periódicas:
task body Periodica is
Periodo : constant Duration := 0.050; -- en segundos
Proximo_Periodo : Time := Clock;
begin
loop
-- hace cosas
...
Proximo_Periodo := Proximo_Periodo + Periodo;
delay until Proximo_Periodo;
end loop;
end Periodica;
GRUPO DE COMPUTADORES Y TIEMPO REAL
DPTO. DE ELECTRÓNICA Y COMPUTADORES
© Mario Aldea Rivas
2/Mar/06
17
Tareas periódicas
Instrucción "delay"
UNIVERSIDAD DE CANTABRIA
También se puede hacer lo mismo (pero mal) con la orden
delay:
task body Periodica is
Periodo : constant Duration := 0.050; -- en segundos
Proximo_Periodo : Time := Clock;
begin
loop
-- hace cosas
P
Comentarios de: Instrumentación de Tiempo Real - Tema 6. Multitarea en Ada (0)
No hay comentarios