Forum: Mikrocontroller und Digitale Elektronik EEPROM als FLASH


von ... .. (Gast)


Lesenswert?

Ist es möglich den internen EEPROM oder einen externen EEPROM oder gar 
eine SD-Karte als FLASH-Erweiterung zu benutzen um dort Programmcode 
abzulegen in der Art einer DLL- oder SO-Datei?

Beispielsweise um dort Funktionen für LCD und ähnliches abzulegen die 
dynamisch in den Arbeitsspeicher geladen werden um sie nutzen zu können.

Mir ist durchaus bewusst dass das eine ziemliche Frickelei sein muss, 
allein schon wegen der Sprungadressen und dergleichen.

von Oliver J. (skriptkiddy)


Lesenswert?

Welcher Mikrocontroller?

von ... .. (Gast)


Lesenswert?

ATMEGA8

PS: das hier habe ich gelesen Beitrag "Atmega8 Programm in Hex, aus EEPROM ausführen"

hex will ich nicht, wenn dann schon fertig binäres... klar

von Eumel (Gast)


Lesenswert?

den unterschied zwischen hex und bin würd ich mir nochmal durch den Kopf 
gehen lassen.
Was steht denn in einer Hex Datei die du auf den AVR packen willst?

von Stefan N. (stefan_n)


Lesenswert?

... ... schrieb:
> ATMEGA8
>
> PS: das hier habe ich gelesen Beitrag "Atmega8 Programm in Hex, aus EEPROM ausführen"
>
> hex will ich nicht, wenn dann schon fertig binäres... klar

Dann hast du sicher auch das hier gelesen:

Michael U. schrieb:
> einfache Antwort: geht nicht. Die AVR können Programmcode nur aus dem
> Flash ausführen.

von ... .. (Gast)


Lesenswert?

Oh bitte, ich bin doch nicht blöd. Natürlich kenne ich den Unterschied 
zwischen einer HEX-Datei und einer BIN-Datei. Das wird in dem von mir 
erwähnten Thread sogar noch erwähnt. Das musste ja jetzt wohl nicht 
sein.

Ich verwende hier zum "spielen" einen Display (SDA5708) aus einer alten 
D-BOX. Die Tabelle mit dem Zeichenstz (Zeichen 0x20 - 0x7F = 5 x 16 x 6 
= 480 Byte) könnte ich im EEPROM ablegen.

Das ist aber nicht wirklich Programmcode. Soetwas im EEPROM ablegen kann 
jeder, das ist kein Kunststück.

Mir geht es dann um funktionen wie lcd_put oder dergleichen.

Man kann mich jetzt auch absichtlich falsch verstehen um mich als ... 
genau. mach mich zum TROLL und fütter mich. Und jetzt bitte wieder 
ernsthaft!

von ... .. (Gast)


Lesenswert?

Stefan Noack schrieb:
> Dann hast du sicher auch das hier gelesen:
>
> Michael U. schrieb:
>> einfache Antwort: geht nicht. Die AVR können Programmcode nur aus dem
>> Flash ausführen.

Natürlich habe ich das gelesen. Ich will den Programmcode auch nicht aus 
dem EEPROM ausführen sondern aus dem FLASH und den zuvor aus dem EEPROM 
in den FLASH kopieren... an eine freie Stelle im FLASH.

Habe ich mich wirklich so ungeschickt ausgedrückt???

FLASH ist nicht Arbeitsspeicher, Ich weiss... ja ...

von keiner (Gast)


Lesenswert?

... ... schrieb:
> Stefan Noack schrieb:
>> Dann hast du sicher auch das hier gelesen:
>>
>> Michael U. schrieb:
>>> einfache Antwort: geht nicht. Die AVR können Programmcode nur aus dem
>>> Flash ausführen.
>
> Natürlich habe ich das gelesen. Ich will den Programmcode auch nicht aus
> dem EEPROM ausführen sondern aus dem FLASH und den zuvor aus dem EEPROM
> in den FLASH kopieren... an eine freie Stelle im FLASH.
>
> Habe ich mich wirklich so ungeschickt ausgedrückt???
>
> FLASH ist nicht Arbeitsspeicher, Ich weiss... ja ...

das kann schon irgendwie, lass dir da nichts einreden.

ich bin nicht so sehr in die architektur der avrs vertraut,
möglicherweise kannst du den code aus dem eeprom in den ram kopieren und 
direkt aus dem ram ausführen.

das macht dann auch mehr sinn.


oder per sd karte - es gibt genug bootloader im netz. diese können auch 
den internen flash beschreiben und danach ausführen.
was du also machen kannst ist einen dieser bootloader zu modifizieren, 
je nach state können also andere .bin dateien in den internen flash 
geladen und ausgeführt werden.

die aktuelle state könntest du bspw. am ende des internen srams 
schreiben damit dieser nach dem watchdog reset nicht verloren geht.

von MHD (Gast)


Lesenswert?

Wenn du immer wieder in den Flash schreibst, was soll das werden, ein 
selbstgebasteltes Gerät was nach industriellem Vorbild ein 
Maximalhaltbarkeitsdatum hat?

von O. D. (odbs)


Lesenswert?

> das kann schon irgendwie, lass dir da nichts einreden.

[...]

> ich bin nicht so sehr in die architektur der avrs vertraut

Eben. Also mach ihm auch keine Hoffnung.

