18 votos

¿Por qué printf() malo para la depuración de sistemas embebidos?

Supongo que es una mala cosa para intentar depurar un microcontrolador basado en proyectos utilizando printf().

Puedo entender que usted no tiene ningún lugar predefinido para la salida, y que podría consumir valioso pines. Al mismo tiempo, he visto como la gente consume una UART TX pin de salida para el IDE terminal con un custom DEBUG_PRINT() macro.

25voto

Spehro Pefhany Puntos 90994

Me puede venir para arriba con un par de desventajas del uso de printf(). Tenga en mente que el "sistema integrado" puede ir desde algo con unos pocos cientos de bytes de memoria de programa para un completo soplado de montaje en rack de QNX RTOS sistema accionado con gigabytes de memoria RAM y terabytes de memoria no volátil.

  • Se requiere de un lugar para enviar los datos. Tal vez usted ya tiene un depuración o puerto de programación en el sistema, tal vez no. Si no (o el que tiene no funciona) no es muy práctico.

  • No es un peso ligero de la función en todos los contextos. Esta podría ser una gran cosa si usted tiene un microcontrolador con sólo un par de K de memoria, debido a la vinculación en printf podría comer hasta 4K por sí mismo. Si usted tiene un 32K o 256 KB microcontrolador, probablemente no es un problema, y mucho menos si tienes un gran sistema embebido.

  • Es de poca o ninguna utilidad para encontrar ciertos tipos de problemas relacionados con la asignación de memoria o de interrupciones, y puede cambiar el comportamiento del programa cuando las declaraciones se incluyen o no.

  • Es bastante inútil para tratar con el tiempo-sensible de las cosas. Estaríamos mejor con un analizador lógico y un osciloscopio o un analizador de protocolo, o incluso un simulador.

  • Si usted tiene un gran programa y tienes que volver a compilar tantas veces como desee cambiar printf declaraciones alrededor y cambio, se podría perder un montón de tiempo.

Lo que es bueno por que es una forma rápida a los datos de salida en un formato manera que cada programador de C sabe cómo usar el cero de la curva de aprendizaje. Si usted necesita para escupir una matriz para el filtro de Kalman estés en modo de depuración, también podría ser bueno para escupirlo en un formato que MATLAB pueda leer en. Sin duda mejor que ver la RAM lugares al mismo tiempo y en un depurador o emulador.

Yo no creo que sea un inútil flecha en el carcaj, pero debe ser usado con moderación, junto con gdb o otros depuradores, emuladores, analizadores lógicos, osciloscopios, herramientas de análisis de código estático, cobertura de código, herramientas y así sucesivamente.

20voto

shash Puntos 668

Además de algunas otras respuestas, el acto de envío de datos a un puerto en serie de las tasas de baudios sólo puede ser francamente lento con respecto a su tiempo de loop, y tienen un impacto en la forma en que el resto de su programa de funciones (como CUALQUIER proceso de depuración).

Como otras personas han estado diciendo, no hay nada "malo" sobre el uso de esta técnica, pero sí, como muchas otras técnicas de depuración, tiene sus limitaciones. Siempre y cuando usted sabe y puede lidiar con estas limitaciones, puede ser extremadamente conveniente posibilidad para ayudarle a obtener el código correcto.

Sistemas integrados tienen una cierta opacidad que, en general, hace que la depuración de un poco de un problema.

6voto

Morris Maynard Puntos 49

Hay dos problemas principales que se ejecutan en el intento de uso printf de un microcontrolador.

En primer lugar, puede ser un dolor a la tubería de la salida al puerto correcto. No, no siempre. Pero algunas plataformas son más difíciles que otros. Algunos de los archivos de configuración pueden ser mal documentada y una gran cantidad de experimentación puede ser necesario.

La segunda es la memoria. Un completo soplado printf biblioteca puede ser GRANDE. A veces, usted no necesita todos los especificadores de formato y aunque especializado versiones pueden estar disponibles. Por ejemplo, el stdio.h proporcionado por AVR contiene tres diferentes printf's de diferentes tamaños y funcionalidades.

