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: 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-Distanzsensoren
uint16 __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. Resetkontrollroutine
uint8 __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 Daten
uint8 __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