c't

c't-Projekte - Mailinglisten


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

Re: [ct-bot] Basic-Interpreter für den Bot

Absender: Timo Sandmann
Datum: Mi, 13.10.2010 17:27:29
In-reply-to: <D077FF81-B44C-43D6-B5AE-DC12B2BE6714@xxxxxxxxxxxxxxx>
References: <096FD558C4D20046A1BABE72DFF0C6C33B3ED5A41C@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx><CE1FB7FF-4A39-47CE-80F6-316DD3A2D068@xxxxxxxxxxxxxxx><20100826195514.307630@xxxxxxx> <9FC1FC43-9D8F-4DF1-A899-DD2305A89771@xxxxxxxxxxxxxxx> <9DD5454FB74E49BABC1EAF57CD9B8505@FrankPC> <D077FF81-B44C-43D6-B5AE-DC12B2BE6714@xxxxxxxxxxxxxxx>


Hallo Frank,

ich habe meinen Code, mit dem der Bot Dateien (einheitlich auf MMC und in der PC-Version) verwalten kann, mal auf den aktuellen SVN-Stand gebracht, so dass er sich hoffentlich bald auch in Deinen Basic-Interpreter einbauen lässt. Damit sollte es dann keinen Unterschied mehr machen, ob das Ganze auf dem realen Bot oder in der Simulation ausgeführt wird und es wird möglich, uBasic-Programme von der MMC zu lesen und dorthin zu speichern. 
Eine Frage ist da bei mir aufgetaucht: Wie ist es für Dich bzw. den uBasic-Interpreter am besten, auf eine Datei zuzugreifen? Im Moment läuft das bei mir blockweise, also in 512 Byte großen Blöcken, so wie sie von der MMC kommen. Dafür gibt es dann

/*!
 * Oeffnet eine Datei
 * @param filename	Dateiname
 * @param *file		Zeiger auf Datei-Deskriptor
 * @param mode		Modus, in dem die Datei geoeffnet wird
 * @param *buffer	Puffer fuer mindestens BOTFS_BLOCK_SIZE Byte
 * @return			0, falls kein Fehler
 */
int8_t botfs_open(const char * filename, botfs_file_descr_t * file, uint8_t mode, void * buffer);

/*!
 * Setzt den Dateizeiger an eine neue Position
 * @param *file		Zeiger auf Datei-Deskriptor
 * @param offset	Offset der Dateiposition, an die gesprungen werden soll, in Bloecken
 * @param origin	SEEK_SET, SEEK_CUR oder SEEK_END
 */
void botfs_seek(botfs_file_descr_t * file, int16_t offset, uint8_t origin);

/*!
 * Liest BOTFS_BLOCK_SIZE Bytes aus einer Datei in einen Puffer
 * @param *file		Zeiger auf Datei-Deskriptor
 * @param *buffer	Puffer fuer mindestens BOTFS_BLOCK_SIZE Byte, in die Daten geschrieben werden
 * @return			0, falls kein Fehler
 */
int8_t botfs_read(botfs_file_descr_t * file, void * buffer);


Das ist also auf unterster Ebene und z.B. für die Map sinnvoll, weil die auch in Blöcken aufgebaut ist. Für Textdateien wie im Fall von Basic-Programmen, könnte ich mir vorstellen, dass es besser wäre, eine Funktion zu haben, die n Byte in einen Puffer liest, unabhängig von den Blöcken und Blockgrenzen. Eventuell wäre vielleicht auch eine Funktion praktisch, die genau eine Zeile einliest, also wie die bekannte Standard-Funktion getline()? Dann braucht sich das uBasic-Verhalten nicht darum zu kümmern, ob die zu lesende Zeile beispielsweise auf zwei verschiedene 512 Byte Blöcke verteilt ist. Und wenn anderer Code auch mal Dateien einlesen soll, braucht man es dort nicht noch mal implementieren. 
Was meinst Du, wäre da für Dein Verhalten am besten geeignet? Ich habe nicht so dein Einblick, wie die Daten am einfachsten vom Basic-Interpreter weiterverarbeitet werden können. Daher erstmal die Frage an Dich, bevor ich da etwas am Bedarf vorbei implementiere.

Grüße,
Timo


