2009-09-10 60 views
14

Estoy planeando implementar un sistema de adquisición de datos a pequeña escala en una plataforma RTOS. (Ya sea en un QNX o un sistema de RT-Linux.)Python en un sistema de operación en tiempo real (RTOS)

Por lo que yo sé, estos trabajos se realizan usando C/C++ para obtener el máximo rendimiento del sistema. Sin embargo, tengo curiosidad por saber y quiero aprender las opiniones de algunas personas experimentadas antes de saltar ciegamente a la acción de codificación si sería factible y más sabio escribir todo en Python (desde interfaces de instrumentos de bajo nivel a través de una interfaz gráfica de usuario brillante). De lo contrario, mezcle partes del diseño con "C", o escriba todo en C y ni siquiera ponga una línea de código Python.

O al menos envolviendo el código C usando Python para proporcionar un acceso más fácil al sistema.

¿De qué manera me recomendaría trabajar? Me alegra que señale algunos casos de diseño similares y otras lecturas también.

Gracias

NOTA 1: La razón de hacer hincapié en QNX se debe a que ya tenemos un sistema QNX basado 4.25 adquisición de datos (M300) para nuestros experimentos de medición atmosférica. Este es un sistema patentado y no podemos acceder a las partes internas del mismo. Ver más allá de QNX podría ser una ventaja para nosotros, ya que 6.4 tiene una opción de licencia académica gratuita, viene con Python 2.5 y una versión reciente de GCC. Nunca he probado un sistema RT-Linux, no sé cómo se puede comparar con QNX en términos de estabilidad y eficiencia, pero sé que todos los miembros de hábitat de Python y herramientas que no son de Python (como Google Earth) que el nuevo sistema podría desarrollarse en trabajos la mayor parte del tiempo fuera de la caja.

+0

¿Puede darnos una pista sobre los requisitos de tiempo? ¿Qué frecuencias/tiempos de respuesta necesitas? segundos o microsegundos? En cuanto a su RTOS, supongo que tiene una PC o una poderosa plataforma integrada. ¿Es esto correcto? – Adriaan

+0

Para la mayoría de las mediciones, la frecuencia de muestreo de 1Hz es satisfactoria. Sin embargo, hay instrumentos que deben muestrearse a altas velocidades alrededor de 100Hz. Por lo general, los dispositivos de medición superrápidos (como Cloud Particle Imager) vienen con su sistema de datos dedicado, que están más allá del alcance de mi intención inicial. Y sí, el sistema actual se ejecuta en una PC para las tareas de adquisición donde hay muchos tableros para interactuar con varios equipos. Creo que sería correcto llamarlo como una plataforma integrada en lugar de solo una PC de escritorio típica. –

Respuesta

14

No puedo hablar por todos los configuración de adquisición de datos por ahí, pero la mayoría de ellos pasan la mayor parte de sus "operaciones en tiempo real" de espera para que los datos vienen en - al menos los que yo he trabajado.

Cuando los datos entran, necesita registrar inmediatamente el evento o responder a él, y luego vuelve al juego de espera. Esa suele ser la parte más crítica en el tiempo de un sistema de adquisición de datos. Por esa razón, quisiera generalmente decir que me quedo con C para las partes de E/S de la adquisición de datos, pero no hay razones particularmente convincentes para no usar Python en las partes que no son de tiempo crítico.

Si usted tiene requisitos más bien flexible - sólo necesita una precisión de milisegundos, tal vez - que añade un poco más de peso que haciendo todo en Python.En lo que respecta al tiempo de desarrollo, si ya te sientes cómodo con Python, probablemente tendrías un producto final significativamente más rápido si hicieras todo en Python y refaccionas solo cuando aparezcan cuellos de botella. Hacer la mayor parte de tu trabajo en Python también hará que sea más fácil probar tu código a fondo, y como regla general, habrá menos líneas de código y, por lo tanto, menos espacio para errores.

Si necesita multi-tarea específica (no multi-hilo ), Stackless Python podría ser beneficioso también. Es como multithreading, pero los subprocesos (o tasklets, en la jerga de Stackless) no son subprocesos del sistema operativo, pero Python/nivel de aplicación, por lo que la sobrecarga de la conmutación entre tareas es significativamente reducido. Puede configurar Stackless para multitareas de forma cooperativa o preventiva. La desventaja más grande es que bloquear IO generalmente bloqueará todo tu conjunto de tareas. De todos modos, teniendo en cuenta que QNX ya es un sistema en tiempo real, es difícil especular si valdría la pena usar Stackless.

Mi voto sería tomar la ruta de Python como sea posible, lo veo como de bajo costo y alto beneficio. Si necesita reescribir en C, ya tendrá código de trabajo para empezar.

