## c't-Projekte - Mailinglisten

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

### Re: [ct-bot] eeprom@pc

Absender: Achim Pankalla
Datum: Mi, 18.07.2007 18:21:14
In-reply-to: <469E0B63.7010507@xxxxxx>
References: <BCF016D5ED5AC34FBB655D109519ABCF083EBE@xxxxxxxxxxxxxxxxxxxx> <463E0782.1050406@xxxxxx> <0FBD95CF-DA3B-461B-B12B-9FDCD84984D2@xxxxxxxxxxxxxxx> <463F3E0A.7020605@xxxxxx> <8D5B90F4-74FD-45D4-B5B8-DDCAC0B81932@xxxxxxxxxxxxxxx> <464092F7.30605@xxxxxx> <465DB1F9.5030404@xxxxxx> <CF925D4D-FD5A-4581-8480-1C5D35EFEDC9@xxxxxxxxxxxxxxx> <4663027F.4040301@xxxxxx> <F71477F0-03AD-4F06-87E3-AC5DA5BFD1B2@xxxxxxxxxxxxxxx> <466D6849.1020109@xxxxxx> <46756694.9010906@xxxxxx> <6566D2F2-ADE4-4656-86C0-6533B3462B64@xxxxxxxxxxxxxxx> <46866046.7040108@xxxxxx> <4686813D.8020405@xxxxxx> <70929B57-E069-4B5F-AC22-3E1E51ACD696@xxxxxxxxxxxxxxx> <5E0B9EC1-1718-4319-95D6-54862E9ECA42@xxxxxxxxxxxxxxx> <468CB5B0.3000408@xxxxxx> <EB302B19-E327-4736-A0DE-588E25D2EE48@xxxxxxxxxxxxxxx> <468FC24D.5080507@xxxxxx> <4306C7C0-49CA-4C10-B3F7-1108D4A7A333@xxxxxxxxxxxxxxx> <4697AF47.4050908@xxxxxx> <73F28A33-47FE-40F0-8066-11A2F772BF79@xxxxxxxxxxxxxxx> <469E0B63.7010507@xxxxxx>

    hallo,