Am 10.09.2010 um 21:12 schrieb Timo Sandmann:
> Hallo Frank,
> 
> sehr gut, erstmal ein paar grundsätzliche Anmerkungen (sind nur Kleinigkeiten, aber machen das Leben leichter):
> - Bitte die Datei .cproject nicht mit in den Patch einschließen, dann wird der auch nicht so groß.
> - Patch nicht als Workspace-Patch, sondern als Projekt-Patch (kann man in Eclipse auswählen).
> - Die Datei "tokenizer.c" bitte in "ubasic_tokenizer.c" und "include/tokenizer.h" in "include/ubasic_tokenizer.h" umbenennen, dann haben wir ein einheitliches Namensschema für alle Teile des Basic-Interpreters.
> - Beim Kopieren von Dateien bitte die Header-Informationen anpassen. In behaviour_ubasic.h findet sich z.B. noch
> 	/*!
> 	 * @file 	behaviour_delay.h
> 	 * @brief 	Delay-Routinen als Verhalten
> 	 * @author 	Benjamin Benz (bbe@xxxxxxxx)
> 	 * @date 	12.07.07
> 	 */
> - In einige Dateien fehlt solch ein Header komplett, bitte ergänzen. 
> - Ein Pfad wie "C:\" existiert nur unter Windows, ich denke ein Unterverzeichnis im Bot-Projekt wäre angebrachter, dann kann der Code einfach eine relative Pfadangabe verwenden. Am besten ist die per #define an übersichtlicher Stelle einstellbar. 
> - Über den Quellcode einmal die Auto-Formatierung von Eclipse laufen lassen (Source -> Format), dann passt die Textformatierung größtenteils zum vorhandenen Quellcode. 
> 
> Ich habe das Ganze jetzt gerade mal im Sim ausprobiert bzw. ausprobieren wollen, allerdings beendet sich der Bot-Code, sobald ich auf Taste 1 drücke:
> 
> Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
> 0   libSystem.B.dylib             	0x00007fff876ee3d6 __kill + 10
> 1   libSystem.B.dylib             	0x00007fff8778e913 __abort + 103
> 2   libSystem.B.dylib             	0x00007fff87783157 mach_msg_receive + 0
> 3   libSystem.B.dylib             	0x00007fff876e2abf __strcat_chk + 40
> 4   ct-Bot                        	0x000000010000c7b6 read_ubasic_src + 102 (behaviour_ubasic.c:127)
> 5   ct-Bot                        	0x000000010000cce8 ubasic_disp_key_handler + 179 (behaviour_ubasic.c:305)
> 6   ct-Bot                        	0x000000010000ce98 drive_ubasic_display + 105 (behaviour_ubasic.c:367)
> 7   ct-Bot                        	0x0000000100006821 gui_display + 118 (gui.c:225)
> 8   ct-Bot                        	0x0000000100001ab6 main + 206 (ct-Bot.c:121)
> 9   ct-Bot                        	0x0000000100000f9c start + 52
> 
> Thread 1:
> 0   libSystem.B.dylib             	0x00007fff876a1f02 read$NOCANCEL + 10
> 1   libSystem.B.dylib             	0x00007fff876f140f __sread + 16
> 2   libSystem.B.dylib             	0x00007fff876e914c _sread + 19
> 3   libSystem.B.dylib             	0x00007fff876e8fe2 __srefill + 41
> 4   libSystem.B.dylib             	0x00007fff876ff1a6 fgets + 105
> 5   ct-Bot                        	0x0000000100007963 read_command_thread + 77 (cmd-tools_pc.c:281)
> 6   libSystem.B.dylib             	0x00007fff876d9456 _pthread_start + 331
> 7   libSystem.B.dylib             	0x00007fff876d9309 thread_start + 13
> 
> Thread 0 crashed with X86 Thread State (64-bit):
>  rax: 0x0000000000000000  rbx: 0x00007fff5fbff6b0  rcx: 0x00007fff5fbff6a8  rdx: 0x0000000000000000
>  rdi: 0x00000000000048ec  rsi: 0x0000000000000006  rbp: 0x00007fff5fbff6d0  rsp: 0x00007fff5fbff6a8
>   r8: 0x0000000000000001   r9: 0x0000000100100e70  r10: 0x00007fff876ea412  r11: 0xffffff80002e1680
>  r12: 0x0000000000000000  r13: 0x0000000000000000  r14: 0x0000000000000000  r15: 0x0000000000000000
>  rip: 0x00007fff876ee3d6  rfl: 0x0000000000000202  cr2: 0x00000001000c7000
> 
> 
> Das passiert übrigens auch, wenn ich den Pfad ändere (s.o.). Scheinbar läuft in read_ubasic_src() irgendwas mit der String-Behandlung falsch (Pufferüberlauf?), der Grund ist für mich auf die Schnelle aber nicht ersichtlich, ich habe jetzt nicht den ganzen Code durchgeschaut. 
> Daher kann ich da im Moment leicht auch nicht mehr testen. 
> 
> Auf dem echten Bot habe ich es noch nicht getestet, dazu dann später mehr. 
> 
> Grüße,
> Timo