Escribir software embebido sin hardware

Considere que el equipo de hardware tardará 2 meses en desarrollar algo de hardware, pero para ese tiempo necesitaré tener el software listo.

Mi pregunta es ¿cómo puedo escribir el software y probarlo sin tener el hardware?

¿Hay algún estándar/s a seguir? ¿Cómo lo haces?

Dependiendo de cuán complejo se vuelva el hardware, puede probar un simulador. Eso es bastante factible si es solo un microcontrolador con periféricos simples. Más que eso y no tendrás suerte en esa ruta.
Intente encontrar placas de desarrollo para el micro y cualquier otro dispositivo periférico que esté utilizando, e intente conectarlos todos de la manera que más se asemeje al diseño de su equipo de hardware. Será grande y feo, pero debería poder armar un sistema lo suficientemente parecido al real, al menos hasta donde su firmware puede decir...
En el peor de los casos, si no puede simular correctamente el hardware, tenga una forma de desactivarlo. Hace solo un par de semanas, quería probar la comunicación de la red con otro programa, solo para descubrir que lo haría exit()porque intentaba mmmap direcciones codificadas en /dev/mem.
De hecho, en muchos casos es preferible usar un simulador para el desarrollo de software integrado, mucho más fácil de depurar. El problema, por supuesto, es que necesitas un simulador decente. A veces hay uno genérico que se puede adaptar, a veces un pasante inteligente puede escribir uno en un frenesí de codificación alimentado por cafeína.

Respuestas (6)

No tener hardware durante las etapas iniciales del desarrollo del firmware sucede. Las estrategias comunes para lidiar con esto son:

  1. Dedique tiempo al principio a diseñar el sistema con cuidado antes de escribir cualquier código. Por supuesto que deberías hacer esto de todos modos, pero en este caso es aún más importante de lo habitual. Es mucho más fácil depurar un software bien pensado que un desastre basado en pasta.

  2. Modulariza todo adecuadamente, minimizando las interfaces entre módulos. Esto ayudará a contener los errores de los módulos individuales y permitirá una prueba más fácil de los módulos individuales.

  3. Escriba el código de abajo hacia arriba, los controladores que tocan el hardware van primero, la lógica de la aplicación de alto nivel al final. Esto permite descubrir tempranamente los inconvenientes impuestos por la arquitectura. No tenga miedo de cambiar la arquitectura a medida que salgan a la luz las realidades del hardware, pero asegúrese de que toda la documentación se actualice en consecuencia.

  4. Simular. La mayoría de las empresas de microcontroladores proporcionan simuladores de software de sus microcontroladores. Estos solo pueden llegar hasta cierto punto, pero aún pueden ser muy útiles. Simular las entradas y medir las salidas del hardware puede ser difícil, pero verificar la lógica de nivel superior de esta manera no debería ser demasiado difícil.

    Aquí es donde el diseño modular ayuda nuevamente. Si no puede simular razonablemente algunas interacciones de hardware de bajo nivel, use una versión diferente del módulo que toca ese hardware pero que pasa sus propias acciones simuladas a los niveles superiores. Los niveles superiores no sabrán que esto está sucediendo. No comprobará el módulo de bajo nivel de esta manera, sino casi todo lo demás.

En resumen, use buenas prácticas de diseño de software, que por supuesto debería estar haciendo de todos modos.

Me gustaría agregar: obtenga placas de desarrollo (sí, múltiples, porque probablemente eliminará al menos una...) lo antes posible y coloque los controladores de bajo nivel en su lugar. Prueba unitaria tanto como puedas de tu código. Sí, puede unir el código de contacto de hardware. No, no puede simular completamente el hardware, pero puede obtener el 90% de la funcionalidad correcta incluso antes de flashear por primera vez. Hice todo lo anterior en un proyecto reciente, y teníamos un 99 % de funcionalidad implementada y funcionando cuando llegó el hardware real. Fue magnífico.

