Esto es más una publicación de blog, pero aquí va:
Si escribe en C, puede compilar su código y ejecutarlo en su escritorio. Esto no probará los controladores de hardware de bajo nivel, pero puede probar todo el código lógico.
Recomendaciones sobre este enfoque:
- Si estás en ARM, puedes usar el mismo compilador (gcc) para ambos propósitos. Entonces, cualquier extensión específica del compilador seguirá funcionando.
- Pero las extensiones específicas del compilador son indeseables, por lo que puede compilar la versión de escritorio con Clang / LLVM (con el beneficio de mejores mensajes de error).
- Mi escritorio es una PC con Linux. Nada en este enfoque es específico de Linux. Pero Linux seguro hace un buen entorno de desarrollo en C.
- Use
stdint.h
y tipos como uint64_t
, en lugar de " unsigned long int
". Esto le permite obtener el mismo comportamiento cuando se compila en diferentes sistemas.
- Pero ten cuidado con la promoción de enteros de C. Si es posible (está en ARM) use una PC de 32 bits para probar el código ARM de 32 bits.
- Con respecto a los controladores de hardware, he encontrado dos enfoques que son beneficiosos.
- Haz un prototipo en vivo en la PC. La PC tiene un reloj en tiempo real y una conexión de red y una pantalla y entradas, por lo que se cuidan. (Mi PC incluso tiene un acelerómetro). Puede usar libSDL para animar una imagen de su producto final y recibir pulsaciones de teclas. Para otras funciones de su placa, conecte las placas de desarrollo o falsifíquelas. La ventaja de este enfoque es que puede usarlo en el sistema en vivo y ahorrarse la molestia de hacer hardware si encuentra que no resuelve el problema que necesita resolver.
- Cree un prototipo muerto que lea los eventos de entrada de un archivo y escriba los eventos de salida en un archivo. Ahora, para la prueba, puede registrar (o sintetizar) los eventos que corresponden a los escenarios específicos que desea probar. Y luego puedes verificar que las cosas correctas están escritas en la salida. La ventaja de esto es que deja un conjunto de pruebas totalmente automatizado que puede ejecutar en el momento de la creación para capturar regresiones.
- Use las opciones del compilador -Wall -Wextra -Werror y mantenga su código libre de advertencias. Pasará algún tiempo parchando advertencias, pero hace que la codificación sea más rápida al reducir el tiempo de depuración.
- Compile la versión para PC usando mudflaps . Esto atrapa un montón de travesuras puntero. Algunas personas recomiendan Valgrind, pero no es tan útil para el código que nunca usa
malloc()
o free()
.
- Para la depuración de PC, use GDB o DDD o
printf()
, para probar. Hay una gran variedad de herramientas de depuración de escritorio maduras y útiles disponibles.
- Incluso si no hago la configuración completa de depuración de PC, a menudo incluiré una función de prueba de unidad co2de% al final de un archivo que está
main()
'd out. Este #define
intenta cualquier función complicada en el archivo y devuelve 0 para all-pass o main()
para fallar. Luego agrego un objetivo de "prueba" en el makefile que compila y ejecuta cada una de las pruebas de los archivos individuales.
- Hay muchas plataformas de prueba de unidades que puedes usar. Hay tantos porque son muy fáciles de escribir. Yo no los uso. No quiero un informe bonito de "pruebas de porcentaje aprobadas". Quiero que mi prueba muera en el primer fracaso. Visual Basic solía tener una función risible llamada ' en el resumen de error siguiente '. No sé por qué querría esa característica para las pruebas unitarias.
Si realiza la prueba de unidad independiente de esta manera, encontrará que tiene muy poca necesidad de depuración en el chip. Además, encontrará que portar a diferentes plataformas de hardware es mucho más fácil porque la lógica central y los controladores de hardware están bien separados.