+0

No he usado Stackless antes, ni tengo idea de su integración con muchas herramientas científicas básicas. Una de las razones por las que quiero quedarme con un RT-Linux es que tiene todas las herramientas de Python y las bibliotecas de visualización 2D/3D funcionando muy bien. Sin embargo, en el lado de QNX, faltan muchas bibliotecas y estoy seguro de que hacerlas funcionar en QNX supondría una gran cantidad de esfuerzo. Cualquier comentario sobre esto sería muy apreciado. –

+0

Stackless solo modifica una instalación de Python existente: reemplaza un par de archivos principales que * no deberían * afectar ninguna biblioteca de Python. Se aleja del uso de la pila C, pero no debería afectar incluso a las bibliotecas escritas en C que interactúan con Python. Juega un poco con Stackless (es muy fácil de instalar en Windows), mira si se adapta a tus necesidades. No he construido Stackless desde la fuente, por lo que no puedo comentar sobre las dificultades previstas con QNX. –

3

Nuestro equipo ha hecho un trabajo que combina varios idiomas en QNX y tenía mucho éxito con el enfoque. El uso de Python puede tener un gran impacto en la productividad, y las herramientas como SWIG y ctypes hacen que sea muy fácil optimizar el código y combinar características de los diferentes idiomas.

Sin embargo, si escribe algo de importancia crítica para el tiempo, casi con certeza debe escribirse en c. Hacer esto significa que usted evita los costos implícitos de un lenguaje interpretado como GIL (Global Interpreter Lock) y contention en muchas asignaciones de memoria pequeñas. Ambas cosas pueden tener un gran impacto en el rendimiento de su aplicación.

También pitón en QNX tiende a no ser 100% compatible con otras distribuciones (es decir,/a veces hay módulos faltan).

+1

y Python para QNX es difícil de encontrar en una versión actualizada ... y no siempre es fácil de compilar para QNX – Fuzz

+0

@Fuzz, 2.5 está en QNX 6.4.x, y si mi memoria me sirve correctamente, los archivos binarios de PyQt 4 deben ser en algún lugar en un repositorio de terceros.Aún no he visto un puerto NumPy, tampoco he intentado construir ninguna biblioteca. Estoy seguro de que se necesitarían muchos ataques para hacer que algunos de ellos funcionaran a medias. Es por eso que considero usar una solución RT-Linux sobre un QNX, pero necesito más información y fuentes sobre esto. –

+0

@Andrew, ¿podría darme algunos consejos sobre dónde encontrar tales proyectos utilizando el enfoque Python - C en un sistema RTOS? Aparentemente, esto está algo escondido en la web, necesita profundizar más o simplemente llevar a cabo el enfoque de prueba y error. –

6

En general, el motivo avanzado contra el uso de un lenguaje de alto nivel en un contexto en tiempo real es incertidumbre - cuando ejecuta una rutina una vez puede tomar 100us; la próxima vez que ejecute la misma rutina podría decidir extender una tabla hash, llamando a malloc, luego malloc le pide al kernel más memoria, que podría hacer cualquier cosa, desde retornar instantáneamente a milisegundos de regreso más tarde hasta devolver segundos más tarde al error, ninguno de lo cual es inmediatamente evidente (o controlable) desde el código. Mientras que teóricamente, si escribes en C (o incluso más bajo) puedes demostrar que tus caminos críticos serán "siempre" (salvo golpes de meteoritos) en X veces.

+0

Estoy de acuerdo con casi todo esto, pero el análisis de ruta crítica (y particularmente el peor tiempo de ejecución de casos) en cualquier idioma es un problema realmente horrible y depende significativamente de la plataforma de hardware (cachés, canalizaciones, predictores de ramas, fallas de página) y software (Servicios del sistema operativo, interrupciones, tiempo de bloqueo). Si el tiempo es tan crítico, es probable que Ada sea esencial. –

+2

Sí, tómalo con tantos granos de sal como quieras. Creo que tal vez mi argumento debería ser "si todo esto te suena como una tontería, entonces no estás en tiempo real para preocuparte por el idioma en el que estás escribiendo". – hobbs

+0

En este punto, no inferior a C. y sin intención de llamar a los códigos de ensamblaje de Python con una herramienta como CorePy. La criticidad del tiempo es importante, pero no es tan importante cambiarme para usar Ada. –

0

Una nota importante: Python para QNX generalmente está disponible solo para x86.

Estoy seguro de que puede compilarlo para ppc y otros archivos, pero eso no va a funcionar de la caja.

20