Sin ninguna idea de qué es lo que está desarrollando, o en qué familia de microcontroladores se basará su hardware, la mayoría de las familias de microcontroladores tienen sistemas de desarrollo de bajo costo disponibles que tienen un conjunto de periféricos comunes en ellos, lo que puede permitirle simule al menos parte de su eventual hardware de destino.

Acordado. Lo expresaría con más fuerza. En una situación como esta en la que el software debe terminarse al mismo tiempo que el hardware, solo usaría un microcontrolador que tuviera una placa de desarrollo o evaluación adecuada.
Incluso si tuviera una idea de lo que está desarrollando el OP, la mayoría de las familias de microcontroladores todavía tienen simuladores disponibles.
Yo uso ambos métodos. Sin embargo, también vigilo el equipo de prueba de la línea de producción requerido. Puede reunirse con los ingenieros de producción y el hardware de diseño para probar sus controladores, que luego pueden formar parte de las pruebas de producción. Si tiene suerte, incluso pueden construir hardware para una placa de desarrollo / prototipo para que también se adelanten al proceso. Todo depende de cómo envíes la solicitud de ayuda...
Esta es la mejor respuesta a esta pregunta, ya que siempre tengo una placa de desarrollo para programar las funcionalidades principales antes de probarlas en la PCB.

Dependiendo de cuán dependiente del hardware vaya a ser la aplicación, puede comenzar a implementar el proyecto en una PC estándar (Windows, Linux...). La mayoría de los accesos periféricos deben abstraerse de todos modos, por lo que no es gran cosa implementar algunas funciones ficticias, que se reemplazarán más adelante. Si no es posible simular algún comportamiento, al menos podría hacer una maqueta del sistema (API...), por lo que la implementación real será mucho más rápida y clara, tan pronto como el hardware esté listo.

Por supuesto, hay muchas cosas que no se pueden simular, como el comportamiento en tiempo real o controladores de hardware complejos. Por otro lado, un ADC controlado por interrupciones se puede simular fácilmente usando un subproceso que lee valores de un archivo o un puerto de red.

Por supuesto, todo esto depende en gran medida de varios factores:

  • ¿Puede usar la misma cadena de herramientas/similar en el controlador y la PC (por ejemplo, gcc)?
  • ¿Qué tan dependiente del hardware es el sistema?
  • ¿Qué experiencia tienes con la programación de PC?

Yo, por mi parte, estoy diseñando casi todos los módulos de firmware en una PC primero.

Igual aquí. Algunas diferencias entre compiladores (intrínsecos, palabras clave especiales, sistema operativo de código cerrado y pila de red no son del todo compatibles con BSD) y errores (con C ++) que obligan a un uso intensivo de archivos y preprocesadores preincluidos específicos del archivo, pero el código en sí puede ser casi idéntico entre DSP y computadora Para la versión para PC, puedo usar una verificación de errores de tiempo de ejecución fuerte y pesada (CodeGuard) y sus capacidades de depuración no se pueden igualar en plataformas integradas. La ventaja adicional es que puedo tener algunos dispositivos virtuales adicionales para cualquier red y prueba de carga.
Con la disponibilidad de Raspberry Pi y BeagleBone, su entorno de desarrollo podría ser fácilmente su entorno de tiempo de ejecución, sin problemas con la cadena de herramientas, etc. Además, puede usar valgrind/helgrind, gdb, etc.

Trate de obtener un simulador para su chip. Debe simular todas las entradas esperadas y también algunas inesperadas. Modularice/abstraiga tanto como pueda y escriba pruebas unitarias. Si puede, esas pruebas pueden convertirse en parte de su código real y convertirse en una función (autoprueba de la placa).

Si no puede obtener un simulador, abstraiga todo lo que pueda a través de una HAL (capa de abstracción de hardware). Todos los conductores lo respaldan. Intente abstraer todo el ensamblaje específico de la plataforma detrás de alguna llamada de función C y piense en ellos también como controladores. Escriba el resto como código portátil C/C++ y cree un HAL delgado para x86 y ejecútelo en su máquina con todos los casos de prueba.

