## c't-Projekte - Mailinglisten

[Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)]
[Nach Datum][Nach Thread]

### Re: [ct-bot] CMUcam3 Implementierung

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` ``

- Referenzen:
  - AW: [ct-bot] SPI-Hardwareumbau
    - From: Frank Menzel
  - [ct-bot] CMUcam3 Implementierung
    - From: Harald W. Leschner

- Voriger (Datum): Re: [ct-bot] Pfadplanungsverhalten..., Timo Sandmann
- Nächster (Datum): [ct-bot] Re: Doku Pfadplanung, Timo Sandmann
- Voriger (Thread): Re: [ct-bot] CMUcam3 Implementierung, Harald W. Leschner
- Nächster (Thread): Re: [ct-bot] SPI-Hardwareumbau, Timo Sandmann
- Indizes:
  - Datum
  - Thread