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: 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ü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ür den PC stellt das EEPROM des <i>Atmel
MEGA32(644) Prozessor</i> auch dem ct-Sim zur Verfügung.
Der Zugriff auf dieses EEPROM erfolgt über gleichnamige
Funktionen, wie sie auch die avr-libc bereitstellt und auch die
Variablendefinition erfolgt über die gleichen Konstrukte. Eine
Unterscheidung ü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äher gekommen und Programme mit EEPROM-Zugriffe können mit
der Simulation getestet werden. Mehr noch, Sie können auch den
Inhalt des emulierten EEPROM auf den ct-Bot übertragen oder das
EEPROM vom
ct-Bot laden und fü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äre Datei (genau 1 KB bzw. 2 KB groß) repräsentiert 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ä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 überschrieben.<br>
Damit die
EEPROM-Funktionen des PC korrekt auf die Datei zugreifen können
darf nur ein Adressraum von 0 bis 1023 (bzw. 2047) entstehen. Die
Emulation muss also wissen welche Speicheradresse die
erste Variable im EEPROM hat, um diesen Wert von allen Anderen
abzuziehen. Dafür bedarf es bei
der PC Implementierung (mit PC ist allgemein der Code für den
ct-Sim gemeint, mag das OS nun Win, Linux oder Mac OS X heißen)
eines Tricks. <br>
Dafü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 die EEPROM-Emulation auch als Initialisierung fü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ür genutzt. Arbeitet man im PC-Modus, kann diese Datei auch in eeprom.bin umbenannt werden.<br>
Damit die Emulation mö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 des ct-Bot als emuliertes EEPROM nutzen kann,
werden Post-Builds benö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ür den realen ct-Bot.
Natürlich hat der PC kein EEPROM, dieses wird durch
eine Datei im Binärformat emuliert. Der Dateinamen und der Pfad
wird ü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 über
ein DEFINE der Prozessortyp festgelegt wird, entweder ATMega32 oder
ATMega644. Dieses DEFINE ist beim PC Compiler normalerweise nicht
gesetzt. Standardmäßig wird von einem ATMega32 mit
1024 Byte EEPROM ausgegangen, Die Emulation kennt aber die Konstante
für den ATMega644 und erhöht den EEPROM Speicher auf 2048
Bytes. Sollte schon eine 1 KB Datei fürs EEPROM bestehen, so muss
diese gelöscht werden, damit die Größere angelegt
wird. Wird direkt die erstellte <i>ct-bot.eep</i> Datei im PC-Modus genutzt, ist
dies natü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ä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äß
arbeiten kann. Es erfolgt kein Beenden bei
Problemen, die Funktion des EEPROMs ist dann aber nicht gegeben. Bei
Auffä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ötigt keine weiteren Einträge im Post-Build. Wenn eine <span style="font-style: italic;">ct-bot.eep</span> im Binä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ürlich, dass der Bot auch mit zuletzt
erstelltem Programm bespielt ist. Natü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ür sind im Post-Build die Befehle aus den Kommentarkopf aus <span style="font-style: italic;">eeprom-emu_pc.c</span> einzutragen.</p>
Für Linux oder Mac OS X gelten ähnliche Befehle, in den
Projekteinstellungen im SVN sind die nötigen Post-Build-Einstellungen für alle
Betriebssysteme bereits gemacht.
<br>
</li>
</ol>
<p style="margin-bottom: 0cm; text-align: justify;">Mö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ür die MAP-Dateien werden in den Konstanten EEMAP_PC und EEMAP_MCU eingetragen.<br>
Die Variable MAX_VAR legt die Größe der Tabelle fest und
beschrängt damit die maximale Anzahl der Variablen. Sollte die
Fehlermeldung auftreten, das es zu viele Variablen gibt, muss man
diesen Wert nur erhöhen. <br>
</font></font></font></p>
<font color="#000000"><font face="Times New Roman, serif"><font size="3">Für
das Debuggen von Zugriffen auf das EEPROM stehen unter anderem die
DEFINES LOG_STORE und LOG_LOAD zur Verfü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 überprü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ührt, damit dies kein Problem mehr
ist. Es gibt aber keine Garantien dafür, dass zukünftige Compiler
Versionen nicht die Reihenfolge der Variablen im Code ändern.
Ein Einfügen neuer EEPROM Variablen kann auch zu Verschiebungen
der Adressen führen. Nach solchen Änderungen (auch ein ä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öschen) und für MCU und ct-Sim neue Exe generiert werden.
Einmal erstellte Werte sind dann natürlich futsch. Wenn man den
Einfluss von Codeergänzungen kontrollieren will, kann man dies
vor und nach der Änderung mit <span style="font-style: italic;">objdump</span> machen (oder falls Sie
die Befehle fü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önnen dann sehen, ob
die neuen Variablen nun hinten angehängt wurden (dann brauch das
EEPROM nicht gelöscht werden) oder sie dazwischen gelandet sind
(dann sind die alten Daten unbrauchbar), dafür sollten sie aber
vorher in Eclipse <span style="font-style: italic;">Projekt->clean</span> aufrufen.<br>
Der Compiler für das ct-SimEXE kann aufgrund der Implementierung
des EEPROM auf den PC nicht kontrollieren, ob mehr als 1024/2048 Bytes
für die Variablen benö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ür das Testen unter MacOSX und
für verschiedene Anpassungen, Optimierungen und für den
Assemblerkode in 1st_init.S ohne den wohl ständige Probleme
unvermeidlich gewesen wären.<br>
Dank auch an allen Anderen für konstruktive Kritik, die die
jetzige, ich denke annehmbare, Lösung erst möglich machte und
meiner Familie für ihre unendliche Geduld. <br>
Möge sich Jeder eingeladen fü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ötig und initialisiert es, wenn gewünscht<br>
flush_eeprom_cache() - Schreibt veränderte Daten in eeprom.bin<br>
<p style="margin-bottom: 0cm;"><b>Zugriffsfunktionen fü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ür ct-Bot & ct-Sim<br>
<font size="3">1st_init.S - Sorgt fü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>