`da nun ja alles soweit in einen funktionfähigen zustand ist, habe ich` `nochmal die docu angepasst.`

    Mit freundlichen Grüßen
       achim pankalla

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>

      <meta http-equiv="CONTENT-TYPE" content="text/html; charset=windows-1252">

      <title></title>
      <meta name="GENERATOR" content="OpenOffice.org 2.2  (Win32)">

      <meta name="AUTHOR" content="Achim Pankalla">

      <meta name="CREATED" content="20060528;19455600">

      <meta name="CHANGEDBY" content="Achim Pankalla">

      <meta name="CHANGED" content="20070617;18142584">

      <style type="text/css">
    	<!--
    		@page { size: 21cm 29.7cm; margin: 2cm }
    		P { margin-bottom: 0.21cm }
    	-->
    	</style>
    </head>

    <body dir="ltr" lang="de-DE">

    <p style="margin-bottom: 0cm; font-family: Times New Roman;" align="center"><font size="+1"><b>EEPROM Emulation f&uuml;r
    PC</b></font></p>

    <p style="margin-bottom: 0cm; text-align: center;"><font size="3"><b><small>Version 1 18-Jul-2007</small></b><br>
    Achim Pankalla
    (achim.pankalla@xxxxxx)</font></p>

    <p style="margin-bottom: 0cm; height: 0px;"><br>

    </p>

    <p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"></p>
    <div style="text-align: center;"><b>Beschreibung</b><br>
    <div style="text-align: justify;">Die
    EEPROM Emulation f&uuml;r den PC stellt das EEPROM des <i>Atmel
    MEGA32(644) Prozessor</i> auch dem ct-Sim zur Verf&uuml;gung.
    Der Zugriff auf dieses EEPROM erfolgt &uuml;ber gleichnamige
    Funktionen, wie sie auch die avr-libc bereitstellt und auch die
    Variablendefinition erfolgt &uuml;ber die gleichen Konstrukte. Eine
    Unterscheidung &uuml;ber <span style="font-style: italic;">#ifdef</span>'s ist also nicht notwendig.<br>
    Durch
    diese EEPROM-Emulation, ist der ct-Sim dem realen Bot einen Schritt
    n&auml;her gekommen und Programme mit EEPROM-Zugriffe k&ouml;nnen mit
    der Simulation getestet werden. Mehr noch, Sie k&ouml;nnen auch den
    Inhalt des emulierten EEPROM auf den ct-Bot &uuml;bertragen oder das
    EEPROM vom
    ct-Bot laden und f&uuml;r die Emulation nutzen.</div>
    </div>

    <p style="margin-bottom: 0cm;" align="left"><br>

    </p>

    <p style="margin-bottom: 0cm; text-align: center;"><b>Implementierung</b><br>
    </p>
    <div style="text-align: justify;">Alle Funktionen und Einstellungen der
    EEPROM Emulation findet Sie in den Dateien <i>pc/eeprom-emu_pc.c</i>
    und <i>include/eeprom-emu.h</i>. Das EEPROM selbst wird durch eine
    bin&auml;re Datei (genau 1 KB bzw. 2 KB gro&szlig;) repr&auml;sentiert&nbsp;und
    kann so mit einen HexEditor bearbeitet werden. Der Pfad befindet sich in der
    Konstanten <span style="font-style: italic;">EEPROM_FILENAME</span> in der C-Datei. Standard Pfad ist das Heimatverzeichnis des
    ct-Bots.<font color="#000000"><font face="Courier New, monospace"><font size="2"></font></font></font>
    <font face="Times New Roman, serif">Der Name </font><font face="Times New Roman, serif"><i>eeprom.bin</i></font>
    <font face="Times New Roman, serif">sollte belassen werden.</font><br>
    Die
    Datei wird automatisch neu angelegt, wenn sie noch nicht existiert,
    dann wird die Datei automatisch mit den aktuellen Zuweisung der
    EEPROM-Variablen initialisiert (mit hilfe von ct-bot.eep). Ist schon
    eine <span style="font-style: italic;">eeprom.bin</span> vorhanden, so wird diese nicht ver&auml;ndert, ausser die ct-Bot Exe wird mit dem Parameter <span style="font-style: italic;">-i</span> gestartet, dann wird auch eine schon vorhandene Datei mit den vorhandenen Zuweisungen &uuml;berschrieben.<br>
    Damit die
    EEPROM-Funktionen des PC korrekt auf die Datei zugreifen k&ouml;nnen
    darf nur ein Adressraum von 0 bis 1023 (bzw. 2047) entstehen.&nbsp;Die
    Emulation muss also wissen welche Speicheradresse die
    erste Variable im EEPROM hat, um diesen Wert von allen Anderen
    abzuziehen. Daf&uuml;r bedarf es bei
    der PC Implementierung (mit PC ist allgemein der Code f&uuml;r den
    ct-Sim gemeint, mag das OS nun Win, Linux oder Mac OS X hei&szlig;en)
    eines Tricks.&nbsp;<br>
    Daf&uuml;r gibt es die beiden Variablen
    <i>_eeprom_start1__</i> und <i>_eeprom_start2_</i><span style="font-style: normal;">_
    in </span><i>1st_init.S</i><span style="font-style: normal;">. Diese
    stehen dort, damit sie auf jeden Fall vor der ersten EEPROM Variable
    definiert werden und damit ihre Sections (.</span><i>s1eeprom</i> <span style="font-style: normal;">+
    .</span><i>s2eeprom</i><span style="font-style: normal;">) auf jeden
    Fall vor der Section .</span><i>eeprom</i> <span style="font-style: normal;">liegen.</span><br>
    Durch diesen Trick
    kann die Speicheradresse der ersten EEPROM Variable auch ohne
    Linkerscript ermittelt werden und auch verschiedene
    Section-Alignments (im Moment bei MinGW und Linux unterschiedlich)
    haben keine Auswirkung.<br>
    Auch beim
    Generieren einer neuen Datei ct-Bot.exe/elf wird eine EEP mit den
    Initialisierungen der EEPROM-Variablen im post-build angelegt. Diese
    Datei kann&nbsp; die EEPROM-Emulation auch als Initialisierung f&uuml;r die <span style="font-style: italic;">eeprom.bin</span> im MCU-Modus benutzen. Sollte keine <span style="font-style: italic;">eeprom.bin</span> existieren, wird sie auch daf&uuml;r genutzt. Arbeitet man im PC-Modus, kann diese Datei auch in eeprom.bin umbenannt werden.<br>
    Damit die Emulation m&ouml;glichst effektiv und schnell arbeiten kann, wird nach dem Start die gesamte Datei <span style="font-style: italic;">eeprom.bin</span> im Hauptspeicher gecached und nach jedem Schreibzugriff komplett neu geschrieben.<br>
    Damit man die EEPROM-Datei auch auf den ct-Bot einspielen kann, oder
    einen EEPROM Abzug &nbsp;des ct-Bot als emuliertes EEPROM nutzen kann,
    werden Post-Builds ben&ouml;tigt, die die Adressen der einzelnen
    Variablen auf ct-Bot und ct-Sim aufzeigen. Der EEPROM Manager wird beim
    Start eines Bots im ct-Sim dann einen (Adress)Konvertierungstabelle
    erstellen, um die Zugriffe auf das EEPROM anzupassen. Diese Tabelle
    wird nach aufsteigenden Adresse des ct-Sim sortiert. und wird nur im
    MCU-Modus genutzt.</div>

    <p style="margin-bottom: 0cm;"></p>
    <div style="text-align: center;"><b>Nutzung der EEPROM Emulation</b><br>
    <div style="text-align: justify;">Die EEPROM-Emulation unterscheidet
    sich nur in ein paar Details von den Funktionen der avr-libc f&uuml;r den realen ct-Bot.
    Nat&uuml;rlich hat der PC kein EEPROM, dieses wird durch
    eine&nbsp;Datei im Bin&auml;rformat emuliert. Der Dateinamen und der Pfad
    wird &uuml;ber die Konstante EEPROM_FILENAME in <i>eeprom</i>-<i>emu</i>_<i>pc</i>.<i>c</i>
    festgelegt. <br>
    Ein weiterer Unterschied ist, dass beim avr-gcc &uuml;ber
    ein DEFINE der Prozessortyp festgelegt wird, entweder ATMega32 oder
    ATMega644. Dieses DEFINE ist beim PC Compiler normalerweise nicht
    gesetzt. Standardm&auml;&szlig;ig wird von einem ATMega32 mit
    1024 Byte EEPROM ausgegangen, Die Emulation kennt aber die Konstante
    f&uuml;r den ATMega644 und erh&ouml;ht den EEPROM Speicher auf 2048
    Bytes. Sollte schon eine 1 KB Datei f&uuml;rs EEPROM bestehen, so muss
    diese gel&ouml;scht werden, damit die Gr&ouml;&szlig;ere angelegt
    wird. Wird direkt die erstellte <i>ct-bot.eep</i> Datei im PC-Modus genutzt, ist
    dies nat&uuml;rlich nicht notwendig. <br>
    Alle wichtigen Informationen werden
    beim Start von ct-Bot.exe/elf im Log-Fenster angezeigt, vorrausgesetzt es ist in <span style="font-style: italic;">ct-bot.h</span> aktiviert ist (zus&auml;tzlich bitte in <span style="font-style: italic;">eeprom-emu_pc.c</span> die Konstante <span style="font-style: italic;">DEBUG_EEPROM</span>
    aktivieren), dort sieht man
    auch alle eventuellen Fehler, den erreichten Emulationsmodus und ob die
    Emulation ordnungsgem&auml;&szlig;
    arbeiten kann. Es erfolgt kein Beenden bei
    Problemen, die Funktion des EEPROMs ist dann aber nicht gegeben. Bei
    Auff&auml;lligkeiten sollte man dann die LOG Funktion aktivieren.</div>
    </div>

    <p style="margin-bottom: 0cm;">Generell unterscheidet die Emulation
    zwei Modi:</p>

    <ol>

    	<li>

        <p style="margin-bottom: 0cm;">PC-Modus<br>
    In diesen Modus entspricht die
    	<span style="font-style: italic;">eeprom.bin</span> nicht dem EEPROM des realen ct-Bots und darf deshalb auch
    	nicht auf ihn aufgespielt werden. Dieser Modus wird ohne jedes Zutun erreicht.
    	Er ben&ouml;tigt keine weiteren Eintr&auml;ge im Post-Build.&nbsp;Wenn eine <span style="font-style: italic;">ct-bot.eep</span> im Bin&auml;rformat erstellt wird,
    	so kann diese direkt benutzt werden.</p>

    	</li>
      <li>

        <p style="margin-bottom: 0cm;">MCU-Modus<br>
    Ist dieser Modus erreicht, kann man
    	als EEPROM-Datei einen EEPROM Abzug vom ct-Bot verwenden.
    	Voraussetzung ist nat&uuml;rlich, dass der Bot auch mit zuletzt
    	erstelltem Programm bespielt ist. Nat&uuml;lich kann man auch die
    	EEPROM-Datei <span style="font-style: italic;">eeprom.bin</span> auf dem ct-Bot aufgespielen.<br>
    Der MCU-Modus kann nur erreicht
    	werden, wenn sowohl beim avr-gcc als auch unter dem ct-Sim
    	eine map-Datei erstellt wird, daf&uuml;r sind im Post-Build die Befehle aus den Kommentarkopf aus <span style="font-style: italic;">eeprom-emu_pc.c</span> einzutragen.</p>
    F&uuml;r Linux oder Mac OS X gelten &auml;hnliche Befehle, in den
    	Projekteinstellungen im SVN sind die n&ouml;tigen Post-Build-Einstellungen f&uuml;r alle
    	Betriebssysteme bereits gemacht.
    	<br>
      </li>
    </ol>

    <p style="margin-bottom: 0cm; text-align: justify;">M&ouml;chte man die vorhandene EEPROM-Datei mit den Daten aus der EEP-Datei
    initialisieren, so muss man die ct-Bot.exe/elf mit dem Parameter <i>-i
    </i>starten, dabei spielt es keine Rolle in welchen Modus die
    Emulation arbeitet. Der Pfad der EEP-Datei wird in der Konstante
    <font color="#000000"><font face="Courier New, monospace"><font size="2">EEP_PC
    und </font></font></font><font color="#000000"><font face="Times New Roman, serif"><font size="3">die Pfade f&uuml;r die MAP-Dateien werden in den Konstanten EEMAP_PC und EEMAP_MCU eingetragen.<br>
    Die Variable MAX_VAR legt die Gr&ouml;&szlig;e der Tabelle fest und
    beschr&auml;ngt damit die maximale Anzahl der Variablen. Sollte die
    Fehlermeldung auftreten, das es zu viele Variablen gibt, muss man
    diesen Wert nur erh&ouml;hen. <br>
    </font></font></font></p>
    <font color="#000000"><font face="Times New Roman, serif"><font size="3">F&uuml;r
    das Debuggen von Zugriffen auf das EEPROM stehen unter anderem die
    DEFINES LOG_STORE und LOG_LOAD zur Verf&uuml;gung, die im MCU Modus
    sogar den Variablennamen anzeigen. Andere Variationen sind auch noch
    denkbar.</font></font></font>
    <p style="margin-bottom: 0cm;"></p>

    <div style="text-align: center;"><b>Grenzen der
    Implementierung</b><br>
    <div style="text-align: justify;">Im Moment erstellen gleiche Compilerversionen (zu &uuml;berpr&uuml;fen
    mit --version) auch (fast) gleiche EEPROM-Sections. Damit es
    auch mit verschiedenen Compiler Version geht (und ich mich auch nicht
    auf die gleichen Versionen verlasssen will) habe ich die
    Adresskonvertierung eingef&uuml;hrt, damit dies kein Problem mehr
    ist. Es gibt aber keine Garantien daf&uuml;r, dass zuk&uuml;nftige Compiler
    Versionen nicht die Reihenfolge der Variablen im Code &auml;ndern.
    Ein Einf&uuml;gen neuer EEPROM Variablen kann auch zu Verschiebungen
    der Adressen f&uuml;hren. Nach solchen &Auml;nderungen (auch ein &auml;ndern der Compilerversion) ist man nur
    auf der sicheren Seite, wenn das EEPROM initialisiert wird (sprich,
    Sie Ihre alte <span style="font-style: italic;">eeprom.bin</span> bzw. auf dem Atmel das EEPROM l&ouml;schen) und f&uuml;r MCU und ct-Sim neue Exe generiert werden.
    Einmal erstellte Werte sind dann nat&uuml;rlich futsch. Wenn man den
    Einfluss von Codeerg&auml;nzungen kontrollieren will, kann man dies
    vor und nach der &Auml;nderung mit <span style="font-style: italic;">objdump</span> machen (oder falls Sie
    die Befehle f&uuml;r die MAP-Dateien im Post-Build benutzen, schauen
    Sie in die MAP-Dateien), mit den richtigen Parametern kann man sich
    die Adressverteilung anzeigen lassen. Sie k&ouml;nnen dann sehen, ob
    die neuen Variablen nun hinten angeh&auml;ngt wurden (dann brauch das
    EEPROM nicht gel&ouml;scht werden) oder sie dazwischen gelandet sind
    (dann sind die alten Daten unbrauchbar), daf&uuml;r sollten sie aber
    vorher in Eclipse <span style="font-style: italic;">Projekt-&gt;clean</span> aufrufen.<br>
    Der Compiler f&uuml;r das ct-SimEXE kann aufgrund der Implementierung
    des EEPROM auf den PC nicht kontrollieren, ob mehr als 1024/2048 Bytes
    f&uuml;r die Variablen ben&ouml;tigt wird, er kennt diese Begrenzung
    nicht. Der EEPROM-Manager meckert dann aber
    im LOG. </div>
    </div>

    <p style="margin-bottom: 0cm;"></p>
    <div style="text-align: center;"><span style="font-weight: bold;">Verschiedenes</span><br>
    <div style="text-align: justify;">Ein besonderer Dank an dieser Stelle
    an Timo Sandmann unter anderen f&uuml;r das Testen unter MacOSX und
    f&uuml;r verschiedene Anpassungen, Optimierungen und f&uuml;r den
    Assemblerkode in 1st_init.S ohne den wohl st&auml;ndige Probleme
    unvermeidlich gewesen w&auml;ren.<br>
    Dank auch an allen Anderen f&uuml;r konstruktive Kritik, die die
    jetzige, ich denke annehmbare, L&ouml;sung erst m&ouml;glich machte und
    meiner Familie f&uuml;r ihre unendliche Geduld. <br>
    M&ouml;ge sich Jeder eingeladen f&uuml;hlen etwas zu verbessern oder erweitern.<br>

    </div>
    </div>

    <p style="margin-bottom: 0cm;"><b>Funktionen</b><br>
    init_eeprom_man() - Erledigt alle Arbeiten zur Aktivierung der EEPROM-Emulation<br>
    </p>
    <p style="margin-bottom: 0cm;"><b>Nur in eeprom-emu_pc.c sichtbare
    Funktionen</b></p>
    conv_eeaddr() - Wandelt PC Adresse in
    ct-Bot Adresse<br>
    create_ctab() - Erstellt
    Adresskonvertierungstabelle<br>
    check_eeprom_file() - Erstellt leeres
    EEPROM, wenn n&ouml;tig und initialisiert es, wenn gew&uuml;nscht<br>
    flush_eeprom_cache() - Schreibt ver&auml;nderte Daten in eeprom.bin<br>

    <p style="margin-bottom: 0cm;"><b>Zugriffsfunktionen f&uuml;r den PC
    (identisch zu denen der avr-libc)</b><br>
    eeprom_read_byte()<br>
    eeprom_write_byte()<br>
    eeprom_read_word()<br>
    eeprom_write_word()<br>
    eeprom_write_block()<br>
    eeprom_read_block()</p>

    <p style="margin-bottom: 0cm;"><font size="3"><b>Dateien</b></font><br>
    </p>
    <div style="text-align: center;">
    <div style="text-align: left;">eeprom-emu.h - Headerdatei mit den Deklarationen<br>
    eeprom-emu_pc.c - Implementierung der Funktionen
    f&uuml;r ct-Bot &amp; ct-Sim<br>
    <font size="3">1st_init.S - Sorgt f&uuml;r das Korrekte Anlegen der Hilfsvariablen in der Exe</font></div>
    </div>

    <p style="margin-bottom: 0cm;"><br>

    </p>

    <p style="margin-bottom: 0cm;"><br>

    </p>

    <p style="margin-bottom: 0cm;"><br>

    </p>

    </body>
    </html>