Desde la plena aplicación de todos los rasgos mencionados se convierte en bastante grande, de tres diferentes sabores de vfprintf() puede ser seleccionado utilizando las opciones del vinculador. El valor predeterminado vfprintf() implementa todas las mencionó funcionalidad, excepto de punto flotante de conversiones. Una minimizado la versión de vfprintf() que sólo implementa de forma muy básica entero y conversión de cadena de servicios, pero sólo el #adicional la opción se puede especificar el uso de los indicadores de conversión (estos indicadores son analizados correctamente a partir de la especificación de formato, pero luego simplemente se ignoran).

Tuve un caso en el que ninguna biblioteca estaba disponible y he tenido un mínimo de memoria. Así que no tuve más remedio que usar una macro personalizada. Pero el uso de printf o no es realmente de lo que se ajuste a sus requisitos.

3voto

Herms Puntos 13069

La mayor razón para la no depuración con printf() es que suele ser ineficaces, inadecuados e innecesarios.

Ineficiente: printf() y kin utilizar una gran cantidad de flash y RAM en relación a lo que está disponible en un microcontrolador pequeño, pero la mayor ineficiencia en el proceso de depuración. El cambio de lo que se registra requiere recompilar y la reprogramación de la meta, lo que ralentiza el proceso. También utiliza una UART que de lo contrario, podría estar utilizando para hacer el trabajo útil.

Insuficiente: sólo Hay tanto detalle que puede de salida a través de un enlace serial. Si el programa se bloquea, no sé exactamente donde, sólo la última salida que ha completado.

Innecesario: Muchos de los microcontroladores se puede depurar de forma remota. JTAG o protocolos propietarios pueden utilizar para detener el procesador, echa un vistazo a los registros y la memoria RAM, e incluso alterar el estado de la ejecución del procesador sin tener que volver a compilar. Esta es la razón por la que los depuradores son generalmente una mejor manera de depuración de instrucciones de impresión, incluso en un PC con un montón de espacio y energía.

Es lamentable que los más comunes microcontrolador de la plataforma para los novatos, Arduino, no tiene un depurador. El AVR admite la depuración remota, pero Atmel del debugWIRE protocolo es de propiedad exclusiva y de indocumentados. Usted puede utilizar un oficial dev junta de depuración con GDB, pero si usted tiene que usted probablemente no está demasiado preocupado acerca de Arduino ya.

3voto

Alex Andronov Puntos 178

Incluso si uno quiere escupir datos en algún formulario de registro de la consola, el printf función no es generalmente una muy buena manera de hacer esto, ya que es preciso examinar el pasado de cadena de formato y analizar en tiempo de ejecución; incluso si el código no utiliza ningún especificador de formato distinto %04X, el contralor general necesita incluir todo el código que serían necesarios para analizar arbitraria cadenas de formato. Dependiendo del controlador exacto uno está usando, puede ser mucho más eficiente utilizar el código algo así como:

void log_string(const char *st)
{
  int ch;
  do
  {
    ch = *st++;
    if (ch==0) break;
    log_char(ch);
  } while(1);
}
void log_hexdigit(unsigned char d)
{
  d&=15;
  if (d > 9) d+=7;
  log_char(d+'0');
}
void log_hexbyte(unsigned char b)
{ log_hexdigit(b >> 4); log_hexdigit(b); }
void log_hexi16(uint16_t s)
{ log_hexbyte(s >> 8); log_hexbyte(s); }
void log_hexi32(uint32_t i)
{ log_hexbyte(i >> 24); log_hexbyte(i >> 16); log_hexbyte(i >> 8); log_hexbyte(i); }
void log_hexi32p(uint32_t *p) // On a platform where pointers are less than 32 bits
{ log_hexi32(*p); }

En algunos microcontroladores PIC, log_hexi32(l) probablemente tendría 9 instrucciones y puede tomar 17 (si l está en el segundo banco), mientras que log_hexi32p(&l) tendría un 2. El log_hexi32p función en sí misma podría ser escrito para ser de aproximadamente 14 instrucciones de largo, por lo que tendría que pagar por sí mismo si llama dos veces.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X