Forum: Mikrocontroller und Digitale Elektronik PROGMEM Zeitdauer Zugriff auf Flash


von Manuel (Gast)


Lesenswert?

Hallo,

mit PROGMEM ist ja der Zugriff auf Konstanten im Flash möglich wie im 
Tutorial beschrieben:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29

Nun stellt sich für mich die Frage, wie schnell der Zugriff ist. Ist die 
Zugriffszeit vergleichbar mit dem Zugriff im RAM? Im Tutorial habe ich 
dazu leider nichts gefunden.

Ich weiß, dass der Zugriff auf EEPROM Daten etwas Zeit benötigt, daher 
meine Frage, ob dies im Flash auch der Fall ist.

Danke.

von Thiemo N. (thiemo)


Lesenswert?

Hi,

eine LPM ("load program memory") Instruktion dauert z.B. beim ATTiny88 3 
Clockzyklen. Sowas steht in seinem Datenblatt in der "Instruction Set 
Summary"... Wieviele solche Instruktionen dann für Deine dort abgelegten 
Daten nötig sind, hängt sicherlich von der Datenmenge ab. ;)

Schreiben (solltest Du das wollen) dauert länger - da hilft vielleicht 
die Appnote AVR109, "Self Programming", weiter.

HTH & Besten Gruß,
  Thiemo

von Manuel (Gast)


Lesenswert?

Hallo,

es geht mir wirklich nur um das Lesen auf einem Atmega8
Ich habe einen konstanten Array  mit 200 Werten mit dem Datentyp int32_t 
(Tabelle).
In einem Interrupt soll dann aus dieser Tabelle mit 200 Werten immer nur 
einer gelesen werden, aber eben zeitkritisch. Bei 3 Taktzyklen ist das 
in Ordnung.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Manuel schrieb:
> Bei 3 Taktzyklen ist das
> in Ordnung.

Da wird aber kein 32-Bit-Wert gelesen, sondern nur ein 8-Bit-Wert. 
Bedenke, daß Dein AVR ein 8-Bit-Controller ist.

Um einen 32-Bit-Wert zu verarbeiten, ist also deutlich mehr Aufwand 
erforderlich.

von Thiemo N. (thiemo)


Lesenswert?

Manuel schrieb:
> Ich habe einen konstanten Array  mit 200 Werten mit dem Datentyp int32_t
> (Tabelle).
[ ... ]
> Bei 3 Taktzyklen ist das in Ordnung.

Naja, einmal LPM gibt Dir jeweils ein Byte - um 32 bit zu lesen, 
braucht's vier Byte, die Du noch zusammensetzen mußt. einen "int32_t" zu 
lesen dauert dann keine 3 Zyklen mehr...

von Rolf Magnus (Gast)


Lesenswert?

Da du einen Vergleich mit dem RAM wolltest: Ein Lesezugriff auf Flash 
braucht im Vergleich zu RAM pro Byte einen Taktzyklus mehr.

von Manuel (Gast)


Lesenswert?

Damit kann ich leben. Wichtig war mir nur, dass es sich nicht um 
Bereiche >100us handelt, was bei meinem Takt von 8Mhz wohl dann nicht 
erreicht wird.

von c-hater (Gast)


Lesenswert?

Rolf Magnus schrieb:

> Da du einen Vergleich mit dem RAM wolltest: Ein Lesezugriff auf
> Flash
> braucht im Vergleich zu RAM pro Byte einen Taktzyklus mehr.

Korrekter: einen Taktzyklus PRO BYTE.

Leider gilt das nicht für jede Adressierungsart, denn einige gibt es 
einfach nicht für Zugriffe auf den Flashspace, insbesondere nicht die 
mit displacement, die Compiler gern für den Zugriff auf Datenstrukturen 
benutzen und auch keine mit predecrement.

Diese Sachverhalte können sich bezüglich des Mehrverbrauchs an 
Rechenzeit bei bestimmten Zugriffsmustern ziemlich fatal auswirken, 
besonders, wenn auch noch Flash oberhalb 64k benutzt werden soll.

Statt des absolut unvermeidlichen 50%igen Zuwachses können sich dann 
nämlich auch mal eben auch 200..300% ergeben.

Und das ist noch großzügig gerechnet, denn hier ist der typische 
Overhead einer Zählschleife (der sich bei RAM- und Flash-Zugriffen 
gleichermaßen negativ auswirkt) bereits eingerechnet.

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.