heise online · c't · iX · Technology Review · Telepolis · mobil · Security · Netze · heise open · heise resale · Autos · c't-TV · Jobs · Kiosk
Zum Inhalt
c't

c't Projekte - c't-Bot und c't-Sim - Mailinglisten

c't-Bot und c't-Sim


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

[ct-bot] typenprobleme bei ifdef PC ???

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



Copyright © 2007 Heise Zeitschriften Verlag Kritik, Anregungen bitte an c't-WWW Datenschutzhinweis   Impressum