Estoy trabajando en un servocontrolador en serie como parte de un proyecto de robot hexapod y el código ha llegado al punto en que se está volviendo complicado;) De todos modos, estoy acostumbrado a usar pruebas unitarias en mi trabajo diario como desarrollador de servidores C ++ y así que he estado intentando aplicar los mismos tipos de pruebas a mi código de ensamblaje AVR He trabajado de una manera que funciona bien para mí (ver aquí ) pero estoy interesado si hay alguna herramienta o técnica estándar que me falta.
Actualizado: para aquellos de ustedes que estén interesados, la fuente completa del servocontrolador y las pruebas unitarias ahora están disponibles aquí .
También describiría esto como elegante, pero me gustaría agregar el problema, si perdonas mi intrusión.
Sé que hay paquetes de software muy caros para trabajar en situaciones como esta, pero en la empresa donde trabajo no podemos pagar el costo a menos que estemos seguros de que hace lo que necesitamos.
Test Driven Development (TDD) es uno de los mejores sistemas de los que he oído hablar para el desarrollo, y lo disfruto, pero los problemas que toman mi tiempo normalmente son causados por interrupciones complejas y eventos de hardware que muchos llamarían fallas. Parece algo menor tener un problema cada 2 horas cuando las estrellas se alinean, pero si su teléfono se congela una vez por semana, maldeciría el nombre de los ingenieros. En nuestro caso, tenemos que caminar hacia un lote de alimentación cuando las cosas realmente se rompen, lo que, como pueden imaginar, me gusta evitar.
He visto soluciones muy inteligentes para verificar la funcionalidad de los subsistemas, que, si se implementan correctamente, probablemente me ahorrarían 3 horas de una semana laboral de 50 horas, pero si hubiera una forma inteligente de encontrar situaciones de fallas me ahorraría semanas de trabajo. buscando el "error" que ocurre en el campo ocasionalmente bajo una carga pesada.
Esta publicación probablemente no ayuda mucho, pero creo que sacar todo a la luz hace que todo sea más fácil de resolver. Si hubiera un método TDD para encontrar situaciones de falla, podría obtener 10s de miles asignados para pagarlo. -Max
Realmente no he pensado en probar la interacción entre el código de interrupción y el código sin interrupción. Es un buen punto. Estaba planeando probar mi código de interrupción del temporizador de generación PWM fuera de una situación de interrupción de una manera similar a la forma en que estoy probando mi código de serie de la línea principal. Supongo que incluso una vez que tengo cobertura para todo eso, todavía me falta la interacción. Supongo que podría desencadenar interrupciones desde las pruebas (es fácil con la interrupción del temporizador, pero todo el código de interrupción podría configurarse para ejecutarse en una interrupción del temporizador dentro del arnés de prueba). Aunque no es trivial.
Len Holgate
1
Puedo malinterpretarte, pero trato de tener mucho cuidado con las interacciones de código de interrupción y sin interrupción. Probablemente debería ser más laxo en mi uso de las operaciones atómicas, pero nunca se ha demostrado que cause daño en el nivel que tengo nuestro optimizador. Los problemas surgen cuando una interrupción retrasa a otra, una común con la que ayudo a los estudiantes sería la generación de PWM impulsada por interrupciones. Si necesita una velocidad extremadamente precisa, por ejemplo, utilizando un módulo Comparar en su chip, y otra interrupción está ocupada gastando tiempo en otra cosa y lo retrasa en 50uS que podrían estar terminando el mundo.
Kortuk
1
En algunos casos, puede tener prioridad, o incluso puede hacer que una interrupción se desactive y vuelva a habilitar las interrupciones globales internamente, dependiendo de la plataforma, pero la ruta más fácil para mi propio desarrollo es limitar el tiempo de interrupción a cosas absolutamente necesarias y hacer que el código normal lo haga El resto del trabajo.
Kortuk
1
Mi diseño actual se explica en mi blog, al igual que un nuevo diseño propuesto. En este momento tengo 64 canales de PWM generados por una interrupción del temporizador y ninguna otra interrupción; La serie se realiza mediante sondeo. Esto significa que el PWM es sólido como una roca, pero la serie puede tener problemas. Mi nuevo diseño usaría interrupciones para UART, así como el temporizador para la generación de PWM y la recreación cuidadosa y el bloqueo de las interrupciones para garantizar un procesamiento de PART sin fallas y UART sin fallas ...
Len Holgate el
2
Estaba usando el PWM como ejemplo, el sistema en el que he tenido este problema tiene 3 interfaces SPI con 1 de las conexiones SPI que tienen 3 chips que usamos en él. Hay 4 interrupciones de puerto diferentes que informan sobre el cambio en el estado de los chips externos y algunas otras cosas que suceden. El problema empeora cuanto más interfaces tenga.
Kortuk
2
Interesante. Después de Navidad, estaba pensando en hacer un ensamblador con fotos, cuando tenga un poco más de tiempo echaré un buen vistazo a su sistema.
Una forma en que podría ver sería escribir algún tipo de marco en un idioma diferente para crear y derribar los objetos simulados, etc., pero la forma en que interactuaría esto con el chip / simulación sería un problema.
Sin embargo, si se vuelve demasiado oneroso, eso superará los beneficios de las pruebas unitarias y también hará que tenga menos ganas de usarlo.
Hacer que funcionara dentro del simulador fue mi obstáculo inicial hasta que descubrí cómo separar el código en archivos separados y simplemente "burlarme" de algunas de las etiquetas a las que saltaría en el código real. Publicaré todo una vez que haya terminado. La adaptación de las pruebas unitarias al código lleva un tiempo, pero ha valido la pena.
Len Holgate el
Ahora que he tenido la oportunidad adecuada de analizar su metodología, creo que es bastante elegante. Tal vez echaré un vistazo a los avrs después de Navidad, ya que parece que hay muchas más cosas basadas en la comunidad para ellos que para las fotos. Alguna idea de lo que podría ser un IDE Linux decente para la programación de AVR Assembler.
Amós
1
Hay una cadena de herramientas GNU que puede usar en lugar de AVR Studio (que es el conjunto de herramientas gratuito de Atmel). Probablemente sea posible ejecutar eso en Linux, pero no lo he necesitado.
Len Holgate el
Acabo de encontrar este enlace a un artículo de Linux Journal sobre el desarrollo para AVR en Linux: linuxjournal.com/article/7289
Len Holgate
Mi principal preocupación con ese artículo es que es de 2005 y, por lo tanto, puede estar desactualizado.
Interesante. Después de Navidad, estaba pensando en hacer un ensamblador con fotos, cuando tenga un poco más de tiempo echaré un buen vistazo a su sistema.
Una forma en que podría ver sería escribir algún tipo de marco en un idioma diferente para crear y derribar los objetos simulados, etc., pero la forma en que interactuaría esto con el chip / simulación sería un problema.
Sin embargo, si se vuelve demasiado oneroso, eso superará los beneficios de las pruebas unitarias y también hará que tenga menos ganas de usarlo.
fuente