Forum: Mikrocontroller und Digitale Elektronik Speicherung zyklischer und azyklischer Daten


von Marcus (Gast)


Lesenswert?

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

von Marko (Gast)


Lesenswert?

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

von Marko (Gast)


Lesenswert?

ach so, bei der dritten Variante würd das dann in etwa so aussehen:

0                                                   &Hffffff
xzzzz-xzzzz-xzzzz-xzzzz- ............... aaaay-aaaay-aaaay

von Marcus (Gast)


Lesenswert?

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.

von Hagen (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.