He construido varios sistemas en tiempo real (RT) totalmente en Python, con tiempos de ciclo primarios de 1 ms a 1 segundo. Hay algunas estrategias y tácticas básicas que he aprendido a lo largo del camino:

  1. Uso de roscado/multiprocesamiento única para descargar el trabajo no RT desde el hilo principal, donde las colas entre hilos son aceptables y cooperativo el enhebrado es posible (¡no hay hilos preventivos!).

  2. Evita el GIL. Lo que básicamente significa no solo evitar el enhebrado, sino también evitar las llamadas al sistema en la mayor medida posible, especialmente durante las operaciones de tiempo crítico, a menos que no sean bloqueantes.

  3. Use los módulos C cuando sea práctico. ¡Las cosas (generalmente) van más rápido con C! Pero principalmente si no tiene que escribir el suyo: quédese en Python a menos que realmente no haya otra alternativa. La optimización del rendimiento del módulo C es un PITA, especialmente cuando la traducción a través de la interfaz Python-C se convierte en la parte más costosa del código.

  4. Usa los aceleradores de Python para acelerar tu código. Mi primer proyecto de RT Python se benefició enormemente de Psyco (sí, he estado haciendo esto por un tiempo). Una razón por la que me quedo con Python 2.x hoy es PyPy: cosas siempre ¡vaya más rápido con LLVM!

  5. No tenga miedo de ocupado, espere cuando se necesita un tiempo crítico. Use time.sleep() para 'escabullirse' en el tiempo deseado, luego ocupado-espere durante los últimos 1-10 ms. Pude obtener un rendimiento repetible con sincronización automática del orden de 10 microsegundos. Asegúrese de que su tarea de Python se ejecute con la máxima prioridad de sistema operativo.

  6. Numpy ROCKS! Si está haciendo análisis en vivo o toneladas de estadísticas, hay NO manera de hacer más trabajo más rápido y con menos trabajo (menos código, menos errores) que usando Numpy. No en ningún otro idioma que conozca, incluido C/C++. Si la mayoría de tu código consiste en llamadas Numpy, serás muy, muy rápido. ¡No puedo esperar para que se complete el puerto de Numpy a PyPy!

  7. Tenga en cuenta cómo y cuándo Python realiza la recolección de basura. Controle el uso de su memoria y fuerce la GC cuando sea necesario. Asegúrese de desactivar explícitamente el GC durante las operaciones de tiempo crítico. Todos mis sistemas RT Python se ejecutan continuamente, y a Python le encanta acaparar la memoria. Una codificación cuidadosa puede eliminar casi toda la asignación de memoria dinámica, en cuyo caso puede deshabilitar completamente GC.

  8. Trate de realizar el procesamiento en lotes en la mayor medida posible. En lugar de procesar datos a la velocidad de entrada, intente procesar los datos a la velocidad de salida, que a menudo es mucho más lenta. Procesar en lotes también hace que sea más conveniente recopilar estadísticas de mayor nivel.

  9. ¿Mencioné el uso de PyPy? Bueno, vale la pena mencionarlo dos veces.

Hay muchas otras ventajas en el uso de Python para el desarrollo de RT. Por ejemplo, incluso si está bastante seguro de que su idioma de destino no puede ser Python, puede generar enormes beneficios desarrollar y depurar un prototipo en Python, y luego usarlo como plantilla y como herramienta de prueba para el sistema final. Había estado usando Python para crear prototipos rápidos de las "partes duras" de un sistema durante años y para crear GUIs de prueba rápidas y sucias. Así nació mi primer sistema RT Python: ¡el prototipo (+ Psyco) fue lo suficientemente rápido, incluso con la GUI de prueba en funcionamiento!

-BobC

Editar: se olvidó de mencionar los beneficios de la plataforma: Mi código se ejecuta prácticamente en todas partes con una) sin recompilación (o dependencias de compilación, o la necesidad de compiladores cruzados), y b) casi ningún código dependiente de la plataforma (principalmente para cosas misceláneas como manejo de archivos y E/S en serie). Puedo desarrollar en Win7-x86 e implementar en Linux-ARM (o cualquier otro sistema operativo POSIX, todos los cuales tienen Python actualmente). PyPy es principalmente x86 por ahora, pero el puerto ARM está evolucionando a un ritmo increíble.

+2

Tarde a la pregunta, pero gracias por esta respuesta detallada. Para mí, esta fue la parte más interesante: _La codificación cuidadosa puede eliminar casi toda la asignación de memoria dinámica, en cuyo caso puede deshabilitar por completo GC_. ¿Puedes dar algunos ejemplos sobre esa parte de codificación cuidadosa? – pembeci

Cuestiones relacionadas