Absender: Achim Pankalla
Datum: Do, 29.03.2007 19:50:18
hallo ct-botler,beim arbeiten am kalibrier-kode ist mir aufgefallen, das der gcc compiler unter win32 bei uint16 vier bytes pro variable in der eeprom section anlegt, dh. der int type wäre eigentlich ein word (oder long). dies verhalten zeigen durchaus einige compiler, also habe ich kurzer hand die typedef im global.h geändert. (das define uint16 auskommentiert und das "typedef unsigned int word" in "typedef unsigned short uint16" geändert) danach schrumpfte die section grösse auf eine passende grösse. nun funktionierte aber bot_turn nicht mehr korrekt (bot läuft ein stück korrekt, danach dreht er sich nur noch). nach dem zurückändern war wieder alles ok. unter dem avr-gcc scheint dagegen uint16 wirklich nur 16bit gross zu sein (habe ich nicht auf bot verifiziert), da dort die eeprom sektion die korrekte (erwartete) grösse hat. (0x72=114) das problem muss im mouse kode des pc liegen, den ohne mouse-messung läuft der bot korrekt mit bot_turn im labyrinth. der reale bot muss auch korrekt arbeiten, da er ja nur 16bit uint's zu haben scheint. anbei habe ich die ausgaben von objdump beigefügt, dort kann man die grösse der .eeprom sektion gut sehen. der "normale" gcc scheint noch lücken in zwischen die daten zu schreiben, um sie auf passende adressgrenzen zu bringen (?). insgesamt werden folgende variablen in section .eeprom definiert:
//Speicher für die Kalibriertabellen der IR-Distanzsensorenuint16 __attribute__ ((section (".eeprom"))) sct_left[25]; /*!< Tabelle fuer linken Sensor */ uint16 __attribute__ ((section (".eeprom"))) sct_right[25]; /*!< Tabelle fuer rechten Sensor */
//Variablen für TEST_AVAILABLE_COUNTERS. Resetkontrollroutineuint8 __attribute__ ((section (".eeprom"))) resets=0; /*!< Anzahl der Resets seid Rücksetzen des Zählers */ uint8 __attribute__ ((section (".eeprom"))) resetinfo[10]; /*!< Registerflags der letzten 10 Resets */
//bot_turn_behaviour Datenuint8 __attribute__ ((section (".eeprom"))) err15=1; /*!< Fehler bei Drehungen unter 15 Grad */ uint8 __attribute__ ((section (".eeprom"))) err45=2; /*!< Fehler bei Drehungen zwischen 15 und 45 Grad */ uint8 __attribute__ ((section (".eeprom"))) err_big=4; /*!< Fehler bei groesseren Drehungen */
meine frage nun, woran scheiterts und wieso wurde uint16, im gegensatz zu int16, über den umweg eines define und typedef konstuiert?
warte auf erhellende antworten. mit freundlichen grüssen achim ps: wems interresiert:kalibrieren läuft schon als behaviour (nun auch wieder im ct-sim) und durch linker-scripts klappts (danke herr benz für die tipps) auch mit .eeprom im pc gcc. auch eine eep-datei wird schon bei mir erzeugt.
ct-bot.exe: file format pei-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .text 00008274 00401000 00401000 00000400 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA 1 .data 00000110 0040a000 0040a000 00008800 2**4 CONTENTS, ALLOC, LOAD, DATA 2 .eeprom 000000a0 0040b000 0040b000 00008a00 2**2 CONTENTS, ALLOC, LOAD, DATA 3 .rdata 000010e0 0040c000 0040c000 00008c00 2**4 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .bss 00001100 0040e000 0040e000 00000000 2**4 ALLOC 5 .idata 00000854 00410000 00410000 00009e00 2**2 CONTENTS, ALLOC, LOAD, DATA 6 .stab 0003bd24 00411000 00411000 0000a800 2**2 CONTENTS, READONLY, DEBUGGING, NEVER_LOAD, EXCLUDE 7 .stabstr 001119da 0044d000 0044d000 00046600 2**0 CONTENTS, READONLY, DEBUGGING, NEVER_LOAD, EXCLUDE
ct-bot.elf: file format elf32-little Sections: Idx Name Size VMA LMA File off Algn 0 .text 00006d94 00000000 00000000 000000b4 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .data 0000025e 00800060 00006d94 00006e48 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 0000025e 008002be 008002be 000070a6 2**0 ALLOC 3 .noinit 00000000 0080051c 0080051c 00007118 2**0 CONTENTS 4 .eeprom 00000072 00810000 00810000 000070a6 2**0 CONTENTS, ALLOC, LOAD, DATA 5 .stab 0000036c 00000000 00000000 00007118 2**2 CONTENTS, READONLY, DEBUGGING 6 .stabstr 00000084 00000000 00000000 00007484 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_aranges 000002e4 00000000 00000000 00007508 2**0 CONTENTS, READONLY, DEBUGGING 8 .debug_pubnames 000014c2 00000000 00000000 000077ec 2**0 CONTENTS, READONLY, DEBUGGING 9 .debug_info 000068de 00000000 00000000 00008cae 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_abbrev 00002788 00000000 00000000 0000f58c 2**0 CONTENTS, READONLY, DEBUGGING 11 .debug_line 0000b2f4 00000000 00000000 00011d14 2**0 CONTENTS, READONLY, DEBUGGING 12 .debug_str 00001986 00000000 00000000 0001d008 2**0 CONTENTS, READONLY, DEBUGGING 13 .debug_macinfo 000f542f 00000000 00000000 0001e98e 2**0 CONTENTS, READONLY, DEBUGGING
ct-bot.exe: file format pei-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .text 00008194 00401000 00401000 00000400 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA 1 .data 00000110 0040a000 0040a000 00008600 2**4 CONTENTS, ALLOC, LOAD, DATA 2 .eeprom 00000120 0040b000 0040b000 00008800 2**2 CONTENTS, ALLOC, LOAD, DATA 3 .rdata 000010e0 0040c000 0040c000 00008a00 2**4 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .bss 00001100 0040e000 0040e000 00000000 2**4 ALLOC 5 .idata 00000854 00410000 00410000 00009c00 2**2 CONTENTS, ALLOC, LOAD, DATA 6 .stab 0003bcdc 00411000 00411000 0000a600 2**2 CONTENTS, READONLY, DEBUGGING, NEVER_LOAD, EXCLUDE 7 .stabstr 001119c2 0044d000 0044d000 00046400 2**0 CONTENTS, READONLY, DEBUGGING, NEVER_LOAD, EXCLUDE