2009-08-12 5 views
53

He tenido curiosidad por comprender si es posible aplicar el poder de Haskell al mundo embebido en tiempo real, y en Google he encontrado el paquete Atom. Supongo que en el caso complejo, el código podría tener todos los errores C clásicos: bloqueos, daños en la memoria, etc., que luego tendría que rastrearse hasta el código Haskell original que los causó . Entonces, esta es la primera parte de la pregunta: "Si tuviste la experiencia con Atom, ¿cómo lidiaste con la tarea de depurar los errores de bajo nivel en el código C compilado y corregirlos en el código original de Haskell?"Uso de Haskell para sistemas de tiempo real de gran tamaño: ¿cómo (si?)?

He buscado algunos ejemplos más para Atom, this blog post menciona el código C resultante 22KLOC (y obviamente no hay código :), el included example es un juguete. This y this referencias tienen un código un poco más práctico, pero aquí es donde esto termina. Y la razón por la que puse "considerable" en el tema es, estoy más interesado si puede compartir sus experiencias de trabajo con el código C generado en el rango de 300KLOC +.

Como soy un novato en Haskell, obviamente puede haber otras formas que no encontré debido a mis incógnitas desconocidas, por lo que cualquier otro puntero para la autoeducación en esta área sería muy apreciado, y esta es la segunda parte de la pregunta: "¿Cuáles serían algunos otros métodos prácticos (si) de hacer un desarrollo en tiempo real en Haskell?". Si el multinúcleo también está en la imagen, eso es un plus extra :-)

(Sobre el uso de Haskell para este propósito: por lo que leo en this blog post, la recolección de basura y la pereza en Haskell lo hace un horario no determinista- sabia, pero tal vez en dos años algo ha cambiado Real world Haskell programming pregunta sobre SO era el más cercano que pude encontrar a este tema)

Nota:. "en tiempo real" anterior es que sería más cerca de "tiempo real duro" - Tengo curiosidad si es posible garantizar que el tiempo de pausa cuando la tarea principal no se está ejecutando sea menor a 0.5 ms.

Respuesta

46

En Galois utilizamos Haskell por dos cosas:

  • tiempo real suave (capas de dispositivos del sistema operativo, redes), donde los tiempos de respuesta de 1-5 ms son plausibles. GHC genera código rápido, y tiene mucho soporte para ajustar el GC y el programador para obtener los tiempos correctos.
  • para verdaderos sistemas en tiempo real Los EDSL se usan para generar código para otros lenguajes que proporcionan garantías de tiempo más fuertes. P.ej. Cryptol, Atom y Copilot.

Tenga cuidado de distinguir el EDSL (copiloto o átomo) del idioma de host (Haskell).


Algunos ejemplos de sistemas críticos, y en algunos casos, los sistemas en tiempo real, ya sea escrito o generado a partir de Haskell, producido por Galois.

EDSLs

Sistemas

  • HaLVM - un micronúcleo ligero para aplicaciones embebidas y móviles
  • TSE - un dispositivo de dominios cruzados (nivel de seguridad) a la red
+1

increíble, muchas gracias! Sí, entiendo la diferencia entre el EDSL utilizado como generador de código y el idioma del host en sí; lo siento si no estaba claro en el texto de la pregunta. Mi razón para ponerlo en la categoría "en haskell" fue que usando un lenguaje más estricto como Haskell uno podría (?) Evitar los errores más "mecánicos" como las comprobaciones de límites, los dobleces, etc., suponiendo que la semántica se expresa en el EDSL: esa es una de mis especulaciones de que estoy tratando de entender si es verdadera o falsa. –

5

Pasará mucho tiempo antes de que exista un sistema Haskell que se ajuste a la memoria pequeña y pueda garantizar tiempos de pausa inferiores a milisegundos. La comunidad de implementadores Haskell simplemente no parece estar interesada en este tipo de objetivo.

Existe un gran interés en usar Haskell o algo parecido a Haskell para compilar algo muy eficiente; por ejemplo, Bluespec compila al hardware.

No creo que satisfaga sus necesidades, pero si está interesado en la programación funcional y los sistemas integrados, debe aprender acerca de Erlang.

+1

+1 para el enlace bluespec. Será interesante compararlo con Lava: por lo que he leído, tiene una función similar. Erlang: sí, esa es otra cosa en la que comencé a echarle un vistazo, pero parece ser un poco más "suave" en tiempo real. –

+0

También puede echar un vistazo a Ocaml. Es funcional e incluso admite la evaluación diferida si lo quiere para un algoritmo, pero no obliga a que todo se evalúe con pereza. Me parece recordar haber escuchado que se usa para sistemas en tiempo real, aunque yo no lo hice. Debería ser más rápido y más pequeño que Erlang, de todos modos. – Chuck

+2

