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

2

Intento usar Sky Mote (MSP430 F1611 + CC2420) para leer los datos del sensor I2C con una frecuencia de muestreo de 100Hz 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 78Hz. Utilicé rtimer para crear un perfil de mi código de muestreo e impresión y descubrí que la función de impresión ralentiza todo el proceso. Aquí hay algunas salidas 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 ticks por un segundo. Aquí podemos ver claramente que la impresión lleva aproximadamente 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 de transmisión es de 115200 (velocidad de transmisión máxima). La muestra del sensor contiene 112 bits con signo int.

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 proporcionar algunas sugerencias.

    
pregunta cloudfarm

1 respuesta

1

En primer lugar, ¿está utilizando un puerto serie CDC USB o un UART alimentando un convertidor USB UART- > Si este último su velocidad en 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 personaje para cada mordisco. Una tabla de búsqueda probablemente sería la opción más rápida.

    
respondido por el user

Lea otras preguntas en las etiquetas