- Referenzen:
  - [ct-bot] Kaibrierung
    - From: Carsten Giesen
  - [ct-bot] Kalibrierung der Distanzsensren mittels EEPROM-Tabelle
    - From: Achim Pankalla
  - Re: [ct-bot] Kalibrierung der Distanzsensren mittels EEPROM-Tabelle
    - From: Timo Sandmann
  - Re: [ct-bot] Kalibrierung der Distanzsensren mittels EEPROM-Tabelle und eeprom@pc
    - From: Achim Pankalla
  - Re: [ct-bot] Kalibrierung der Distanzsensren mittels EEPROM-Tabelle und eeprom@pc
    - From: Timo Sandmann
  - Re: [ct-bot] Kalibrierung der Distanzsensren mittels EEPROM-Tabelle und eeprom@pc
    - From: Achim Pankalla
  - Re: [ct-bot] eeprom@pc
    - From: Achim Pankalla
  - Re: [ct-bot] eeprom@pc
    - From: Timo Sandmann
  - Re: [ct-bot] eeprom@pc
    - From: Achim Pankalla
  - Re: [ct-bot] eeprom@pc
    - From: Timo Sandmann
  - Re: [ct-bot] eeprom@pc
    - From: Achim Pankalla
  - Re: [ct-bot] eeprom@pc
    - From: Achim Pankalla
  - Re: [ct-bot] eeprom@pc
    - From: Timo Sandmann
  - Re: [ct-bot] eeprom@pc
    - From: Achim Pankalla
  - Re: [ct-bot] eeprom@pc
    - From: Achim Pankalla
  - Re: [ct-bot] eeprom@pc
    - From: Timo Sandmann
  - Re: [ct-bot] eeprom@pc
    - From: Timo Sandmann
  - Re: [ct-bot] eeprom@pc
    - From: Achim Pankalla
  - Re: [ct-bot] eeprom@pc
    - From: Timo Sandmann
  - Re: [ct-bot] eeprom@pc
    - From: Achim Pankalla
  - Re: [ct-bot] eeprom@pc
    - From: Timo Sandmann
  - Re: [ct-bot] eeprom@pc
    - From: Achim Pankalla
  - Re: [ct-bot] eeprom@pc
    - From: Timo Sandmann
  - Re: [ct-bot] eeprom@pc
    - From: Achim Pankalla

- Voriger (Datum): Re: [ct-bot] eeprom@pc, Achim Pankalla
- Nächster (Datum): Re: [ct-bot] eeprom@pc, Timo Sandmann
- Voriger (Thread): Re: [ct-bot] eeprom@pc, Achim Pankalla
- Nächster (Thread): Re: [ct-bot] eeprom@pc, Timo Sandmann
- Indizes:
  - Datum
  - Thread