Forum: Mikrocontroller und Digitale Elektronik AVR Core Emulation Source Code in C?


von chris (Gast)


Lesenswert?

Hallo,

weiß jemand, ob es einen in C-geschriebene Emulation für einen AVR-Kern 
gibt?

Gruß,
chris

von Klaus W. (mfgkw)


Lesenswert?

Unter Linux gibt es z.B.:
       simulavr is free software, covered by the GNU General
       Public License, and you are welcome  to  change  it
       and/or  distribute copies of it under the conditions
       of the GNU General Public License.

Ob er in C geschrieben ist, weiß ich nicht, aber die Chancen stehen gut.

von Klaus W. (mfgkw)


Lesenswert?

1
klaus@i4a:~ > simulavr --list-devices
2
  at90s1200
3
  at90s2313
4
  at90s4414
5
  at90s8515
6
  atmega8
7
  atmega16
8
  atmega103
9
  atmega128
10
  at43usb351
11
  at43usb353
12
  at43usb355
13
  at43usb320
14
  at43usb325
15
  at43usb326

von chris (Gast)


Lesenswert?

Hallo Klaus,

habe ich auch gerade hier entdeckt: http://gitorious.org/simavr#more
Ich würde gerne einen Blick auf die Sourcen werfen, aber irgendwie 
scheint das nicht so ganz einfach ....

Ich probiere weiter ...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

AVR-Simulation

SimulAVR started out as a C based project written by Theodore Roth in 
2001. Klaus Rudolph started then in 2004 to rewrite the hardware 
simulation part in C++.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

chris schrieb:
> Hallo Klaus,
>
> habe ich auch gerade hier entdeckt: http://gitorious.org/simavr#more
> Ich würde gerne einen Blick auf die Sourcen werfen, aber irgendwie
> scheint das nicht so ganz einfach ....
>
> Ich probiere weiter ...

why?
http://gitorious.org/simavr/simavr/blobs/master/simavr/cores/sim_tiny13.c
http://gitorious.org/simavr/simavr/blobs/master/simavr/sim/avr_timer.c

von chris (Gast)


Lesenswert?

Ok, danke.
SimulAVR scheint doch schon etwas größeres zu sein.

Meine spontane Idee war folgende: Ich simuliere einen Attiny13 auf einem 
Atmega32. Wird vermutlich ein wenig langsam ( wie langsam? vielleicht 
Faktor 20? ). Das schöne daran: Man kann mehrere Attiny13 auf einem 
Atmega32 laufen lassen.
Der Nachteil des Codes von SimulAVR für das Projekt: Der Code ist zu 
fett und nicht auf Geschwindigkeit optimiert.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

chris schrieb:
> Ok, danke.
> SimulAVR scheint doch schon etwas größeres zu sein.
>
> Meine spontane Idee war folgende: Ich simuliere einen Attiny13 auf einem
> Atmega32. Wird vermutlich ein wenig langsam ( wie langsam? vielleicht
> Faktor 20? ). Das schöne daran: Man kann mehrere Attiny13 auf einem
> Atmega32 laufen lassen.
> Der Nachteil des Codes von SimulAVR für das Projekt: Der Code ist zu
> fett und nicht auf Geschwindigkeit optimiert.

WTF???
Schreib dir nen Scheduler!

von chris (Gast)


Lesenswert?

>Schreib dir nen Scheduler!
Nein, darum geht es nicht.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

chris schrieb:
>>Schreib dir nen Scheduler!
> Nein, darum geht es nicht.

Ich geb dir nen Tipp:
Schnapp dir dafür nen ARM11 oder nen Cortex-R, mach ne C++ Klasse draus 
und instantiiere die für jeden emulierten AVR.

Ich glaub, der C64 Emulator lief erst ab dem Pentium einigermaßen fix.

von chris (Gast)


Lesenswert?

@Random
Schau, nicht jedes Projekt in diesem Forum macht Sinn, aber vielleicht 
trotzdem Spaß:
Beitrag "KIM-1 in AVR?"
Beitrag "CP/M auf ATmega88"