OCaml, Erlang y Haskell se acostumbran a usar en tiempo real. Ninguno hace garantías sobre los tiempos de respuesta, por ejemplo. En un sistema que usamos en el trabajo, felizmente tenemos ~ 1 ms de tiempos de respuesta en un dispositivo de red en Haskell, así que ese es el tipo de parque de béisbol. Ajustar la configuración del GC para minimizar el ruido también es útil. –

4

No creo que Haskell u otros lenguajes recogidos de basura sean adecuados para sistemas en tiempo real, ya que los GC tienden a amortizar sus tiempos de ejecución en breves pausas.

Escribir en Atom no es exactamente programación en Haskell, ya que aquí Haskell puede verse como un simple preprocesador del programa que está escribiendo.

creo Haskell es un preprocesador impresionante, y el uso de DSEL como Atom es probablemente una gran manera de crear sistemas de tiempo real duro de tamaño considerable, pero no sé si Atom ajusta a la ley o no. Si no lo hace, estoy bastante seguro de que es posible (¡y animo a cualquiera que lo haga!) A implementar un DSEL que sí lo haga.

Tener un preprocesador muy fuerte como Haskell para un lenguaje de bajo nivel abre una gran oportunidad para implementar abstracciones a través de la generación de código que son mucho más torpes cuando se implementan como generadores de texto en código C.

+1

Tenía curiosidad si tuvieras una experiencia laboral trabajando con tal combo. Como dije, el aspecto de la metaprogramación parece seductor, pero me preocupan los metabugs y su relación con los errores "comunes" de bajo nivel. Como en el campo solo tendrías los símbolos del código C, a primera vista parecería difícil desenrollarlos de nuevo al código de nivel superior. –

+4

> Atom es probablemente una excelente forma de crear sistemas de tiempo real durables, , no es realmente un "preprocesador" si ofrece una gramática, variables, funciones y un sistema de tipos. En ese punto, realmente se convierte en un lenguaje con un generador de códigos personalizado, como lo es Atom. En cuanto a la creación de sistemas de gran tamaño: Atom se utiliza en autobuses y camiones de basura que se ejecutan en las calles de las ciudades de EE. UU. Vea la charla de Eaton en CUFP sobre esto. Si poner Haskell EDSL en las calles no está listo para la producción, no sé lo que es. –

+0

@dons: bien, esto también obtiene +1 en mi libro como mínimo gracias a su comentario. Muchas gracias por compartir la experiencia práctica. Es hora de tomar un descanso y practicar más. –

6

Andrew,

Sí, puede ser difícil de depurar problemas a través del código generado de regreso a la fuente original. Una cosa que ofrece Atom es un medio para sondear las expresiones internas, luego deja al usuario la tarea de manejar estas sondas. Para la prueba de vehículos, construimos un transmisor (en Atom) y transmitimos las sondas a través de un bus CAN. Luego, podemos capturar estos datos, formatearlos y luego verlos con herramientas como GTKWave, ya sea en postprocesamiento o en tiempo real. Para la simulación de software, las sondas se manejan de manera diferente. En lugar de obtener datos de sonda de un protocolo CAN, se crean ganchos en el código C para levantar los valores de la sonda directamente. Los valores de la sonda se usan luego en el marco de prueba de la unidad (distribuido con Atom) para determinar si una prueba pasa o no y para calcular la cobertura de la simulación.

+0

¡Muchas gracias por la información! –

3

He estado jugando con Atom. Es genial, pero creo que es mejor para sistemas pequeños. Sí, se ejecuta en camiones y autobuses e implementa aplicaciones críticas del mundo real, pero eso no significa que esas aplicaciones sean necesariamente grandes o complejas. Realmente es para aplicaciones duras en tiempo real y hace todo lo posible para que cada operación tome la misma cantidad de tiempo. Por ejemplo, en lugar de una instrucción if/else que ejecuta condicionalmente una de las dos ramas de código que pueden diferir en el tiempo de ejecución, tiene una instrucción "mux" que siempre ejecuta ambas ramas antes de seleccionar condicionalmente uno de los dos valores calculados (por lo que el total el tiempo de ejecución es el mismo cualquiera que sea el valor seleccionado). No tiene ningún tipo de sistema significativo aparte de los tipos incorporados (comparables a los C) que se aplican a través de los valores GADT pasados ​​a través de la mónada Atom. El autor está trabajando en una herramienta de verificación estática que analiza el código de salida C, que es bastante bueno (utiliza un solucionador de SMT), pero creo que Atom se beneficiaría de más funciones y controles de nivel de fuente.Incluso en mi aplicación de tamaño de juguete (controlador de linterna LED), he cometido una serie de errores de novato que alguien con más experiencia con el paquete podría evitar, pero que dieron como resultado un código de salida defectuoso que preferiría haber sido capturado por el compilador en lugar de a través de pruebas. Por otro lado, todavía está en la versión 0.1. Algo por lo que las mejoras sin duda vendrán.

+0

+1, muchas gracias por compartir. Esperemos las próximas versiones! :-) –

Cuestiones relacionadas