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]

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>


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