MSP430 printf-Funktion wird zu langsam ausgeführt [geschlossen]

Ich versuche, Sky mote (MSP430 F1611 + CC2420) zu verwenden, um die Daten vom I2C-Sensor mit einer Abtastfrequenz von 100 Hz zu lesen und die Daten auf die serielle Schnittstelle (USB) zu schreiben. Ich habe ein paar Tests durchgeführt und festgestellt, dass die gesamten Ausgangsdaten eine Abtastfrequenz von 78 Hz haben. Ich habe rtimer verwendet, um meinen Sampling- und Druckcode zu profilieren, und festgestellt, dass die Druckfunktion den gesamten Prozess verlangsamt. Hier sind einige Profiling-Ausgaben:

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

Der Rtimer hat 4098*8 Ticks für eine Sekunde. Hier können wir deutlich sehen, dass der Druck etwa 560 Ticks (17 ms) dauert. Wenn die Abtastfrequenz 100 Hz beträgt, sollte die Druckfunktion innerhalb von 10 ms (327 Ticks) abgeschlossen sein.

Das eingebettete System, das ich verwende, ist Contiki OS und die Baudrate beträgt 115200 (maximale Baudrate). Das Sensorbeispiel enthält 112-Bit-Signed-Int.

Hier ist mein Code:

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());

Ich hoffe, dass einige Leute mit Erfahrung in der Optimierung von printf oder UART im Allgemeinen einige Vorschläge machen können.

Ich sehe kein '?' in deinem Beitrag.
Möglicherweise stellen Sie fest, dass jeweils ein Byte gesendet wird. Versuchen Sie snprintf in einen Puffer und drucken Sie dann den Puffer.
Eingebaute printf-Funktionen usw. können oft ziemlich langsam sein, da sie für allgemeine Zwecke und nicht immer die effizientesten für die jeweilige Aufgabe sind. Schauen Sie sich die Quelle an und sehen Sie, ob Sie eine schnellere und spezifischere Routine erstellen können.
Dieser Raum ist für Fragen reserviert. Dies ist keine Show-and-Tell-Site.

Antworten (1)

Verwenden Sie erstens einen seriellen USB-CDC-Anschluss oder einen UART, der einen UART-> USB-Konverter speist? Im letzteren Fall ist Ihre Baudrate möglicherweise zu niedrig.

Sie können die Ausgabe von Hex-Werten optimieren, indem Sie davon ausgehen, dass Sie immer 4 Zeichen drucken möchten. Dann ist es ein einfacher Fall, für jedes Nibble ein Zeichen zu erzeugen. Eine Nachschlagetabelle wäre wahrscheinlich die schnellste Option.

Ich denke, es ist letzterer Fall. Ich schaue mir jedoch den Quellcode an, wo die Baudrate definiert ist, 115200 ist die größtmögliche Rate. Ich habe versucht, auf 230400 zu erhöhen, aber es ist ein Fehler aufgetreten.