> möglicherweise kannst du den code aus dem eeprom in den ram kopieren und
> direkt aus dem ram ausführen.

Nein, das geht nicht, da beim AVR Datenspeicher und Programmspeicher 
(Flash) über getrennte Busse angesteuert werden und damit auch getrennte 
Adressbereiche haben. Es ist schlicht nicht möglich, in das SRAM zu 
springen und dort Code auszuführen.

Siehe auch:
http://de.wikipedia.org/wiki/Harvard-Architektur

> oder per sd karte - es gibt genug bootloader im netz. diese können auch
> den internen flash beschreiben und danach ausführen.
> was du also machen kannst ist einen dieser bootloader zu modifizieren,
> je nach state können also andere .bin dateien in den internen flash
> geladen und ausgeführt werden.

Das ist theoretisch möglich, auch wenn nicht alle AVRs den 
Schreibzugriff auf das Flash vom Programm aus erlauben. Aber was 
"nomatrix" machen möchte und was ein Bootloader tut, sind zwei völlig 
verschiedene Paar Schuhe.

Den Flash zu löschen und neu zu schreiben dauert vergleichsweise sehr 
lange. Die Schreibzyklen sind begrenzt, das heißt das Flash verschleißt 
beim Schreiben und erzeugt irgendwann Bitfehler. Die Prozedur ist zudem 
recht kompliziert, bitte lies den entsprechenden Abschnitt im 
Datenblatt.

Bei Firmware-Updates, die sehr selten mal vorkommen, sind diese 
Nachteile akzeptabel. Zur Laufzeit des Programms allerdings ständig 
benötigte Code-Teile zwischen Flash und einem externen Speicher hin- und 
herzukopieren, ist Schwachsinn und führt zu einer langsamen 
Programmausführung und dem baldigen Ableben des Flashs.

Wenn dein Flash zu klein ist, schreib effizienteren Code, oder wechsele 
zum nächsthöheren Modell mit mehr Flash.

Das EEPROM als dritte Art von Speicher ist übrigens nicht ohne Grund in 
die meisten AVRs eingebaut: Atmel hat durchaus die Notwendigkeit 
erkannt, einige wenige Variablen nicht-flüchtig zu speichern, zum 
Beispiel die Konfiguration eines Gerätes, und hält den Flash-Speicher 
dafür anscheinend selbst nicht geeignet.

Für dein Problem (was ist das genau?) gibt es mit Sicherheit eine 
bessere Lösung.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Was man extern speichern kann, sind Konstanten und Tabellen mit 
Zeichensätzen oder Grafiken. Da man diese dann nicht im internen Flash 
ablegen muss, hat man mehr Platz für das Programm. Ansonsten würde ich 
diesen Tipp beherzigen:

Oliver Döring schrieb:
> Wenn dein Flash zu klein ist, schreib effizienteren Code, oder wechsele
> zum nächsthöheren Modell mit mehr Flash.

von Karl H. (kbuchegg)


Lesenswert?

Dazu kommt, dass dieser Mechanismus einigen Einschränkungen unterliegt. 
Du kannst den Flash nur aus dem Bootsektorbereich heraus beschreiben.

Und ich gebe auch noch zu bedenken: So ein Mechanismus mit dynamischen 
Nachladen ist nicht trivial. Auch der benötigt Code. Und aus dem Bauch 
heraus würde ich mal sagen: Der Mechanismus alleine braucht mindestens 
so viel Code, wie du für LCD Routinen, UART Routinen und noch 2 bis 3 
typische AVR-Module  zusammen verbrutzeln wirst. Du treibst also den 
Teufel mit dem Belzebub aus.

von ... .. (Gast)


Lesenswert?

Ich benutze unter anderem einen ATMEGA1284 für Webserver mit diversen 
Schalt- und Anzeigemöglichkeiten. Nur habe ich da mittlerweile soviel 
Krims-Krams draufgepackt dass da gelegentlich den Speicherplatz 
überschreiten würde und ich irgendwelche Bestandteile ausbauen muss.

Ein kleines ITX-Mainboard wäre wohl nicht verkehrt.

Nein nein. Einmal darüber schlafen brachte mich auf die Idee die 
Funktionen für die SD-Karte auf einen weiteren kleineren Prozessor zu 
packen der nur für dieses Gerät zuständig ist. Die Menge an Code für die 
SD-Karte ja nun nicht gerade gering.

Ich werde mich nun damit beschäftigen eine Schaltung anzufertigen die 
zwischen AVR-NET-IO und dem Add-On gesteckt wird. Eben mit weiterem 
Prozessor. Mal gucken was das wird. Das dürfte mich eine Weile 
beschäftigen.

Nicht von externem Speicher ausfühen können ist echt Mist.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Es geht doch, allerdings braucht man dazu eine Art 'Interpreter' ,der 
logischerweise im Flash residiert. Habs neulich mal auf AVRFreaks 
gelesen und als Spässchen abgetan, denn im Prinzip isses ja Quatsch bei 
dem im Vergleich zum Flash winzigen Speicherplatz. Aber wers braucht :P 
Bin bloss zu faul, den Thread rauszusuchen.

von Frank K. (fchk)


Lesenswert?

... ... schrieb:

> Nicht von externem Speicher ausfühen können ist echt Mist.

Dann hast Du schlichtweg die falsche Prozessorarchitektur gewählt. Dein 
Fehler! ARM und MIPS (PIC32 z.B.) können das.

fchk

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.