Und da ich nun einmal gerne Projekte verwirkliche, die sonst noch 
niemand so gemacht hat, will ich einen AVR auf einem AVR emulieren.

Tu mir den Gefallen und zerbrich Dir nicht meinen Kopf.

von Peter (Gast)


Lesenswert?

chris schrieb:

und warum brauchst du dafür die c-Quellen? Sich alles aus dem netz 
landen, compiliern zählt für mich nich als
> einmal gerne Projekte verwirkliche, die sonst noch
> niemand so gemacht hat

Spannender ist doch ein Intel I7 auf einem Atmel zu simlieren.

von Max christian P. (_maya_)


Lesenswert?

Bei den AVRFreaks bin ich mal über ein recht junges SimulationsProjekt 
gestolpert. Die sourcen gab's dort auch. Ah ja- gefunden:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=86665

von chris (Gast)


Lesenswert?

>Spannender ist doch ein Intel I7 auf einem Atmel zu simlieren.

An so was ähnliches habe ich schon gedacht. Den Propeller ( 32 Bit , 8 
Core) habe ich spasseshalber schon mal auf einem Atmega32 emuliert ( Den 
COG Speicher habe ich auf 512Bytes begrenzt und nur 2 COGs implementiert 
).

Interessant wäre eine ARM-Emulation auf einem AVR.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Eigentlich könntest du deinen Prozessor doch emulieren (statt ihn
zu simulieren), d. h. du nutzt dir aus, dass dein tatsächlicher
Prozessorkern ja dem des Zielsystems entspricht...

Ansonsten kannst du noch avrsim angucken (ich glaube, so heißt es),
ein minimalistischer CPU-Simulator, der (im Gegensatz zu simulavr)
keinen Anspruch auf eine komplette Simulation des Kerns legt, dafür
aber schnell sein will.

von chris (Gast)


Lesenswert?

Hallo Joerg
>Eigentlich könntest du deinen Prozessor doch emulieren (statt ihn
>zu simulieren), d. h. du nutzt dir aus, dass dein tatsächlicher
>Prozessorkern ja dem des Zielsystems entspricht...
Das wäre ein Idee. Wahrscheinlich wär's gut für die Geschwindigkeit.
Ich würde den Code gern auf unterschiedlichen Zielsystemen laufen 
lassen. Deshalb sollte das ganze "pure C" sein.

>Ansonsten kannst du noch avrsim angucken (ich glaube, so heißt es),
>ein minimalistischer CPU-Simulator, der (im Gegensatz zu simulavr)
>keinen Anspruch auf eine komplette Simulation des Kerns legt, dafür
>aber schnell sein will.

Hab gerade mal drauf geschaut.
http://code.google.com/p/avr-sim/source/checkout

Leider ist alles C++. Die Struktur ist meiner Meinung nach nicht gut für 
die Geschwindigigkeit. Wenn ich es richtig sehe, sollten sich in der 
Klasse
"CoreOperation" in "operations.cpp"

alle Befehle des Cores befinden. Beim schnellen Überfliegen vermisse ich 
schon gleich die "Jumps". Deshalb vermute ich, dass das Projekt sich 
noch in einem ziemlich rudimentären Zustand befindet.

von Klaus W. (mfgkw)


Lesenswert?

Wenn ein jump denn eine operation ist...

von chris (Gast)


Lesenswert?

Wenn's keiner ist, wo steht der Code?
Wie ist mit nem BRNE?

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Ich hoffe, ich nehme den Thread hier nicht ernster als er gemeint ist, 
aber als ich gerade einen 6502-Emulator für Atmega geschrieben habe kam 
mir auch spontan in den Sinn, das Ganze doch einfach auch für den AVR 
selbst zu machen. Sollte sogar Sinn machen damit man dynamischen Code im 
SRAM ausführen kann(manchmal stört die Harvard-Architektur). Bevor ich 
mich mal praktisch darin eingarbeitet hatte, dachte ich, es wäre 
einfacher als eine fremde CPU zu emulieren, da die Befehle ja identisch 
sind.

