servus, ich mache mir gerade gedanken wie man die speicherung verschiedener daten von einen µC über I2C bus in ein EEPROM realisieren kann. einerseits habe ich zyklische daten (stunden-, tagesspeicher, etc) die nach einer bestimmten zeit programmatisch gespeichert werden. diese zyklische speicherung so zu managen, dass sich nichts in die quere kommt wäre ja einfach: stundenspeicher bekommt im programm nen zähler; wenn dieser =24 ist wird die nächst höhere speicherung (=> tagesspeicher) ausgelöst. soweit so gut... leider gibts nun aber noch die azyklischen ereignisse, wie zB verschieden fehlerzustände und sonstige ereignisse, die theoretisch zu jedem zeitpunkt auftreten können. wie kann ich den ganzen klimbatsch nu am besten regeln, ohne das sich etwas in die quere kommen kann? gedacht hatte ich mir folgendes: eine art "briefkasten" in form eines FIFO speichers (zB 10 plätze à 128byte, so gross [pagewrite] sind die blöcke die ich ins EEPROM speichere) in den anfallende datenblöcke "reingeworfen" werden und, sollten mehrere gleichzeitig auftreten, nacheinander übertragen werden. so passiert natürlich keine trennung zwischen zyklischen und azyklischen ereignissen; zweitere sind evtl wichtiger und damit zeitkritischer, was aber meiner meinung nach bei einer speicherzeit eines 128byte blocks von ca. 14ms bei 100kHz busgeschwindigkeit vernachlässigbar ist, oder? sorry, ist vllt bissl viel, aber weiss nicht, wie ich es sonst erklären soll... hat dazu evtl jemand noch einen anderen, besseren tipp?!? mfg
Naja, du könntest den Daten bestimmte Zeiger geben, das eeprom dann einfach fortlaufen schreiben und jeden Block markieren, in etwa so: z=zyklische Daten a=azyklische Daten x=zeiger zyklisch y=zeiger azyklisch xzzzz-xzzzz-xzzzz-yaaaa-xzzzz-yaaaa-xzzzz-xzzzz-xzzzz-xzzzz-xzzzz-yaaaa .... Der Nachteil, du brauchst mehr Platz auf dem EEPROM, weil ja der Zeiger auch immer mit drauf muß und du musst den gesamten Speicherinhalt durchgehen um auf bestimmte Daten zuzugreifen, weil du ja nicht weißt wo genau sie liegen. Die andere Variante wär du nimmst n zweites EEPROM und hängst es auf den IIC dazu auf anderer Adresse. EEPROM 1 bekommt die zyklischen Daten, EEPROM 2 bekommt die Azyklischen + einen Timecode, damit man sie im zeitlichen Ablauf den Zyklischen zuordnen kann. Eine weitere Variante wär die Schreibpositionen von beiden Seiten des Adressraums her zu füllen. Die Zyklischen schreibste von Adresse 0 an aufwärts, die azyklischen von der Endadresse her rückwärts. Der Speicher wär dann voll, wenn die Position der azyklischen Daten kleiner der Position der zyklischen wäre. Auch hier müsstest Du dann den azyklischen z.B. eine Timestamp für die Zuordnung mitgeben ... Du bräuchtest aber halt nur einen Baustein. Das wär so das was mir so auf Anhieb einfällt
ach so, bei der dritten Variante würd das dann in etwa so aussehen: 0 &Hffffff xzzzz-xzzzz-xzzzz-xzzzz- ............... aaaay-aaaay-aaaay
danke dir, aber der speicherbereich und die blockgrösse ist festgelegt. gespeichert werden die daten alle in ringspeichern. das ist auch nicht (zumindest noch nicht) das problem. mir geht es um das zeitliche management, so dass es ausgeschlossen ist, das sich zyklische und azyklische speicheraufgaben in die quere kommen, bzw. dies verhindert/geregelt wird. habe damit noch keine erfahrung wie man sowas programmatisch regelt; mein erster einfall war halt die art "briefkasten", wo zwar nicht unterschieden wird ob zyklisch oder azyklisch, aber einfach alles nacheinander gespeichert wird, ohne priorisierung.
Baue wie bei einem UART noch Zwischenspeicher im SRAM ein. Du kannst ja PI*Daumen ausrechnen wieviele Ereignisse als Spitzenwert auf einmal vorkommen können. So groß sollte das Fassungsvermögen dieser 3 SRAM Buffer sein. 3 Buffer da du schon ab hier nach dem Ereignisstyp unterscheidest. Diese Buffer werden dann nach ihrem "Füllstand" priorisiert in den langsammeren externen Speicher im Hintergrund ausgelagert. Der externe Speicher ist dabei in 3 Bereiche aufgeteilt die in ihrer Größe deinen Anforderungen angepasst sind. Heist wenn alle Stunde ein Stundenereigniss reinkommt und du 7 Tage speichern möchtest dann sind das also 24*7 Stundenrecords an Speicher. Für die Minutenereignisse das gleiche und für die azyklischen Ereignisse dann den Rest des Speichers. Durch diese feste Trennung des Speichers hast du alleine auf Grund der Position der Daten im Speicher schon deren Typ als Information OHNE zusätzlichen Speicherplatz ermittelt. Ds gleiche gilt dann für die Zeiten. Sprich beim Stundenereigniss ist der erste Record im Speicher immer Stunde 0 relativ gesehen zur Stunde des Startens der MCU. Du musst also nur die Startzeit der MCU im EEPROM speichern und die Anzahl der aufgetretenen Ereignisse und kannst dann zb. die Stundenereignisse wiederumnur an Hand ihrer Position im Speicher einen Zeitstempel zuordnen OHNE diesen explizit speichern zu müssen. Zudem vereinfacht sich das Positionieren im Speicher während der Speicherung. Denn zb. die 7. Stunde befindet sich immer als 7. Record im Speicher. Beim einem 24 Stundenspeicher würde demnach die 7. Stunde des nächsten Tages automatisch die 7. Stunde des vorherigen Tages überschreiben. Dh. für alle zyklischen Ereignisse kannst du von vorhinein exakt ausrechnen wieviel Platz, Prozessorzeit, Ereignisanzhal usw. du benötigst und diesen dann fest vorgegeben reservieren. Das solltest du in der Software als "Information" benutzen. Gruß Hagen
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.