Absender: Timo Sandmann
Datum: Mo, 20.10.2008 13:52:46
In-reply-to:
<48CE9D77.8090201@xxxxxxx>
References:
<000001c91695$89998e50$0200a8c0@mexpnew> <48CE9D77.8090201@xxxxxxx>
Hi, Am 15.09.2008 um 19:37 schrieb Harald W. Leschner:
... Nun zum eigentlichen Problem: Lässt man die Kamera im IDLE-Mode, fährt der Bot normal. Aktiviert man die Trackingfunktion, scheint dieGeschwindigkeitsregelung völlig rumzuspinnen und der Bot dreht total ab,ruckelt und stottert. Stoppt man das Tracking, ist es manchmal wieder ok, manchmal sind dann aber auch nach einem Reset oder An/Aus die PWM Werte völlig zerschossen, man muss den Bot neu programmieren. Ich nehme an, die UART des Bots arbeitet absolut zuverlässig, denn bei Übertragungen an den Sim fährt er ja auch normal. Kann sich einer vonEuch mal den Code angucken und mir sagen, ob vielleicht ein Fehler drin ist, den der Compiler nicht erkennt, oder überhaupt vielleicht Ideen fürdas geschilderte Verhalten geben?
ich habe mir den Code mal ein bisschen angesehen, auffällig ist, dass du sehr viele lokale Puffer benutzt, teilweise unterschiedlicher Größe, zwischen denen immer hin und her kopiert wird. Das ist sehr fehleranfällig, wenn man nicht sicherstellt, dass die Grenzen auch eingehalten werden. Das beschriebene Fehlverhalten lässt darauf schließen, dass einer dieser Puffer auf dem Stack überschrieben wird, was dann dieses merkwürdige Verhalten auslöst. Hier z.B. scheint sich auch ein Fehler eingeschlichen zu haben (cc3_parse_retval):
for(i=2; i<strlen(cc3_answ_buf)+1; i++) { if (isdigit(cc3_answ_buf[i])) { cur_num[j] = cc3_answ_buf[i]; cur_num[j+1] = 0;Mit i = strlen() + 1 kommst du über die zulässige Grenze des Puffers hinaus, selbst wenn in cc3_answ_buf ein gültiger String liegt. Vielleicht war eher - 1 gemeint?
Ich würde aber so oder so davon abraten, so viele Puffer zu verwenden, das dauernde Umkopieren der Daten braucht viel zu viel Zeit und natürlich auch RAM. Ebenso ist der Rückgabetyp "cmucam3_retval", das ein struct ist, in dem u.a. wieder ein 20 Byte großes Array ist, für Funktionen sehr ineffizient (muss komplett von einem Stack auf den anderen kopiert werden). Ich weiß auch nicht, ob der avr-gcc hier immer das macht, was man erwartet - Kopien ganzer Arrays werden im AVR- Umfeld sicher sehr sehr selten von Funktionen zurückgegeben.
Zum Debugging würde ich dir empfehlen, im RC5-Handler erstmal den ganzen Aufruf der Tracking-Funktion auszukommentieren, dann sollte es beim Tastendruck keinen Absturz geben. Anschließend in der ersten aufgerufenen Funktion alles ab Zeile 2 auskommentieren - wenn's immer noch funktioniert, schrittweise den Code wieder einkommentieren. Irgendwann wird der Fehler auftreten und dann weißt du, wo du suchen musst.
Trotzdem würde ich die ganze Geschichte mit den vielen Puffern überdenken - vermutlich wird das so nie effizient genug, dass der Bot angemessen schnell auf die Ergebnisse der Cam reagieren kann.
Vielleicht hilft das schon mal weiter. Viele Grüße,Timo