Este artículo es el primero de una serie sobre desarrollo de software, específicamente programación de sistemas integrados y aplicaciones en tiempo real. Los artículos futuros, por supuesto, harán referencias ocasionales a la tecnología XMOS, por lo que tiene sentido mirar primero al mundo del software donde encaja XMOS.
Este artículo es el primero de una serie sobre desarrollo de software, específicamente programación de sistemas integrados y aplicaciones en tiempo real. Los artículos futuros, por supuesto, harán referencias ocasionales a la tecnología XMOS, por lo que tiene sentido mirar primero al mundo del software donde encaja XMOS.
El software es genial. El lenguaje de programación es muy expresivo, se compila rápidamente, tiene muchas abstracciones y herramientas de desarrollo y hace que la actualización de la funcionalidad del dispositivo sea rápida y sencilla. Esto significa que cualquier parte del sistema impulsada por software es la parte más flexible y sorprendente del sistema.
Sin embargo, hay un lugar donde el software realmente apesta. Es un procesamiento rápido en tiempo real. Esto es para cuando una tarea debe completarse antes de algún evento externo. Por ejemplo, manipula los datos de la imagen entre las actualizaciones de la pantalla de visualización o alimenta los datos a los pines de E/S externos en función de un reloj de alta velocidad.
Por supuesto, puede usar software para esto, pero parece que se ha perdido toda la gran facilidad de uso y flexibilidad. El desarrollo de software se vuelve difícil y el mantenimiento se vuelve difícil.
problema
Entonces, ¿por qué el software tiene problemas cuando se enfrenta a aplicaciones en tiempo real o basadas en interfaz?Los problemas se pueden agrupar en las siguientes categorías:
Problema 1: multitarea
Naturalmente, el procesador puede intentar realizar múltiples tareas, incluso para los problemas más simples. Sin embargo, los procesadores normalmente no pueden hacer más de una cosa a la vez. Incluso los procesadores multinúcleo con arquitecturas tradicionales solo pueden hacer dos o cuatro cosas a la vez en el hardware.
El problema, por supuesto, es que con la multitarea en un procesador de un solo subproceso, las tareas de programación de software se realizan en fragmentos tanto dentro como fuera del procesador. Desde la perspectiva de una sola tarea, la programación significa que nunca sabe cuándo está dentro y cuándo está fuera, lo que dificulta el cumplimiento de las limitaciones en tiempo real.
Problema 2: Interrupción
Incluso para una aplicación de “subproceso único”, el procesador puede estar haciendo más de una cosa a la vez. Las interrupciones proporcionan una forma implícita de multitarea. Generar una interrupción (por ejemplo, para manejar un controlador de E/S) es equivalente a que el programador cambie entre tareas.
Problema 3: falta de previsibilidad
El software realmente parece carecer de previsibilidad con respecto al tiempo. Necesito que la tarea se ejecute en una cierta cantidad de microsegundos, pero no estoy seguro de si lo hará. La programación y las interrupciones son solo una parte del problema. Algunos microprocesadores tienen cachés para accesos a la memoria, y los accesos a la memoria toman diferentes tiempos según el estado del caché. Además, algunos microprocesadores son superescalares, por lo que varía el tiempo que lleva ejecutar cada instrucción. Todo esto significa que no puede saber cuánto tiempo tomará una secuencia de instrucciones simplemente contando el número de instrucciones.
Problema 4: recursos insuficientes
El uso de software en tiempo real en aplicaciones integradas es propenso a otro problema: la falta de recursos. Los ciclos de memoria y reloj tienen un costo, por lo que hay un impulso para obtener lo más posible de los dispositivos con menos recursos. Este es un problema con las abstracciones de software modernas que tienden a ver los recursos en abundancia, como ver la memoria como un recurso infinito.
solución
Una opción para evitar problemas de software en tiempo real es implementarlo en una solución de hardware. Si hay un componente funcional con una función deseada específica, realmente no hay nada que podamos hacer al respecto. Alternativamente, si tiene habilidades de programación, puede usar partes de hardware reprogramables como FPGA. Incluso entonces, es probable que necesite algunas tareas de software, por lo que deberá integrar el FPGA y el microprocesador en el FPGA u otra parte. Esta división de hardware/software ofrece múltiples herramientas y flujos de diseño y carece de la estrecha integración de capacidades dispares que puede proporcionar el desarrollo de software.
¿Existe una solución que le brinde todos los beneficios del desarrollo de software, pero que evite los problemas que encuentra al intentar programar en tiempo real?
Una opción es utilizar un sistema operativo en tiempo real (RTOS). Este es un sistema operativo tradicional con características especiales para aplicaciones en tiempo real. En primer lugar, la programación de múltiples tareas se prioriza y tiene en cuenta el tiempo, por lo que el programador intenta asegurarse de que las tareas cumplan con sus restricciones de tiempo. En segundo lugar, el sistema operativo está diseñado para conocer el tiempo de ejecución en el peor de los casos de todas las tareas del sistema, por lo que puede realizar un análisis del tiempo de ejecución en el peor de los casos (WCET).
Sin embargo, los RTOS de microprocesador tradicionales proporcionan una solución bastante pesada. Está tratando de convertir algo que no es naturalmente en tiempo real en un marco de trabajo en tiempo real. El no determinismo del procesador (almacenamiento en caché, ejecución superescalar) todavía existe incluso cuando la programación es compatible en tiempo real y WCET se ejecuta para tareas del sistema. Como resultado, incluso con microprocesadores bastante rápidos, la sobrecarga del sistema operativo dificulta la realización de tareas con restricciones de submicrosegundos. Este tipo de tarea todavía es manejada tradicionalmente por ASICS o FPGA.
Los dispositivos XMOS ofrecen una solución completamente nueva que combina las ventajas del software con el rendimiento en tiempo real de las soluciones de hardware.
XMOS: diseñado para tiempo real
musgo cruzado El procesador está construido desde cero para el procesamiento en tiempo real con restricciones de E/S externas rápidas. Están diseñados para combinar lo mejor del diseño de hardware con lo mejor del diseño de software.
Solución 1: multitarea de hardware
Los dispositivos XMOS manejan la multitarea en hardware mediante una serie de tareas que se ejecutan en diferentes subprocesos de software. Cada ciclo de reloj, diferentes subprocesos intercambian contextos en un estilo de turno rotativo. Esto significa que no tiene que preocuparse por los programadores. Puede ver cada subproceso como una entidad independiente que se ejecuta a una velocidad establecida. También es, por supuesto, una arquitectura de múltiples núcleos, por lo que agregar más núcleos le permite realizar más tareas independientes.
Solución 2: Arquitectura impulsada por eventos
Los dispositivos XMOS no tienen una capa de sistema operativo. En lugar de interrupciones, cada subproceso responde a los eventos de forma explícita. Este enfoque significa que no hay tareas ocultas que puedan saltar y alterar el tiempo de su software.
Solución 3: ejecución predecible
Sin sistema operativo ni programador de software, combinado con memoria sin caché (cada acceso a la memoria requiere un ciclo de subprocesos) y recursos independientes por subproceso, XMOS proporciona la previsibilidad necesaria para las aplicaciones en tiempo real. Sé cuánto tarda estáticamente una secuencia de instrucciones. Además, XMOS proporciona una herramienta Timing Analyzer (XTA). Mide con precisión el tiempo de ejecución en el peor de los casos entre dos puntos en el código (teniendo en cuenta el flujo de control, múltiples rutas de llamadas a funciones).
Solución 4: recursos gestionados
Los dispositivos XMOS están diseñados para aplicaciones integradas, por lo que son de bajo costo y bajos recursos. La gestión de estos recursos es importante para los programadores de software. Las herramientas de desarrollo de software (herramientas estándar basadas en el compilador C con extensiones) rastrean el uso de recursos para que no se quede sin ellos en tiempo de ejecución. Los recursos son totalmente escalables, por lo que si necesita más memoria, potencia de procesamiento o E/S, simplemente agregue otro núcleo.
Las herramientas también aseguran que cada subproceso use solo sus propios recursos y no pueda interferir entre sí.
Conclusión
Este artículo analiza la dificultad de la programación de software para aplicaciones en tiempo real y la motivación detrás del diseño de la familia de dispositivos XMOS. La próxima vez que diseñe un sistema que requiera procesamiento en tiempo real y programación de E/S, consulte XMOS para ver cómo puede combinar los beneficios del desarrollo de software con el rendimiento en tiempo real.