Forum: Mikrocontroller und Digitale Elektronik Wie Firmware Einstellungen auf einem Cortex M3 verwalten?


von BAuer (Gast)


Lesenswert?

Hallo Zusammen

Ich erarbeite gerade das Software-Design für eine Firmware, welche auf 
einem Cortex M3 läuft.
Unter Anderem muss die Firmware auch Einstellungen abspeichern können. 
Da ich relativ viele Einstellungen mit unterschiedlicher Grösse 
(Int32,Arrays,structs,etc) abspeichern muss und das Mapping von 
Speicheradresse zu Einstellung ziemlich aufwändig und fehleranfällig 
ist, frage ich mich was es da für bewährte verfahren gibt.

Zum System: Flash Speicher ist genügen vorhanden auch ein File System 
läuft bereits.

XML scheint mir für einen Cortex M3 nicht angebracht zu sein, oder?
Gibt es andere Formen einer rudimentären Datenbank für M3s?

Ich bin für gute Vorschläge offen

Grüsse
BAuer

von Frank K. (fchk)


Lesenswert?

Tag - Length - Data, so wie bei TIFF und anderen Binärformaten. Das gibt 
zwar einen ziemlichen Overhead, wenn Du viele Einzelwerte ablegen 
willst, aber die kannst Du ja in structs sinnvoll gruppieren.

fchk

von BAuer (Gast)


Lesenswert?

Danke Frank
Ich werde mir das mal genauer durchdenken. Ist mit "Tag" ein Key gemeint 
nach dem dann in einem Array von Tag-Length-Data structs gesucht wird?

Was ist mit SQLite3, läuft das zufriedenstellend auf einem M3?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ich habe auch schon mal mehrere 100 Parameter verwaltet.
Dazu habe ich mir eine Struktur geschaffen um einen Parameter zu halten. 
Enthalten waren z.B. Parameter-Nummer, Zeiger auf Variable, Typ, Max/Min 
Werte, EEPROM-Adresse usw. sowie einen Funktionszeiger wenn bei Änderung 
eine Funktion ausgeführt werden soll (z.B. Uhr stellen).
Diese Struktur als Array deklariert und liegt im Flash. Die eigentliche 
Variable liegt dann irgendwo im RAM.
Hat gut funktioniert, war übersichtlich und ist einfach erweiterbar.

Das schöne war: Das Bedien-Menü kann über dieses Array die Werte 
Darstellen und ändern, sowie die Parametrierung über CAN Bus war auch 
kein Problem.

Um schneller auf die Werte zu  zugreifen habe ich mir eine Tabelle im 
RAM angelegt Parameter-Nummer <> Array-Index und ich habe die maximale 
Parameter-Nummer auf 1000 begrenzt damit die Tabelle nicht zu groß wird.

Einfacher geht das fast nicht. SQLite würde ich jetzt nicht für einen 
M3er verwenden.

von Frank K. (fchk)


Lesenswert?

BAuer schrieb:

> Ich werde mir das mal genauer durchdenken. Ist mit "Tag" ein Key gemeint
> nach dem dann in einem Array von Tag-Length-Data structs gesucht wird?

Ja, üblicherweise ein FOURCC, dh. 4 Chars wie 'FORM' oder 'DATA', die 
das menschliche Suchen in einem Hexdump vereinfachen. Lies mal...

http://en.wikipedia.org/wiki/Interchange_File_Format

Das kam vor 30 Jahren mit dem Amiga auf und lebt heute in verschiedenen 
Varianten wie PNG oder WAV weiter.

> Was ist mit SQLite3, läuft das zufriedenstellend auf einem M3?

Das wäre mir jetzt zu fett. TLV-Arrays bekommst Du auch auf einem 
8-Bitter problemlos implementiert.

fchk

von Jojo S. (Gast)


Lesenswert?

das JSON Format wird zur Zeit auch ganz gerne genommen, ist eine 
kompaktere XML Variante.
http://de.wikipedia.org/wiki/JSON

von W.S. (Gast)


Lesenswert?

BAuer schrieb:
> Da ich relativ viele Einstellungen mit unterschiedlicher Grösse
> (Int32,Arrays,structs,etc) abspeichern muss und das Mapping von
> Speicheradresse zu Einstellung ziemlich aufwändig und fehleranfällig
> ist, frage ich mich was es da für bewährte verfahren gibt.

Ähh..wie bitte?
Könntest du mal erklären, was du da eigentlich speichern willst?

Für Einstellwerte braucht man einen externen (oder falls vorhanden 
internen) EEPROM oder evtl auch sowas wie einen seriellen Flash, weil 
der interne Programmspeicher meist nicht so viel Schreib/Lösch-Zyklen 
aushält.

Deine Einstellungen wirst du ja wohl im laufenden Betrieb brauchen, 
oder? Dafür müßten sie dann auch im internen RAM vorgehalten werden und 
dort wäre ein simples struct, das man komplettiko in den EEPROM/SerFlash 
rettet, die sinnvollste Lösung: braucht am wenigsten Platz, braucht 
keinerlei Codierung und Decodierung - bloß eben ein wenig Gehirnschmalz 
zur sinnvollen Strukturierung des struct-Inhaltes.

