¿Cómo modificar el software para que se convierta en tiempo real? [cerrado]

9

Por primera vez, me gustaría mencionar que soy un novato en la programación de sistemas en tiempo real. Por eso no estoy seguro de si mis preguntas son correctas. Lo siento pero necesito ayuda

Pregunta breve: ¿Cómo implementar un software en tiempo real para asegurarse de que cumpla con los plazos de entrega? ¿Es necesario usar algunas características de QNX? ¿O es suficiente escribirlo para Linux, puerto a QNX y será en tiempo real por defecto?

Pregunta completa: Hemos implementado un complejo software multiproceso multiplataforma con comunicación entre procesos para Linux, Windows, Android y QNX. El lenguaje de programación es C ++, utilizamos Boost y planty de otras bibliotecas. Nuestro software hace su trabajo bien y rápidamente, pero sigue siendo un prototipo. Para fines de producción, debemos hacerlo en tiempo real. Algunas de nuestras funciones tienen que ser en tiempo real y muy robustas porque son muy importantes y la seguridad de las personas que usan nuestro software puede depender de ellas. Funcionan bastante rápido, hasta cientos de milisegundos. Pero no estoy seguro de que nuestro sistema sea realmente en tiempo real debido a este hecho (¿estoy en lo cierto?).

Entonces, hay una pregunta principal: ¿cómo modificar nuestro software para que sea en tiempo real? He buscado mucho en Google pero todavía no tengo idea de cómo hacerlo.

Alguna información adicional sobre nuestras plataformas: Linux y Windows que actualmente utilizamos solo con fines de prueba. Android: todavía no hemos decidido si lo necesitamos. QNX: es nuestro sistema operativo objetivo para la producción. Supongo que la respuesta para mi próxima pregunta es "NO" :) Pero, ¿es posible implementar software multiplataforma en tiempo real (para sistemas operativos en tiempo real (RTOS) y para sistemas operativos de propósito general (GPOS))?

¿Posiblemente necesitamos hacer nuestros esfuerzos para implementar todas las funciones en tiempo real solo para QNX? Pero todavía no entiendo cómo hacerlo. ¿Podría alguien arrojar una luz sobre esta pregunta?

usuario172825
fuente
55
Si su proyecto es crítico para la seguridad, realmente necesita a alguien que entienda los sistemas en tiempo real en su nómina.
Blrfl
18
El sistema en tiempo real es la precisión de su código en términos de tiempo de ejecución, no si es rápido o lento.
Pagotti
22
Creo que no modifica un software existente para que se convierta en tiempo real, diseña y escribe desde cero un nuevo software, teniendo en cuenta las restricciones explícitas en tiempo real. Y su pregunta es demasiado amplia: ¿qué está haciendo exactamente su software? ¿En qué tipo preciso de sistema en tiempo real, para qué tipo concreto de sistema embebido (qué propósito: el infotainment en vuelo en aviones comerciales no es lo mismo que el control del reactor nuclear)? Necesita editar su pregunta para ser mucho más concreta, precisa y motivarla.
Basile Starynkevitch
24
Vuelva a leer el comentario de @ Blrfl. Y luego vuelva a leerlo una y otra vez, hasta que contrate a una persona con la experiencia adecuada. O asegúrese de pagar su seguro de responsabilidad civil. Porque si está creando un software crítico para la seguridad con requisitos en tiempo real y no tiene esa experiencia, está siendo negligente penalmente.
kdgregory
44
Usted preguntó: "¿ es posible implementar software multiplataforma en tiempo real (para sistemas operativos en tiempo real (RTOS) así como para sistemas operativos de propósito general (GPOS))? " Supongo que no, de lo contrario los RTOS no funcionarían existe. "Plataforma cruzada" es bastante similar al "Santo Grial".

Respuestas:

38

Rápido no significa en tiempo real y en tiempo real no significa rápido.

En tiempo real significa que la fecha en que se entrega el resultado es tan importante como su valor. En otras palabras, si el resultado tiene un valor correcto pero se entrega demasiado pronto o demasiado tarde, entonces el resultado general es incorrecto.

Por ejemplo, piense en un reproductor de video. Si los cuadros de video no se muestran a la velocidad correcta, los usuarios no estarán satisfechos. Peor si la imagen y el sonido no están sincronizados.

Este ejemplo muestra que algunas aplicaciones en tiempo real se pueden implementar en sistemas operativos actuales de uso general.

Pero hay una distinción entre el tiempo real duro y el tiempo real suave con respecto a las consecuencias de un incumplimiento de la fecha límite: en los sistemas suaves en tiempo real, esto es solo una molestia o un servicio degradado (piense en imágenes congeladas durante varios segundos en el ejemplo del reproductor de video), mientras que es una falla (potencialmente catastrófica) en un sistema de tiempo real difícil, como en una planta de energía nuclear.

