Hallo Forum, ich bin mal wieder dabei ein bissl mit meinem AT90USB zu basteln. In meinem Programm lege ich mehrere Strings im EEPROM ab, die bei Bedarf mit Messwerten ergänzt und über UART ausgegeben werden sollen. Dabei stellt sich mir die Frage was sinnvoller ist: a) die Strings bei Programmstart aus dem EEPROM lesen und im RAM ablegen b) die Strings bei Bedarf Zeichenweise aus dem EEPROM an die UART zu schicken. Ram ist im Moment zumindest noch genug vorhanden. Finde ich aber die, sagen wir mal, unelegantere Lösung. Allerdings sollte beim Auslesen aus dem EEPROM auch nicht zu viel Zeit vergehen, da im Programm verschiedene Funktionen in bestimmten Zeitabschnitten aufgerufen werden sollen. Mein Problem dabei ist, dass ich nicht herausfinden konnte wie lange ein EEPROM-Zugriff dauert und nun nicht genau bewerten kann was für mich günstiger ist. Kann das im Moment leider auch nicht messtechnisch ermitteln. Hat hier vielleicht schon mal jemand gemessen wie lange ein Lesezugriff dauert? Im Datenblatt und der Forensuche hab ich leider nix gefunden. Gruß Bad Urban
@ Bad Urban (bad_urban) >a) die Strings bei Programmstart aus dem EEPROM lesen und im RAM ablegen Kostet sinnlos RAM >b) die Strings bei Bedarf Zeichenweise aus dem EEPROM an die UART zu >schicken. Ist OK, der EEPROM ist sehr schnell, schneller als der UART allemal. >Mein Problem dabei ist, dass ich nicht herausfinden konnte wie lange ein >EEPROM-Zugriff dauert Datenblatt gelesen? Adresse in Register EEADRL und EEADRH schreiben. Bit EERE in Register EECR setzen Daten aus EEDATA auslesen. Alles in allem ein halbes dutzend Takte. >dauert? Im Datenblatt und der Forensuche hab ich leider nix gefunden. Dann hast du schlecht gesucht. MFG Falk
Bad Urban schrieb: > In meinem Programm lege ich mehrere Strings im EEPROM ab Warum im EEPROM? Bad Urban schrieb: > Mein Problem dabei ist, dass ich nicht herausfinden konnte wie lange ein > EEPROM-Zugriff dauert Lies dir im Datenblatt mal den Abschnitt EEPROM Read/Write durch:
1 | When the EEPROM is read, the CPU is halted for four clock cycles before |
2 | the next instruction is executed. |
Und die Codebeispiele belegen, dass keine besondere Wartezeit nötig ist:
1 | unsigned char EEPROM_read(unsigned int uiAddress) |
2 | {
|
3 | /* Wait for completion of previous write */
|
4 | while(EECR & (1<<EEWE)) |
5 | ;
|
6 | /* Set up address register */
|
7 | EEAR = uiAddress; |
8 | /* Start eeprom read by writing EERE */
|
9 | EECR |= (1<<EERE); |
10 | /* Return data from data register */
|
11 | return EEDR; |
12 | }
|
Adresse festlegen, Read-Eanble setzen, Daten abholen.
Falk Brunner: > Kostet sinnlos RAM Das find ich ja auch. > Ist OK, der EEPROM ist sehr schnell, schneller als der UART allemal. Ok. So genau hatt ichs nicht geschrieben. Ich nutze einen Buffer für UART es ging mir nur ums Auslesen und in den Puffer schreiben. Senden per UART wird dann über Interrupt gemacht. > Datenblatt gelesen? Ja, auch ne App-Note auf der Atmel Seite. Da wars aber ein Assembler Beispiel mit der Anzahl Zyklen. Ich nutze eeprom_read_byte() zum Auslesen. Hätt mich halt interessiert ob das schon jemand mal gemessen hat. Gruß Bad Urban
Lothar Miller schrieb: >> In meinem Programm lege ich mehrere Strings im EEPROM ab > Warum im EEPROM? Ich lege da, neben den Strings, auch noch andere Einstellungen ab. Und das EEPROM, weil ich dort manche Einstellungen im Betrieb auch wieder ändern und abspeichern will. Deshalb hab ich jetzt mal alles ins EEPROM gelegt. Das bringt mich zu dem Gedanken: Wäre das Auslesen aus dem Flash schneller? Zumidest bei den konstanten Strings? > Lies dir im Datenblatt mal den Abschnitt EEPROM Read/Write durch:When the EEPROM is read, the CPU is halted for four clock cycles before > the next instruction is executed. Werd ich wirklich nachholen. Hatte in den Tabellen mit den Eigenschaften geschaut und dort nix gefunden. Gruß Bad Urban
@ Bad Urban (bad_urban) >Beispiel mit der Anzahl Zyklen. Ich nutze eeprom_read_byte() zum >Auslesen. Da die Jungs vom AVR-GCC nicht doof sind, werden diese Routinen ziemlich nah an die ASM-Version rankommen. MfG Falk
@ Bad Urban (bad_urban) >Das bringt mich zu dem Gedanken: Wäre das Auslesen aus dem Flash >schneller? Zumidest bei den konstanten Strings? Ein wenig. MFG Falk
Falk Brunner schrieb: > Da die Jungs vom AVR-GCC nicht doof sind, werden diese Routinen ziemlich > nah an die ASM-Version rankommen. Ok, wie das da umgesetzt ist hab ich nicht geschaut. Eben nur mal von "Warten bis Auslesen fertig ist" gelesen. Und bei der Gurgel-Suche bin ich als Zahlenwert auch irgendwas um die 4ms gestoßen. Das ist dann schon lang wenn man ca. 100-150 Zeichen auslesen will... Gruß Bad Urban
>Und bei der Gurgel-Suche bin >ich als Zahlenwert auch irgendwas um die 4ms gestoßen. Beim SCHREIBEN, nicht lesen.
Irgendwie gings bei den Sachen die ich gefunden habe immer allgemein um Zugriffe. Aber jetzt weiss ich ja, dass meine Sorge unbegründet war. Euch allen vielen Dank für Eure Hilfe. Gruß Bad Urban
Konstante Daten sollten im Flash liegen, wenn es Variablen oder Strings sind. Structs im Flash abzulegen ist mir unter AVR-GCC noch nicht gelungen. Das ist ein ziemlicher Krampf und völlig unleserlicher Code. Mein Kommandointerpreter hat daher seine Kommando-Struct (Pointer auf String, Pointer auf Funktion) im SRAM angelegt. Konfigurationsdaten kopiere ich zu Anfang in den SRAM und benutze sie dort. Dann kann man auch Änderungen vornehmen, ohne gleich ständig den EEPROM zu stressen (Wearout). Und nur bei Bedarf schreibt man sie zurück oder verwirft sie. Ich hab mir dafür ne kleine schnuckelige Routine geschrieben: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=91306 Peter
Ja, ich muss zugeben, dass ich auf den Flash nicht gleich gekommen bin. Liegt daran, dass ich eben auch veränderliche Strings zu anfang im EEPROM abgelegt habe und dann sozusagen aus Gewohnheit den Rest hintendrangehängt hab :-) Mit den Konfigurationsdaten mach ichs eh so, dass ich sie beim Start ins RAM lese. Das sind auch nur ein paar Bytes.
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.