Lenguajes de Programación de Sistemas de Tiempo Real PDF - GII-ROB 2025
Document Details

Uploaded by HeartwarmingWillow308
UPV
2025
Tags
Summary
Este documento de GII-ROB 2025 explora los lenguajes de programación para sistemas de tiempo real. Aborda conceptos como la programación concurrente y los requisitos de estos sistemas, mencionando lenguajes como C, C++, y Ada. Explora también lenguajes secuenciales y concurrentes.
Full Transcript
Sistemas de Tiempo Real Lenguajes de programación GII-ROB 2025 Sistemas de tiempo real Contextualización...
Sistemas de Tiempo Real Lenguajes de programación GII-ROB 2025 Sistemas de tiempo real Contextualización UT02 Lenguajes de programación 1. Programación secuencial UT03 Ada: Tipos UT04 Ada: Estructuras de control UT05 Ada secuencial: Paquetes UT01. Introducción 2. Programación concurrente UT06 Tareas UT07 Objetos protegidos UT08 Comunicación: Cita UT09 Tareas periódica y aperiódicas 3. Programación tiempo real UT10 Inversión prioridades UT11 Pragmas de programación UT12 Manejadores de disposiHvos UT13 Planificación 4. Análisis de str UT14 Análisis de planificación Sistemas de tiempo real 3 Indice Requisitos Lenguajes de programación lenguajes secuenciales lenguajes concurrentes Lenguaje C vs Ada Soporte de ejecución Sistemas de tiempo real Lenguajes TR ¿Qué lenguaje de programación elegir para implementar un STR? ¿Hay alguno más adecuado que otro? Lenguajes Lenguajes Lenguajes Ensambladores Secuenciales Concurrentes Sistemas de tiempo real 5 Requisitos en sistemas de tiempo real Modelar el paralelismo de entorno è concurrencia Gestionar y controlar el paso del tiempo de forma adecuada èRelojes y temporizadores, manejadores de tiempos: de ejecución, de actividad, … Acceso a bajo nivel è Manejadores de interrupciones, definición de tipos con registros de dispositivos, manejadores de dispositivos Robusto y fiable è Manejadores de errores (excepciones) Modelo de objetos è Tipos de datos orientados a objetos Compilación separada, transportable y eficiente Sistemas de tiempo real 6 Lenguajes para Sistemas Críticos y de Tiempo Real Aunque existen muchos lenguajes que se han utilizado, los más usados son C, C++ y Ada. C: aunque es un lenguaje secuencial que no ofrece muchas de las características deseables (concurrencia, modelo de objetos, robustez, etc.), su eficiencia y proximidad a los s.o. lo ha hecho popular. C++: Añade a C un modelo de objetos y concurrencia. No tiene abstracciones propias de tiempo real. Ada: Proporciona las características deseables. Es un lenguaje desarrollado para sistemas empotrados de tiempo real. Sus distintas versiones (83, 95, 2005, 2012, 2022) han mejorado sus abstracciones para el desarrollo de aplicaciones de tiempo real. Ada 2022 es la versión actual Model-Based Design.Generación de código a partir de herramientas de modelado, e.g. Matlab Simulink. Sistemas de tiempo real Lenguajes secuenciales Un único flujo de control (thread o tarea). Estructura clara Fáciles de analizar y depurar Sistemas de tiempo real Lenguajes secuenciales Ejemplo en C void main(void) { int i; for (i = 0; i < 100000; i++) { #include contador = incrementar(contador); #include } static int contador; printf("Valor del contador final: %d\n", contador); int incrementar (int x) { //Postcondicion contador = 100000 int tmp; if (contador == 100000) { tmp = x; printf("Resultado correcto\n"); tmp = tmp + 1; } else { return tmp; printf("Resultado incorrecto\n"); } } } Sistemas de tiempo real Lenguajes secuenciales Ejemplo en Ada /-- Ejemplo en Ada begin -- Contador: realiza un incremento de una canTdad contador := 0; -- determinada de una variable global --Precondicion contador = 0 with GNAT.IO; use GNAT.IO; for i in 1..100000 loop contador := incrementar(contador); procedure main is end loop; contador: integer; Put("Valor del contador final: "); Put(contador); new_line; func5on incrementar (x:integer) return integer is --Postcondicion contador = 100000 tmp: integer; if (contador = 100000) then begin Put_line("Resultado correcto"); tmp := x; else tmp := tmp + 1; Put_line("Resultado incorrecto"); return tmp; end if; end incrementar; end main; Sistemas de tiempo real Lenguajes concurrentes Permite definir varios flujos de control Cada flujo (thread o tarea) se ejecuta de forma concurrente Se requiere planificación Se requieren mecanismos de comunicación sincronización Problemas para la validación y depuración Requiere un soporte de ejecución (Runtime Support RTS) Sistemas de tiempo real Lenguaje secuencial Depende del S.O. (API) API Abstracciones: - Procesos - Threads - Comunicación - Sincronización - Ficheros - Excepciones S.O. Sistemas de tiempo real Lenguaje secuencial Tareas en C: #include int main (int argc, char *argv[]) #include { #define NumeroTareas 5 int t; static int contador; pthread_t threads[NumeroTareas]; static int terminados = 0; static int empezar = 0; for(t=0; tpos (no interpreta las intenciones del programador) Tipificación nominal, no estructural Detección de errores en >empo de compilación Los programas deben dar información precisa al compilador sobre lo que pretenden. Solo así puede el compilador ayudar a conseguirlo Sistemas de tiempo real 22 Lenguaje Ada Características: Pensado para sistemas grandes y empotrados Distintas versiones: Ada83, Ada95, Ada2005, Ada 2012, Ada 2022 La norma ISO define Núcleo común a todas las implementaciones Nula ambigüedad, no hay comportamientos no definidos Anexos: Sist. TR Sist Distribuidos Programación de sistemas Sist. de información Cálculo numérico Sistemas de tiempo real Programa ejemplo with Ada.Text_IO; Cláusulas de with Ada.Integer_Text_IO; contexto with Ada.Float_Text_IO; procedure Average is Especificación -- Display the average of two numbers entered by the user del programa A : Integer; B : Integer; M : Float; Comentario begin Ada.Text_IO.Put_Line (Item => "Enter two integers."); Zona Ada.Integer_Text_IO.Get (Item => A); declara;va Ada.Integer_Text_IO.Get (Item => B); M := Float (A + B) / 2.0; Inicio de la Ada.Text_IO.New_Line; secuencia de Ada.Text_IO.Put (Item => "The average of your integers is "); Ada.Float_Text_IO.Put (Item => M, instrucciones Fore => 1, Aft => 2, Exp => 0); Fin del Ada.Text_IO.New_Line; end Average; programa Sistemas de tiempo real 24 Aspectos sintácBcos: Nombres Una secuencia de letras y dígitos, empezando por una letra. Se puede usar ”_” para separar partes del nombre. Nada más. Average, Water_Level, Temperature, Sensor_2, … Además, deberían ser indica[vos de lo que denotan Lo que hace un programa, lo que representa una variable, … El compilador no dis[ngue mayúsculas de minúsculas P.ej, temp_inside, Temp_inside,... son el mismo nombre Las palabras reservadas quedan excluidas (RM-2.9)* (*) Ada Reference Manual, Sec@on 2.9 Sistemas de tiempo real 25 Ada Ravenscar El perfil de Ravenscar es un subconjunto del lenguaje de programación Ada especialmente pensado para los sistemas de tiempo real. Impone ciertas restricciones a la parte concurrente del lenguaje para poder realizar análisis temporales y permitir una implementación eficiente del núcleo de ejecución. Permite: Conseguir un modelo de ejecución concurrente determinista, de tal forma que sea apto para sistemas de tiempo real estrictos. Permitir una implementación pequeña y eficiente, y que no obligue a introducir mucha sobrecarga para que las tareas puedan responder a plazos muy cortos. Sistemas de tiempo real 26 Lenguaje C vs Ada Notación segura: asignación / comparación C: if (theSignal == 1) { open_gates(...); start_train(...); } Ada: if (theSignal = Clear) then OpenGates(....); StartTrain(...); end if; Sistemas de tiempo real Lenguaje C vs Ada Notación segura: asignación / comparación C: if (theSignal == 1) if (theSignal = 1) { { open_gates(...); open_gates(...); start_train(...); start_train(...); } } Ada: if (theSignal = Clear) then if theSignal := Clear then --ilegal OpenGates(....); StartTrain(...); end if; Sistemas de tiempo real Lenguaje C vs Ada Notación segura: bloques C: if (theSignal == 1) ; if (theSignal == 1) ; { { open_gates(...); open_gates(...); start_train(...); start_train(...); } } Ada: if (theSignal = Clear) then ; if theSignal = Clear then ; --ilegal OpenGates(....); OpenGates(....); StartTrain(...); StartTrain(...); end if; end if; Sistemas de tiempo real Lenguaje C vs Ada Arrays C: int vector; int index = 0; …. index = 150; vector[index] = 100; ….. Ada: type Vector is array[1..100] of Integer; miVector : Vector; indice : integer; begin..... indice := 150; miVector[indice] := 100; -- si el indice está fuera de rango => à CONSTRAINT_ERROR Sistemas de tiempo real Lenguaje C vs Ada Concurrencia Ada ofrece su modelo de concurrencia Tareas, comunicación/sincronización, objetos protegidos, manejo de excepciones, ……. task Periodic_Task is pragma Priority(10); end Periodic_Task; task body Periodic_Task is Periodo : Time_Span; Siguiente : Time; begin Siguiente := Clock; loop -- Acciones Siguiente := Siguiente + Periodo; delay unPl Siguiente; end loop; end Periodic_Task; Sistemas de tiempo real Lenguaje C vs Ada Concurrencia C no [ene modelo de concurrencia Puede usar el ofrecido por el S.O. para generar tareas internas El compilador de C no [ene la semán[ca de las llamadas Sistemas de tiempo real Lenguaje C vs Ada Lenguaje C Periodo: Time_Span; task Control1 is main() pragma Priority(10); { end Control1; time_t Periodo; pthread_t Tarea1; task body Control1 is Next : Time; void control1(void) { begin Next := Clock; time_t next_time; loop long diff; -- Acciones next_time = get_time; Next := Next + Periodo; while(1) { delay un5l Next; -- acciones end loop; next_time = next_time + Periodo; end Control1; diff = next_time – get_time; usleep (diff); } pthread_exit(0); } pthread_create( &Tarea1, NULL, (void*)& control1, NULL); sleep (65); } Sistemas de tiempo real Lenguaje C vs Ada Lenguaje C C/POSIX Creación de tareas pthread_t Tarea1; void control1(args) { ……. } pthread_create( &Tarea1, NULL, (void*)& control1, &args); Varias tareas de la misma característica pthread_t Tarea1[Max]; for (i = 1; i < N; i++) { pthread_create( &Tarea1[i], NULL, (void*)& control1, &args); } Sistemas de tiempo real Lenguaje C vs Ada Lenguaje C C/ARINC653 Creación de tareas PROCESS_ATTRIBUTE_TYPE proc1; PROCESS_ID_TYPE pid1; RETURN_CODE_TYPE ret; void control1(args) { ……. } proc1.ENTRY_POINT=control1; proc1.BASE_PRIORITY=MIN_PRIORITY_VALUE+2; proc1.STACK_SIZE=8*1024; proc1.PERIOD= SECONDS(1); Varias tareas de la misma caracterísPca proc1.TIME_CAPACITY=INFINITE_TIME_VALUE; for (i = 1; i < N; i++) { CREATE_PROCESS(&control1, &pid, &ret); START(pid1, &ret); CREATE_PROCESS(&control1, &pid, &ret); START(pid1, &ret); SET_PARTITION_MODE(NORMAL, &ret); } Sistemas de tiempo real De C a Ada #include with Gnat.IO; use Gnat.IO; main() { procedure principal is i : integer; i integer; ii==00 f : float; f float; begin i = 0; ii