|
c't Projekte - c't-Bot und c't-Sim -
Mailinglisten
[Voriger (Datum)]
[Nächster (Datum)]
[Voriger (Thread)]
[Nächster (Thread)]
[Nach Datum][Nach Thread]
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 die
Geschwindigkeitsregelung 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 von
Euch mal den Code angucken und mir sagen, ob vielleicht ein Fehler
drin
ist, den der Compiler nicht erkennt, oder überhaupt vielleicht Ideen
für
das 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
|
|