De esa manera, cuando obtenga el hardware, solo tendrá que depurar el HAL. Cuanto más delgado sea, más rápido lo depurará y todo funcionará. Recuerde que si utiliza el ensamblaje específico de la plataforma para operaciones más rápidas, DESEA MUCHO obtener pruebas con precisión de bits .

La exactitud de bits es especialmente importante si se utiliza DSP de punto fijo.
Puede o no aplicarse a un caso particular, pero en general, la precisión de un poco tiene su precio. QEMU recientemente (hace 2 años) decidió implementar FPU de bit exacto, y ¿adivina qué pasó con el rendimiento ?
La exactitud de los bits no es tan importante cuando se usa una FPU. Sin embargo, es extremadamente importante si se usa punto fijo. Especialmente porque el punto fijo del software necesita controles adicionales en todas partes.
Lo cual es el resultado de malas prácticas de codificación. La gente ha aprendido a tomar precauciones al usar a == bcomparaciones con flotantes, pero todavía las usan sin pensar con números de punto fijo.
Si bien las malas prácticas de codificación son un gran problema, existen muchos otros problemas, especialmente en casos extremos. Los desbordamientos vienen a la mente rápidamente, al igual que la pérdida de precisión , el redondeo , la saturación y el ancho frente al cambio de bits . Con todo eso, es fácil ignorar alguna pérdida de precisión en casos de prueba comunes. El problema es cuando su aplicación llega a casos menores y los errores se mueven de los bits fraccionarios a los enteros, lo que sucede si el rango está mal calculado. Simplemente consulte la página de características del diseñador de punto fijo de MATLAB para ver qué más podría salir mal de un vistazo.

Tu pregunta es un poco amplia. El hardware (HW) podría significar desarrollo ASIC/FPGA totalmente personalizado, DSP programados por ensamblador o "solo" un sistema integrado típico basado en microprocesadores/microcontroladores/SoC, etc. disponibles en el mercado (por supuesto, un SoC también puede contener un DSP que tal vez quieras programar...). Para grandes cantidades de venta, convertirlo en un ASIC no es raro.

Pero para un proyecto de 2 meses, espero que se base en algún microcontrolador:

En cualquier caso, debe enfatizar al equipo de hardware para que le proporcione un prototipo, puede comenzar a probar su código antes de la fecha límite absoluta; esto podría consistir en una placa de desarrollo genérica, como algunas personas ya han mencionado, pero en mi opinión es su trabajo para proporcionarle el adecuado y, potencialmente, también algunos periféricos requeridos/similares para la prueba.

Los simuladores también son posibles hasta cierto punto, pero es posible que deba caracterizar algunos sensores/datos del mundo real que pueda obtener. Aquí el equipo de hardware también necesita al menos ayudarlo.

Aparte de eso, el diseño del software ya se puede hacer y todos los módulos de alto nivel se pueden (y deberían) implementar y probar sin el hardware real. Idealmente, también definirá una API junto con el equipo de hardware, y le proporcionarán las funciones de nivel más bajo, por lo que cualquier cambio que hagan en el lado del hardware allí (por ejemplo, simplemente redefinir qué pines de puerto usan), no siempre será ser crítico contigo.

En todos los casos, la comunicación es clave.

Sí, puede desarrollar su código para su tablero de destino antes de que se fabriquen.

Cómo ?

Primero hay que saber cuál es el objetivo principal de ese sistema. Entonces, a partir de esto, puede elegir el controlador de manera adecuada de una amplia fuente de disponibilidad como digikey, mouser.

Y elige un simulador como Proteus. Esto simulará el procesador/controlador exacto ahora que puede comenzar su codificación. Pero no puede esperar la precisión como en el hardware.

¿Por qué votar negativo? ¿Puedo saber cuál es el problema con esta respuesta?