www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Speicherung zyklischer und azyklischer Daten


Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marko (Gast)
Datum:

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

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

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.