Mouviciel
fuente
Sr. Mouviciel, gracias por responder mi pregunta. Necesitamos que algunas características sean difíciles en tiempo real, otras pueden ser suaves en tiempo real. No entiendo cómo escribir software para garantizar los plazos. ¿Podría arrojar una luz sobre esta pregunta, por favor?
user172825
77
@ user172825 - Las respuestas a esta pregunta cubren los estantes de las bibliotecas. Los puntos de partida pueden ser buscar en Google "programación en tiempo real", artículos de Wikipedia relacionados o tutoriales de RTOS como QNX o RTEMS.
Mouviciel
Fue la pregunta más complicada para mí. Encontré muchos libros grandes sobre este tema. Pero esperaba que fuera posible explicarlo en un par de oraciones. :)
user172825
55
" Solo hay dos cosas difíciles en informática: invalidación de caché y nombrar cosas ". Phil Karlton OK, y en tiempo real. Allí, una oración explica por qué no se puede explicar en dos oraciones. Ahora lo devolvemos a su programación programada regularmente.
1
Encuentro que llamar "tiempo determinista" en "tiempo real difícil" generalmente ayuda a comunicar a las personas.
whatsisname
15

Como ya dijo @mouviciel , en tiempo real y rápido son realmente dos propiedades independientes, aunque muchos plazos en tiempo real implican que se necesita una respuesta relativamente rápida.

Al escribir software en tiempo real, la propiedad más importante junto a una respuesta correcta es que puede predecir con precisión qué tan rápido se dará la respuesta. Para funciones duras en tiempo real, incluso debe ser capaz de garantizar que se cumpla el plazo en todas las condiciones posibles, salvo una falla de energía completa.

Las fuentes típicas de imprevisibilidad se pueden encontrar en

  • Asignación dinámica de memoria y recolección de basura.
  • (Mayor prioridad) interrumpe
  • El planificador en el sistema operativo
  • Creación dinámica y destrucción de objetos.
  • Grandes cantidades de código ejecutado condicionalmente

No digo que deba evitar esas áreas (como probablemente no pueda), pero debe ser consciente de cómo pueden afectar la facilidad con la que puede predecir que cumplirá los plazos en tiempo real para las funciones relevantes.

Bart van Ingen Schenau
fuente
44
En el código ejecutado condicionalmente, tenga cuidado con los algoritmos amortizados, donde la mayoría de las veces la operación es barata pero ocasionalmente puede convertirse en una operación mucho más costosa, por ejemplo, cuando un vector agrega cuando necesita reasignarse.
monstruo de trinquete
2
En algunos casos, es posible que necesite hacer un análisis WCET , prediciendo el tiempo de ejecución al milisegundo
Basile Starynkevitch
3
@ user172825: la creación de perfiles puede ayudar, pero gran parte se reduce a experimentar y conocer muy bien el idioma y las bibliotecas.
Bart van Ingen Schenau
3
La creación de perfiles puede no ser lo suficientemente buena si tiene requisitos difíciles en tiempo real. Si el tiempo de ejecución no es completamente determinista, el perfil puede darle la impresión de que siempre se completará antes de la fecha límite, cuando de hecho solo cumple la fecha límite 99 veces de cada 100. Si tiene un requisito difícil en tiempo real, necesita cumplirlo 100 veces de cada 100.
James_pic
2
@ user172825 El tiempo real es para el software lo que la cirugía cerebral es para la medicina: necesita mucha experiencia y habilidad para llevarlo a cabo correctamente y debe estar muy, muy seguro de lo que está haciendo. Esos proyectos se realizan mejor bajo la supervisión de un profesional calificado del área. No son algo que pueda arrojar a un desarrollador habitual y decir "hacer que esto funcione como un sistema en tiempo real".
T. Sar
8

Supongo que la explicación de dos oraciones del tiempo real es que un sistema en tiempo real está diseñado para comprender y controlar el tiempo de respuesta en el peor de los casos desde el cambio de entradas hasta el cambio de salidas.

Eso requiere un análisis que cubra todo el sistema. Digamos que tiene un sistema trivial que consiste en un teclado USB y un servo de freno. ¿Qué capacidad de respuesta puede lograr con este sistema? Puede que tenga que considerar:

  • frecuencia de sondeo de entrada y cuánto tiempo lleva esto
  • latencia de interrupción de entrada
  • tiempo de cambio de contexto del sistema operativo una vez que tiene un evento de entrada
  • sistema operativo priorización de tareas
  • Evitar el uso de asignación dinámica o memoria virtual en el programa, para evitar retrasos de respuesta impredecibles o eventos OOM
  • evitando el uso de recolección de basura
  • evitando el uso de O (n) o algoritmos peores con N alta o impredecible (¿cargar una lista de reproducción muy grande en el sistema de entretenimiento de su automóvil ralentiza su respuesta de frenado?)
  • considerar la latencia del disco o la red (por ejemplo, el uso del bus CAN en automóviles)
  • latencia de control de salida

En este tipo de entorno también suele haber una consideración especial para la confiabilidad, como los estándares MISRA C.

pjc50
fuente
¿También es cierto que ser en tiempo real incluye la consideración de si una operación es determinista, posiblemente recursiva o incluso computable en algunos casos?
Sí, todo eso sería "ilimitado". Se pueden permitir algoritmos recursivos siempre que su uso de la pila tenga un límite superior impuesto.
pjc50
55
avoiding use of garbage collection- Esto debería ser avoiding use of non-deterministic memory management. La recolección de basura se puede realizar en tiempo real y la gestión manual de la memoria no es necesariamente determinista (consulte la mallocimplementación típica para C).
8bittree