Aber mal aus der (versuchten) Umsetzung betrachtet: vergess den Faktor 
20 selbst mit Assembler. Das Hauptproblem an dem ganzen ist die 
Bit-Struktur der AVR-Befehle. Vielleicht ist das nur ein großes 
Logikrätsel, das ich bisher nicht gelöst habe oder eine Analyse der 
Logikstruktur des AVR-Kerns würde die Idee bringen. Aber die ganzen 
Bitschiebereien, die nötig sind, aus den 16-bit den Opcode, Register und 
Werte zu extrahieren plus notwendige Sprünge und Verarbeitung halte ich 
für ausgeschlossen in 20 Takten, unter 32 bis 40 ist da nix zu machen. 
IO kann dabei keiner emuliert, höchstens genutzt werden und ohne 
Assembler kann man da noch einige Takte draufrechnen.

Ich verfolge das derzeit nicht groß weiter da ich mir die 
1MHz@20Mhz-Emulation als Ziel gesetzt hatte, aber wäre neugierig, 
wieviele kHz da jemand hinbekommt.

von chris (Gast)


Lesenswert?

>Ich hoffe, ich nehme den Thread hier nicht ernster als er gemeint ist,
Hallo Mark,
es ist schon irgendwie ernst gemeint. Man kann ja mal über das Thema 
diskutieren und schauen, welche kreativen Ideen so entstehen.

>aber als ich gerade einen 6502-Emulator für Atmega geschrieben habe kam
>mir auch spontan in den Sinn, das Ganze doch einfach auch für den AVR
>selbst zu machen. Sollte sogar Sinn machen damit man dynamischen Code im
>SRAM ausführen kann(manchmal stört die Harvard-Architektur).

Ja, es ist eine Virtualisierung. Vielleicht wie eine JVM. Um den 
Speicher zu vergrößern könnte man vielleicht ein serielles SRAM oder 
EEPROM oder SD-Karte dran hängen.
Ich glaube nach diesem Prinzip haben die ersten BASIC-Stamps gearbeitet.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

chris schrieb:

> Leider ist alles C++.

Was wäre daran nun unbedingt tragisch?

> Die Struktur ist meiner Meinung nach nicht gut für
> die Geschwindigigkeit.

Das würde mich wundern, denn Geschwindigkeit war das primäre
Entwicklungsziel dieser Implementierung.  Es war explizit gewünscht,
dass das Teil, wenn es auf einem PC läuft, möglichst viel schneller
als ein realer AVR ist.

> Deshalb vermute ich, dass das Projekt sich
> noch in einem ziemlich rudimentären Zustand befindet.

Das sollte mich wundern.  Das wesentliche Ziel dieses Projekts war
oder ist es, einen Simulator anzubieten, auf dem man während der
GCC-Entwicklung den vom Compiler generierten Code (automatisiert)
möglichst schnell simulieren kann, sodass man damit Qualitätsanalysen
am generierten Code vornehmen kann.  Dafür muss der CPU-Kern natürlich
komplett implementiert sein, während man vom IO-Subsystem außer dem
Stackpointer und den erweiterten Zeigerregistern (RAMPZ und sowas)
praktisch nichts braucht.

Vorstellbar wäre es natürlich, dass Features des CPU-Kerns, die vom
GCC nie angefasst werden, auch nicht implementiert sind.

von chris (Gast)


Lesenswert?

>Das wesentliche Ziel dieses Projekts war
>oder ist es, einen Simulator anzubieten, auf dem man während der
>GCC-Entwicklung den vom Compiler generierten Code (automatisiert)
>möglichst schnell simulieren kann, sodass man damit Qualitätsanalysen
>am generierten Code vornehmen kann.

Hast Du den Simulator für Deine Projekte schon einmal verwendet?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

chris schrieb:
> Hast Du den Simulator für Deine Projekte schon einmal verwendet?

Nein, aber Eric Weddington meines Wissens.

Ich simuliere eher selten, ich gehe lieber auf's fertige Zielgerät
und debugge mit dem JTAG ICE.  Allerdings ist der Großteil meiner
zu debuggenden Probleme ohnehin eher an die Peripherie und dessen
Interaktionen mit der Umwelt gebunden, da ist eine Simulation dann
ziemlich schnell am Ende mit ihrem Latein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.