[anchor pa01][/anchor] [frage]Wie kommt man zu Schreibrechten beim CVS?[frage]
[antwort]Erst einmal noch gar nicht. Aber wir freuen uns über gut getestete und dokumentierte Patches, die uns per E-Mail unter ct-sim@heise.de erreichen. Ob wir besonders aktiven Entwicklern später einen direkten Zugang zum CVS gewähren können, wird sich zeigen — nicht zuletzt anhand der Qualität der eingesandten Patches.[/antwort]
[anchor pa02][/anchor] [frage]Wie erstelle ich einen Patch in Eclipse?[frage]
[antwort]Ein Patch besteht aus einer Textdatei, die alle Unterschiede zwischen der lokalen Kopie des Codes und dem aktuellen Stand des CVS-Repositories aufführt. Haben Sie an einem oder mehreren Source-Files des c't-Sim etwas geändert, so stellen Sie zunächst über "Team/Synchronize with Repository" sicher, dass Eclipse der aktuelle Zustand des Codes im CVS bekannt ist. Um Ihre lokalen Änderungen in einen Patch zu verpacken, wählen Sie "Team/Create Patch..." Anschließend wählen Sie einen sprechenden Dateinamen für Ihren Patch (z.B. "zeitlupe.txt") und suchen sich einen Ort zum Speichern auf Ihrem System aus. Das "Diff output format" sollte "Unified" sein, das erleichtert hinterher anderen Nutzern, Ihren Patch zu übernehmen.
Dokumentieren Sie Ihren Patch — so fällt es uns und den anderen Lesern leichter zu verstehen, inwiefern Ihre Erweiterung den Simulator verbessert. Zum einen sollten Sie einen kurzen Text beilegen, der als Beschreibung auf der Projektseite veröffentlicht werden kann und — bei Übernahme ins offizielle Release — Eingang in die Changelog-Datei finden soll. Im Quellcode Ihrer neuen Funktionen selbst sollten ausführliche Javadoc-konforme Kommentare zu finden sein. Bei neuen Methoden können Sie sich unter dem Tag "@author" mit Namen und E-Mail-Adresse verewigen.
Um einen Patch einzuspielen, wählen Sie unter "Team/Apply Patch" den Ordner des Projekts aus, das Sie erweiteren wollen (z.B. ct-Sim). Den Pfad zur Patch-Datei können Sie entweder per Hand einfügen oder Sie suchen die Datei über "Browse...". Wird Ihnen im nächsten Schritt gemeldet, bestimmte zu erweiternde Dateien würden nicht existieren, ist wahrscheinlich der falsche Ordner ausgewählt. "Finish" schließt den Vorgang ab. Weitere Details lassen sich in der Hilfe von Eclipe ("Working with patches") nachlesen.[/antwort]
[anchor pa03][/anchor] [frage]Wie erstelle ich Patches, die sich auf wesentliches konzentrieren und nicht alle meine Experimente enthalten?[/frage]
[antwort]Damit die Patches möglichst kompatibel zueinander sind und überschaubar bleiben, sollten sie schlank sein. Ein Patch pro Thema. Insbesondere Formatierungsänderungen usw. blähen den Patch stark auf und machen ihn im Zweifelsfall inkompatibel zu anderen.
Wir empfehlen, das Repository zweimal aus dem CVS in Eclipse zu importieren. Einmal zum beliebigen eigenen Experimentieren, einmal um die fertig debugten Ergebnisse zum Export vorzubereiten.
Im "privaten"-Repository bastelt und experimentiert man. Dann erstellt man einen Patch und spielt ihn in sein "export"-Repository ein. Dabei kann man sehr einfach und detailliert auswählen, welche Teile man übernehmen will. Am Ende erstellt man aus dem "export"-Repository wieder einen Patch, den man bei uns einreicht. Patch-Dateien sind übrigens reine ASCII-Files, man kann zur Not auch mit einem Texteditor noch Teile löschen.
Bei allen Änderungen bitte die Changelog-Einträge nicht vergessen.[/antwort]
[anchor pa04][/anchor] [frage]Warum eigentlich Eclipse und nicht Visual Studio, Jbuilder, WinAVR, CodeWarrior oder Programmierumgebung XYZ?[/frage]
[antwort] Der Code für c't-Bot und c't-Sim setzt sich aus zwei Teilen zusammen, die in verschiedenen Sprachen geschrieben wurden (C und Java). Der Code läuft auf zwei verschiedenen CPU-Architekturen (x86 und AVR) und zwei Betriebssystemen (Linux und Windows). Das ergibt eine Vielzahl an Konstellationen. Um dennoch nicht den Überblick zu verlieren bietet sich eine Umgebung an, die auf allen Betriebssystemen verfügbar ist und alle Codeversionen verwalten kann. Auch ein Debugging aller Zielsysteme sollte möglich sein. Des Weiteren sollte die Entwicklungsumgebung Lesern die Möglichkeit geben ständig am aktuellen Code mitzuarbeiten und eigene Vorschläge als Patches einzureichen. Um die Dokumentation eines solchen Projektes sollte sich die IDE ebenfalls kümmern.
Eclipse gibt es für Linux und für Windows. Es ist selbst eine Java-Applikation und kann von Haus aus mit Java-Source-Code umgehen. Zum Übersetzen bindet es den Compiler aus einem Java JDK ein. Für den C-Code greift es auf den gcc zurück. Dieser wiederum kann Binaries für Windows, Linux und den Mikrocontroller übersetzen. Andere Entwicklungsumgebungen bringen teils auch andere Compiler mit. Ob diese sich mit unserem Code vertragen ist nicht getestet.
Eclipse greift direkt, ohne umständliche Tools auf unser Code-Repository (CVS) zu und erstellt im Handumdrehen Patches. Diese können wir nach Prüfung bequem importieren. Inoffizielle Patches kann jeder selbst bequem einspielen. Die beiden Hilfsprogramme javadoc und doxygen integrieren sich nahtlos in Eclipse und generieren aus dem Quelltext die Dokumentation.
Des Weiteren ist Eclipse mit den nötigen Hilfspaketen in der Lage Code für jede dieser Plattformen im Einzelschrittmodus zu debuggen. Der Mikrocontroller wird dabei komplett emuliert. Wenn man möchte kann man eclipse sogar das Flashen des Mikrocontrollers beibringen. Als letzter Punkt bleibt anzumerken, dass alle hier vorgestellten Werkzeuge kostenlos sind.
Wer sich dennoch nicht mit Eclipse anfreunden kann, muss selbst experimentieren. Für Puristen, die zum C-Programmieren nur einen Editor und eine Kommandozeile brauchen, haben wir allerdings ein Makefile vorbereitet. Dankenswerter Weise hat ein Leser ein entsprechendes Ant-File für den Java-Teil beigesteuert.[antwort]
[anchor pa05][/anchor] [frage]Muss ich alle Pfade für das C-Projekt ct-Bot unter Eclipse immer wieder neu an mein eigenes System anpassen, wenn ich die aktuelle Version aus dem CVS heruntergeladen habe?[/frage]
[antwort]Eclipse legt diese Pfade in einer Datei namens .cdtbuild ab, die direkt im Wurzelverzeichnis des Projekts legt, also beispielsweise in ...\workspace\ct-Bot\. Diese Datei wird normalerweise bei jedem Auslesen des CVS erneut überschrieben. Man kann das verhindern, indem man im gleichen Verzeichnis eine Datei namens .cvsignore anlegt (Dateiformat: Plain text Ascii). Das CVS überspringt beim Aktualisieren alle Dateien und Verzeichnisse, die in dieser Datei aufgeführt werden (jeweils durch Zeilenumbrüche getrennt). Schreibt man also in .cvsignore den Dateinamen .cdtbuild hinein, verändert CVS die Projektpfade beim nächsten Auslesen nicht mehr.[/antwort]
[anchor pa06][/anchor] [frage]Ab wann lohnt es sich einen Patch einzuschicken?[/frage]
[antwort]Das hängt von der Art des Patches ab: Bugfixes: Wer einen Fehler findet und sicher ist, dass seine Lösung funktioniert, sollte ihn uns umgehend schicken, damit andere nicht in die gleichen Probleme laufen.
Feature-Adds: Sinnvolle neue Features nehmen wir ebenfalls immer gerne entgegen. Beispiele für Erweiterungen von Lesern, die bereits aufgenommen wurden sind: das Verhalten bot_glance(), die Little/Big-Endian-Unterstützung, aber auch der Support für mehr als einen Screen oder das Remote-Display und die Flash-Skripte. Wichtig ist hier, dass sie gut getestet sind.
Eigene Anpassungen: wie veränderte Listen der RC5-Fernbedienungscodes, oder minimale Veränderungen dürften nur bedingt für andere von Interesse sein. Sie kommen meist nicht in den offiziellen Tree. Wir können Sie jedoch auf die Patches-Seite stellen, sofern genug Erklärung mitkommt.
Formatierungen: Was wir nicht einbauen können sind Patches nach dem Motto: "Ich hab mal eben alle Einrückungen etwas kleiner gemacht". Das liegt schlicht und ergreifend daran, dass diese Patches hunderte von Zeilen betreffen, die wir alle per Hand gegen das Original vergleichen müssen.
Insgesamt, sollte man vor dem Einreichen selbst abwägen:
Ein paar Beispiele für Patches, die sicherlich lohnen würden:
Alle weiteren Rahmenbedingungen stehen bereits in der FAQ und auf der Patches-Seite. Patches, die den Richtlinien nicht entsprechen, können wir nicht integrieren.[/antwort]
[pagebrek Programmierung c't-Bot]
[anchor pb01][/anchor] [frage]Mein c't-Bot fährt immer. Nur wenn ich die Abgrundsensoren abdecke hält er an. Was ist falsch?[/frage]
[antwort]Es passt dann lediglich die Konstante BORDER_DANGEROUS in der Datei bot-local.h nicht zu dem Untergrund, den die Abgrundsensoren sehen. Der Bot glaubt, immer einen Abgrund zu sehen und versucht zu fliehen. [/antwort]
[anchor pb02][/anchor] [frage]Ich habe ct-Bot-Projekt aus dem CVS ausgelesen und möchte es in Eclipse unter Windows kompilieren. Der Vorgang endet aber mit der Meldung, das die Datei ct-Bot.exe nicht erstellen kann ("make: Target 'all' not remade because of errors.") Woran liegt das?[/frage]
[antwort] Wenn das Kompilieren des C-Codes fehlschlägt, kann das eine Reihe von Ursachen haben. Prüfen Sie, ob in Eclipse unter "Project/Properties" bei "C/C++ build" die richtigen Pfade zu MinGW und Pthreads eingetragen sind, wie in der Installationsanleitung beschrieben. Fehlen die entsprechenden Karteireiter ganz, so ist CDT (C Development Toolkit) nicht oder nicht richtig installiert. Eventuell hilft es, Eclipse nach der Installation von neuen Plugins einmal neu zu starten.
Weiterhin ist darauf zu achten, dass die vollständige Version von MinGW installiert wird, bei der Standardversion fehlen entscheidende Teile wie ein benötigtes Makefile. Im Zweifellsfall prüfen Sie bitte, ob Sie unsere Installationsanleitung wirklich Schritt für Schritt durchgeführt haben.[/antwort]
[anchor pb03][/anchor] [frage]Wie erfasse ich neue RC5-Fernbedienungen?[/frage]
[antwort]Zuerst sollte man in der Datei rc5-codes.h dafür sorgen, dass die RC5-MASK so aussieht:
#define RC5_MASK (RC5_COMMAND|RC5_ADDRESS)
Und dann die Firmware nochmal neu in den Bot spielen. Im Normalbetrieb ignoriert der Bot den gesamten Adressbereich der RC5-Kommandos (#define RC5_MASK (RC5_COMMAND)), so erkennt er möglichst viele Fernbedienungen. Erfassen sollte man neue Codes jedoch vollständig. Hat man eine Liste mit den Codes der eigenen Fernbedienung fertig, indem man zum Beispiel die Werte aus dem Display des Bots abgeschrieben hat, so erstellt man in rc5-codes.h eine neue Sektion. Dabei lohnt es, eine vorhandenen als Vorlage zu verwenden.[/antwort]
[anchor pb04][/anchor] [frage] Warum enthält das CVS keine perfekt funktionierende Steuerung für den Bot?[/frage]
[antwort]Unsere Entwicklungsarbeit bei c't konzentriert sich darauf, einen geeigneten Rahmen für die Roboterprogrammierung zur Verfügung zu stellen — eine möglichst sichere und pfiffige Steuerung für den Bot zu entwickeln, ist nicht unser Ziel. Denn damit würden wir ja Ihnen, unseren Lesern, den größten Teil des Spaßes nehmen, der gerade darin besteht, eigene Routinen zu ersinnen, sie in Code umzusetzen und anschließend — im Simulator oder in der Realität — auszuprobieren.
Die von uns bisher in die Code-Basis eingepflegten Robotersteuerungen sind daher mit Absicht(!) alles andere als perfekt — sie sollen Anregungen und Ausgangspunkte für Verbesserungen von Ihrer Seite liefern, nicht fertige Lösungen bieten.
Gelungenen Steuercode von Leserseite, der uns als Patch per E-Mail erreicht (unter den Adressen ct-bot@heise.de bzw. ct-sim@heise.de) nehmen wir jedoch gerne in die Code-Basis auf, oder stellen sie zum Download bereit.[/antwort]
[anchor pb05][/anchor] [frage] Die Tasten meiner Fernbedienung sind anders beschriftet als die Vorlagen im Source-Code. Wie bezeichne ich die Tasten, um trotzdem die üblichen Funktionen nutzen zu können?[/frage]
[antwort]Um den Code verständlich zu halten, haben wir uns entschieden, dass jede Taste genau den Namen erhält, der aufgedruckt ist. Ein zweites #define-Statement kann dann diesen Code einer anderen Bedeutung zuordnen.
Angenommen auf der Fernbedienung gibt es keine Taste "DOWN" aber eine Taste "CH-", die man dafür umwidmen möchte. Dann sieht die Definition so aus:
#define RC5_CODE_CH_MINUS (0x1021 & RC5_MASK) /*!< Taste CH - */ #define RC5_CODE_DOWN RC5_CODE_CH_MINUS /*!< Taste CH - umgewidmet als DOWN-Taste*/
[anchor pb06][/anchor] [frage]Das ganze Framework ist so kompliziert, wie finde ich einen Einstieg?[/frage]
[antwort]Wir haben zwei ganz einfache Routinen vorbereitet, die als guter Einstiegspunkt für eigene Experimente dienen können. Wie alle Verhalten existiert für sie eine eigene Datei im Unterverzeichnis bot-logic. In diesem Falle heißt die Datei behaviour_simple.c und die beiden Funktionen bot_simple_behaviour() sowie bot_simple2_behaviour()
Damit sich die alten Hasen nicht daran stören, sind beide Routinen per default inaktiv. Möchte man sie aktivieren, so entfernt man die Kommentarzeichen von folgenden Zeilen in bot_behave_init():
// activateBehaviour(bot_simple_behaviour); // activateBehaviour(bot_simple2_behaviour);
bot_simple_behaviour() ist ein Beispiel für ein ganz schlichtes Verhalten, dass den Bot mit Hilfe von Hilfsverhalten im Quadrat fahren lässt.
bot_simple2_behaviour() nutzt keine Hilfsverhalten, sondern ist selbst eines und besitzt daher auch eine Botenfunktion bot_simple2(). Man kann es z.B. aus bot_simple_behaviour() heraus nutzen. Es fährt den Bot so lange geradeaus, bis es dunkler als ein bestimmter (übergebener) Wert wird. Es fragt also Sensoren ab und steuert relativ unmittelbar die Motoren an.
Viele weitere Details beschreibt das in c't 10/06 erschienene Tutorial.
Der Vorteil, wenn man mit diesen beiden Beispielen anfängt liegt darin, dass man sich um nichts anderes kümmern muss. Das Framework ermittelt für einen die Sensorwerte, stellt die Motoren nach und macht noch diverses andere im Hintergrund. Man kann sich ganz darauf konzentrieren z.B. den Bot ein kleines Herz oder andere geometrische Figuren fahren zu lassen. Das Suchen von Licht wäre ebenfalls ein geeignetes Übungsthema.[/antwort]
[anchor pb07][/anchor] [frage]Beim Übersetzen bekomme ich seit dem Erscheinen von c't 10/06 immer die Fehlermeldung: undefined reference to `cos'. Was läuft schief?[/frage]
[antwort]Seit der Release 0.7 verwendet der Code Routinen aus der mathematischen Bibliothek. Diese Fehlermeldung deutet darauf hin, dass diese Library fehlt. Dazu öffnet man in Eclipse Project->Properties->C/C++-Build/GCC-C-Linker/Libraries. Im Feld Libraries drückt man auf das kleine grüne "Plus" und trägt in den sich öffnenenden Dialog ein kleines "m" ein. OK-Klicken. Fertig.[/antwort]
[anchor pb08][/anchor] [frage]Mein Bot stürzt immer wieder ab. Was läuft schief?[/frage]
[antwort]Unter Umständen ist der Code zu groß für den Flash-Speicher des Bots geworden. Er besitzt nur 32 KByte davon. Ohne aktivierte Optimierung kommt der offizielle Code seit der Release 0.7 (c't 10/06) gefährlich nahe an diese Grenze. Aktiviert man die Optimierung (-Os), so ist wieder reichlich Platz: Einfach im Feld "Other Optimization Flags" des Menüs Project->Properties->C/C++-Build/GCC-C-Compiler/Optimization den Wert "-Os" eintragen.
Haben Sie sehr viel eigenen Code hinzugefügt, reicht vielleicht sogar die Optimierung nicht mehr aus. Dann können sie in ct-Bot.h unbenutzte Module deaktivieren um wieder Platz zu schaffen. Insbesondere Log- und Display-Routinen sind Speicherfresse, da sie mit Strings hantieren.
Der Befehl:
avr-size ct-Bot.elf
liefert Aufschluss über die jeweils belegten Speichersektionen. Die Bedeutung der einzelnen Sektionen ist hier genau erklärt. [/antwort]
[anchor pb09][/anchor] [frage]Der Compiler meldet den Fehler: "section .bootloader [00007680 -> 00007a07] overlaps section .data" oder so ähnlich. Was läuft falsch?[/frage]
[antwort]Sie haben vergessen dem Linker mitzuteilen, wohin er den Bootloader packen soll. Wenn Sie den Bootloader benutzen wollen, finden Sie im Verzeichnis Documentation eine HTML-Datei mit einer bebilderten Anleitung, wie sie das dem Linker mitteilen können. Wenn Sie den Bootloader nicht verwenden wollen, deaktivieren sie den BOOTLOADER_AVAILABLE-Schalter in ct-Bot.h.[anchor pb10][/anchor] [frage]Ich will Code für den ATmega644 compilieren und das klappt nicht. Was mache ich falsch?[/frage]
[antwort]Zuerst müssen Sie in der Build-Umgebung von Eclipse dem C-Compiler und dem Linker mit auf den Weg geben, dass Code für den ATmega644 übersetzt werden soll. Ersetzen sie Wenn Sie unter Project->Properties->C/C++ Build/Tool Settings/GCC C Compiler/Miscellaneous die Option -mmcu=atmega32 durch -mmcu=atmega644. Das gleiche wiederholen Sie unter Project->Properties->C/C++ Build/Tool Settings/GCC C Linker/Miscellaneous.. Außerdem sollten sie darauf achten, dass Sie bei der Installation der Tools auf die in der Installationsanleitung erwähnten Hinweise für den ATmega644 geachtet haben. [/antwort]
Version zum Drucken | Per E-Mail versenden | Heft bestellen
Permalink: http://heise.de/-291940
Das aktuelle Heft ist jetzt im Handel erhältlich.
Ältere Artikel können Sie über unser Zeitschriften-Archiv bestellen.