La función printf de MSP430 se ejecuta demasiado lentamente [cerrado]

Intento usar Sky mote (MSP430 F1611 + CC2420) para leer los datos del sensor I2C con una frecuencia de muestreo de 100 Hz y escribir los datos en el puerto serie (USB). Probé un par de pruebas y me di cuenta de que los datos de salida totales tienen una frecuencia de muestreo de 78 Hz. Usé rtimer para perfilar mi código de muestreo e impresión y descubrí que la función de impresión ralentiza todo el proceso. Aquí hay algunos resultados de perfiles:

start 50628
15490,f074,20,3b8c,ffab,49,ffcf,fb70
end 51189
start 51293
15491,f0a8,fff4,3ba4,ffc6,24,ffd8,fb90
end 51880
start 51984
15492,f094,20,3b30,ffa7,5b,fff3,fb70
end 52544
start 52647
15493,f118,bc,3ce0,ffab,70,fffc,fb90
end 53207
start 53311
15494,f030,1b0,3b44,ffa9,1f7,1f,fb80
end 53871

El rtimer tiene 4098*8 tics por segundo. Aquí podemos ver claramente que la impresión tarda unos 560 tics (17 ms). Si la frecuencia de muestreo es de 100 Hz, la función de impresión debe completarse en 10 ms (327 tics).

El sistema integrado que estoy usando es Contiki OS y la velocidad en baudios es 115200 (velocidad máxima en baudios). La muestra del sensor contiene 112 bits de int con signo.

Aquí está mi código:

mpu_data_union samples;
int m=mpu_sample_all(&samples);
printf("start %u\n",RTIMER_NOW());
printf("%lu,%x,%x,%x,%x,%x,%x,%x\n",
  counterxx,samples.data.accel_x,samples.data.accel_y,
  samples.data.accel_z,samples.data.gyro_x,
  samples.data.gyro_y,samples.data.gyro_z,
  samples.data.temperature);
printf("end %u\n",RTIMER_NOW());

Espero que algunas personas con experiencia previa en la optimización de printf o UART en general puedan brindar algunas sugerencias.

No veo un '?' en tu publicación
Puede encontrar que está enviando un byte a la vez; intente snprintf en un búfer y luego imprima el búfer.
Las funciones printf incorporadas, etc., a menudo pueden ser bastante lentas, ya que son de propósito general y no siempre son las más eficientes para el trabajo en cuestión. Eche un vistazo a la fuente y vea si puede hacer una rutina más rápida y específica.
Este espacio está reservado para preguntas. Este no es un sitio de mostrar y contar.

Respuestas (1)

En primer lugar, ¿está utilizando un puerto serie USB CDC o un UART que alimenta un convertidor UART->USB? Si es lo último, su tasa de baudios puede ser demasiado baja.

Puede optimizar la salida de valores hexadecimales suponiendo que siempre desea imprimir 4 caracteres. Entonces es un caso simple de generar un carácter para cada mordisco. Una tabla de búsqueda probablemente sería la opción más rápida.

Creo que es el último caso. Sin embargo, miro el código fuente donde se define la tasa de baudios, 115200 es la tasa más alta posible. Intenté aumentar a 230400 pero ocurrió un error.