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.
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
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.
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.
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...
Da du einen Vergleich mit dem RAM wolltest: Ein Lesezugriff auf Flash braucht im Vergleich zu RAM pro Byte einen Taktzyklus mehr.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.