W.S.

von BAuer (Gast)


Lesenswert?

Ich danke euch für eure Hilfe.

Ich denke ich werde etwas in der Richtung von Markus Vorschlag 
entwerfen.
Das IFF Format hört sich aber auch interessant an, werde es bei 
Gelegenheit genauer studieren. Muss ja meine Messwerte auch irgendwie 
gescheit speichern aber das ist ein anderes Thema.

Das JSON Format scheint mir für C nicht geeignet, oder ich habe da etwas 
falsch verstanden. Ich müsste ähnlich wie bei XML viel Text parsen.

Danke
BAuer

von MarcVonWindscooting (Gast)


Lesenswert?

W.S. schrieb:
> Ähh..wie bitte?
> Könntest du mal erklären, was du da eigentlich speichern willst?

Hatte was aehnliches schon geschrieben, aber dann doch komplett 
verworfen.

> XML, File System, Datenbank...
Alles overkill.

Ich kenn ein besseres buzzword: KISS

von MarcVonWindscooting (Gast)


Lesenswert?

Vermutlich ein ziemlich "ahnliches Problem:

http://www.lpcware.com/content/forum/iap-and-variable-memory-mapping

von Dr. Sommer (Gast)


Lesenswert?

W.S. schrieb:
> Dafür müßten sie dann auch im internen RAM vorgehalten werden
Man könnte die Werte auch einfach im Flash lassen und direkt von da 
verwenden; also zB ein struct definieren und das im Flash platzieren. 
Bei Bedarf da die Werte auslesen & verwenden. Zum Flash lesen brauchts 
ja am M3 keine Sonderbefehle wie beim AVR. Die werte im RAM zwischen zu 
speichern ist RAM-Verschwendung... Nur beim speichern muss man ein 
bisschen magic machen zum Flash-schreiben.

von Jojo S. (Gast)


Lesenswert?

es kommt doch darauf an wie komplex das Gerät(chen) ist: ob ich die 
Parameter auch ausserhalb des Gerätes bearbeiten können möchte, ob 
Firmware Updates geplant sind und wie häufig Parameter geändert und 
gespeichert werden.
Bei letzerem ist das Limit die Speichertechnologie, da würde ich evtl. 
FRAM nehmen wenn Betriebsstunden zyklisch gespeichert werden oder sich 
Parameter ständig im Betrieb ändern können. Dann schreibt man auch so 
häufig das es performant sein soll und Speichern/Laden über binäre 
Strukturen das einfachste ist.
Wenn man (häufige) Firmwareupdates vor hat sollte man bedenken: binäre 
Strukturen müssen immer kompatibel erweitert werden. Bei Änderungen muss 
von jeder vorheriger Version auf eine Neue die Struktur kompatibel 
bleiben oder in der Firmware automatisch konvertiert werden oder man 
muss auf Default zurückfallen können. Und da fängt der Spass an wo JSON 
& Co. Sinn machen. Beispiel ein Receiver der seine Senderliste im Flash 
hält: eine kleine Erweiterung je Sender und alle gespeicherten Daten 
werden falsch interpretiert und der Benutzer darf alles neu eingeben. 
Oder noch gefährlicher bei einer Motor/Maschinensteuerung die plötzlich 
unplausible Einstellungen vorfindet.
Da ist JSON/XML wesentlich wartungsfreundlicher und kompatibel zu 
halten. Für einen kleinen Timer der nur die letzte eingestellte Zeit 
merken soll oder ein Gerätchen an dem nur die IP-Adresse einstellbar ist 
das natürlich Overkill. Aber wenn Firmware Updates ein Thema sind sollte 
man sich das gut überlegen. Es gibt so Libs wie JSONlite o.ä., da muss 
man den Parser auch nicht neu erfinden.

von Radu (Gast)


Lesenswert?

Hallo, hallo

Zwei Links...

1. Hier die Technik (als Beispiel für die Verwendung vom offsetof-Makro) 
http://www.rmbconsulting.us/uses-for-cs-offsetof-macro

2. Hier ein EEPROM-Emulator im Flash: 
Beitrag "STM32: EEPROM Emulator im Flash"

(1) hat für mich immer funktioniert...


Gruß,
Radu

von W.S. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Man könnte die Werte auch einfach im Flash lassen

Dann wären es aber keine Einstellwerte mehr, sondern Konstanten. Aber 
der TO will ja
"Unter Anderem muss die Firmware auch Einstellungen abspeichern können."
haben. Also doch in den RAM und nicht ins Flash. Das ginge zwar, würde 
aber unter den Schreibvorgängen leiden.

W.S.

von Dr. Sommer (Gast)


Lesenswert?

W.S. schrieb:
> Das ginge zwar, würde aber unter den Schreibvorgängen leiden
EEPROM aber genauso. Und wie oft willst du die Einstellungen ändern? So 
oft dass das Zwischenspeichern lohnt?

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.