Forum: Mikrocontroller und Digitale Elektronik Config Parser für embedded


von M. Н. (Gast)


Lesenswert?

Hallo,

ich suche nach einer "kleinen" open-source Library, die es ermöglicht, 
Config-Dateien (Format richtet sich nach Lib) einzulesen.

Auf dem Rechner habe ich immer gerne libconfig verwendet. Das ist recht 
simpel und angenehm (https://github.com/hyperrealm/libconfig). 
Allerdings erfüllt diese Lib für mein aktuelles Programm die 
Anforderungen nicht ganz:

Es handelt sich um ein embedded Projekt auf einem STM32F4. Somit sind 
Programmspeicher und RAM zumindest recht endlich.

Mein Controller hat 512 kB Flash und ist momentan zu ca 30 % voll. Grob 
geschätzt wird mein Code, wenn er fertig ist, den Controller zu 50 - 60 
auslasten. Die Library sollte somit in den verbleibenden Speicher passen 
~200 kB.

libconfig gefällt mir in diesem Fall nicht so, da sie dynamischen 
Speicher benötigt. Meine Software kommt bisher ohne Heap aus und ich 
fände es schön, wenn das auch so bleibt.

Das Format der Configdateien, die zu lesen sind, ist mir quasi egal. Es 
muss lediglich von Hand editierbar sein (ASCII Klartext) und die 
Möglichkeit bieten
'key = value' Paare abzubilden.

Nochmal die Anforderungen in Stichpunkten:

1) Wenn möglich: Statischer Speicherverbrauch!
2) In C geschrieben
3) Open Source (verwendbar in einem GPLv2 Projekt)
4) Akzeptabler Footprint für embedded SW

Vielen Dank

von Stefan F. (Gast)


Lesenswert?

Mal eine ernst gemeinte Frage: Was ist daran schwer, ein Properties File 
zu parsen? Dafür braucht man doch keine Library!

Alles, was man dazu braucht, befindet sich in der stdio.h und string.h.

von M. Н. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Mal eine ernst gemeinte Frage: Was ist daran schwer, ein Properties File
> zu parsen? Dafür braucht man doch keine Library!
>
> Alles, was man dazu braucht, befindet sich in der stdio.h und string.h.

Ansich nichts. Für meine Anforderungen reicht das auch. Ich bin aber 
neugierig, was es für embedded-geeignete Libraries gibt, die vielleicht 
noch etwas mehr können. Eventuell auch für zukünftige Projekte. Aus 
eigener Erfahrung weiß ich, dass ein guter Parser gar nicht so leicht 
ist, wenn er robust sein soll.

von Stefan F. (Gast)


Lesenswert?

M. H. schrieb:
> Aus eigener Erfahrung weiß ich, dass ein guter Parser gar
> nicht so leicht ist, wenn er robust sein soll.

Ja aber es geht doch um ein Embedded Projekt, nicht um einen Web Browser 
der alles schlucken können muss, was da kommen mag.

von M. Н. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ja aber es geht doch um ein Embedded Projekt, nicht um einen Web Browser
> der alles schlucken können muss, was da kommen mag.

Das schon. Aber IMHO ist es einfach blöd, wenn der Parser sich bei 
irgendwas verspult und dann Murks macht. Auch auf in einem embedded 
Projekt. Deswegen, ja die Frage nach erprobten Lösungen. Wenn sich 
nichts findet, kann ich den Parser ja immernoch selbst schreiben.

von Pit S. (pitschu)


Lesenswert?

Dafür benutze ich gerne cJSON. Ist nur eine C-Datei und sehr simpel zu 
nutzen.

pitschu

von Rolf M. (rmagnus)


Lesenswert?

Stefan ⛄ F. schrieb:
> Mal eine ernst gemeinte Frage: Was ist daran schwer, ein Properties File
> zu parsen? Dafür braucht man doch keine Library!

Wer sagt, dass es schwer ist? Aber wozu das Rad neu erfinden, wenn's 
schon eins gibt?

von Kevin M. (arduinolover)


Lesenswert?

Warum muss man configs ASCII kodiert speichern? Das ist ja wohl die 
größte Platzverschwendung.

Bau dir nen Struct (ggf. mit Unions) der alles enthält und schieb/les 
den nach/von wo auch immer.

von M. Н. (Gast)


Lesenswert?

Kevin M. schrieb:
> Warum muss man configs ASCII kodiert speichern? Das ist ja wohl die
> größte Platzverschwendung.

Weil ich die Files gerne manuell bearbeiten können würde. Und structs 
sind einfach zu anfällig für architektur-/implementierungs-spezifische 
Fallstricke (endianess, packing, etc...)

von PittyJ (Gast)


Lesenswert?

Ich habe alles auf Json umgestellt.
Ist einfach, und struktutiert. Ich kann es beliebig erweitern, falls ein 
Attribut fehlt.
Und es gibt im Web Seiten mit Syntax-Checker, falls man sich nicht 
sicher ist.

Nie wieder eigene Ascii-Formate. Das führt nur zu Problemen, wenn es 
erweitert werden soll.

von Johannes S. (Gast)


Lesenswert?

ASCII wie das .ini Format kann man ja noch erweitern, aber es hat keine 
Baumstruktur was bei Json noch schöner ist. Beim Binärformat opfert man 
alles der Performance, was bei halbwegs modernen μC kaum noch nötig ist.
Ein schlanker Json Parser ist JSMN, https://github.com/zserge/jsmn

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Wie bringst Du den die Konfigurationsdatei auf das Target? Wenn dass 
während der Build-Zeit passiert, dann ist das Parsen der Datei zur 
Laufzeit ziemlicher Overhead, da sich die Parameter ja zur Laufzeit 
nicht ändern.

von kyrk.5 (Gast)


Lesenswert?

ECUs in Autos haben relativ viele Parameters. Das wird mit Diagnose 
(UDS) gelesen oder geschrieben (Bonus ist heute: Sichere Fahzeug 
Diagnose SFD also man muss sich das per Hersteller auch erlauben 
lassen). Meist wird das Lesen/Schreiben per DID verwendet. Ab und zu mal 
Routine Controlle (ist aber selten). Gespeichert wird das ganze in 
Eeprom. Natürlich wird hier nicht einfach gespeichert, sondern ein 
Datensatz abgelegt mit eventuell redundanz in ein Journaling System. So 
weit eigentlich einfach. Aber, damit man einfach mehrere tausend 
Parametern haben kann, gibt es natürlich ein Generator der die 
Konfiguration für die Diagnose und Eeprom generiert. Plus das ganze 
Verbindet und die Paramters richtung Applikation bereitstellt. So kann 
jemand in einer Excel Tabelle oder DOORS oder oder oder die Parameters 
erstellen, und das ganze Zeug wird dann generiert. Kann man schön unter 
dem Stichwort: AUTOSAR nachschauen

von Johannes S. (Gast)


Lesenswert?

Und das passt noch in einen Cortex-M? Werden da nicht eher -A/R 
verwendet?

Das vorher vorgeschlagene cJSON gefällt mir auch, kann schon etwas mehr 
als JSMN.

von Pandur S. (jetztnicht)


Lesenswert?

200kByte fuer ein Konfig library... uups.
Wer redet denn von ASCII Formaten? Die wuerde ich mir eh nicht antun. 
Ich wuerde mit auch generell nicht lesbare ACII Formate fuer embedded 
antun.

Allenfalls als csv. Da kommt man mit einem 20 Zeiler durch.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Joggel E. schrieb:
> 200kByte fuer ein Konfig library... uups.

Geht doch. Ein Menüsystem kostet teilweise deutlich mehr.

von Pandur S. (jetztnicht)


Lesenswert?

> Ein Menüsystem kostet teilweise deutlich mehr.

Also ich finde diese 200k schon voellig ueberzogen. Ein Menusystem soll 
groesser sein ? Das waer dann nicht mehr meine Welt.Bei mir muss alles 
viel kompakter sein. Ohne 3D Simulationen auf dem Display.

von Walter T. (nicolas)


Lesenswert?

Joggel E. schrieb:
> Ohne 3D Simulationen auf dem Display.

Eine einzelne Schriftart, 30 px hoch ("A-Höhe"), Zeichen ' ' bis 255, 
sind selbst RLE-codiert schon 8,8 kb. Ohne Sonderzeichen für 
physikalische Größen etc. Kann schon sein, dass das nicht Deine Welt 
ist. Aber Seltenheitswert hat es auch nicht mehr.

Aber der TO hat das ja auch klar als Maximalgröße benannt.

: Bearbeitet durch User
von Zeno (Gast)


Lesenswert?

PittyJ schrieb:
> Ich habe alles auf Json umgestellt.
> Ist einfach, und struktutiert. Ich kann es beliebig erweitern, falls ein
> Attribut fehlt.
> Und es gibt im Web Seiten mit Syntax-Checker, falls man sich nicht
> sicher ist.

Ja das JSON-Format ist schon nicht schlecht, weil es auch für den 
Menschen lesbar ist. Allerdings ist der Aufwand zum Lesen und Schreiben 
schon deutlich größer als z.B. bei einer einfachen Liste mit 
Wertepaaren.
Schau Dir einfach mal die JSON-Daten des Deutschen Wetterdienstes 
(https://opendata.dwd.de/weather/weather_reports/synoptic/germany/json/) 
an. Diese Files sind schon sehr komplex und da hat ein JSON-Parser auf 
dem PC schon ordentlich zu tun um Selbige zu dekodieren. Ein µC wäre an 
dieser Stelle wahrscheinlich schon überfordert. Andererseits ist ein 
Konfigurationsfile für einen µC deutlich einfacher als die von mir als 
Beispiel genannten Files.
Eine einfache Liste mit Wertepaaren Key=Value halte ich auf dem µC für 
den einfacheren Weg, die mit Mitteln die Standard C bietet auch leicht 
einzulesen und zu dekodieren ist - Stefan schrieb das ja auch schon. So 
groß werden die Listen ja auch nicht werden, da die Anzahl der Parameter 
ja eher klein und überschaubar ist.

Ich benutze dieses Format gern für Konfigurationsdateien in meinen 
PC-Programmen. Das Format entspricht ja wenn man noch Sections einführt 
dem Windows-Iniformat, wofür es in vielen Programmiersprachen bereits 
fertige Klassen zum Lesen und Schreiben gibt. Anderseits kann man unter 
Delphi die komplette Datei in eine Stringliste einlesen, welche ein 
Property Values[Key] hat so das man den Wert ganz gezielt auslesen kann.
Hat man weder eine Klasse noch dieses Listenobjekt kann man eine solche 
Datei auch einfach Zeile für Zeile einlesen und auswerten. Dafür braucht 
man definitiv keine Lib, die bringt viel zu viel Overhead mit.

von M. Н. (Gast)


Lesenswert?

Torsten R. schrieb:
> Wie bringst Du den die Konfigurationsdatei auf das Target?

SD Karte oder TFTP.

kyrk.5 schrieb:
> AUTOSAR nachschauen

Als nächstes schlägst du mir noch vor, dass ich mir zum Einspieln der 
Config eine ETAS INCA Lizenz kaufen soll ;)

Johannes S. schrieb:
> Ein schlanker Json Parser ist JSMN, https://github.com/zserge/jsmn

Das sieht schonmal recht gut aus. Das kommt auf die Liste. Vielen Dank.

Johannes S. schrieb:
> cJSON gefällt mir auch, kann schon etwas mehr
> als JSMN.

Benötigt allerdings dynamischen Speicher. Mal schauen. Ich werde mal 
evaluieren, wie viel das ist und ob es memory-leak frei ist :)

Joggel E. schrieb:
> 200kByte fuer ein Konfig library... uups.

Ich sage nicht, dass ich das auch vollkriegen will. Man muss allerdings 
beachten, dass bei einem cortex-M der Speicher schneller ansteigt, als 
bei einem AVR. Da sind allein für den Startupcode schonmal ruckzuck 
1-2kB weg.

Ich denke, ich werde mir die JSON Lösungen mal anschauen.

von Johannes S. (Gast)


Lesenswert?

Bei einer String basierten Config wird man um Dynamik nicht drumherum 
kommen wenn man die Config auf dem µC auch ändern möchte. Wenn du z.B. 
einen vorhandenen String Wert änderst und der neue ist ein paar Zeichen 
länger, dann muss man den alten Teil ja wegwerfen und einen neuen Knoten 
erzeugen und einbinden. Alles mit vordefinierten Reserven und Limits 
wäre vielleicht eine Lösung, ist aber auch Verschwendung wenn diese 
Reserven nie gebraucht werden. Wenn die Config nur gelesen und nicht 
verändert wird, dann dürfte man auch nicht in eine Dynamik reinlaufen.
Von cJSON gibt es noch eine C++ Version, die versuche ich gerade zu 
kompilieren. Leider hat der Autor da vor ein paar Tagen die sstream 
eingebaut... Aber du wolltest ja sowieso kein C++.

von sid (Gast)


Lesenswert?

Hm..
wie wäre es denn wenn Du Dir die config sparst
und sie stattdessen als ini betrachtest?

damit wären die Variablen schon im µC gesetzt und korrekt dimensioniert
und die ini file überschreibt nurnoch die default-werte wo nötig.
der parser dazu wäre nichteinmal wirklich gross;
da er unbekannte oder unzulässige werte schlicht ignorieren könnte.

bei feststehendem Code machen inis fast immer mehr Sinn mMn;
da man selten nicht definierte aber benötigte Variablen/Werte nicht 
irgendwo vordefiniert hat,
nur den Wert nicht den typ zu wechseln ist da relativ simple über inis 
zu regeln.

'sid

von Peter D. (peda)


Lesenswert?

M. H. schrieb:
> Das Format der Configdateien, die zu lesen sind, ist mir quasi egal. Es
> muss lediglich von Hand editierbar sein (ASCII Klartext) und die
> Möglichkeit bieten
> 'key = value' Paare abzubilden.

Warum muß man da gleich mit einer riesen Dampfhammer Lib draufschlagen?
Ein simples sscanf über ein Array aus String+Variablenadresse sollte 
doch reichen.
Und noch ein Zeichen als Kommentarzeile festlegen, um Parameter temporär 
zu disablen. Das Arrayende kennzeichne ich immer mit einem Leerstring, 
dann muß man nicht extra die Länge übergeben.
Die Textdatei parst man direkt beim Einlesen, man braucht also nur 
temporären RAM für eine Zeile (80 Byte, alles darüber wird 
abgeschnitten). Das Array steht im Flash, kostet also weder statischen 
RAM noch Malloc.

von Olaf (Gast)


Lesenswert?

Als ich das letzte mal sowas gebraucht habe, da habe ich mir
das in flex geschrieben und dann den erzeugten C-Code in mein
Programm eingehaengt. Das ist super weil man sich jederzeit neue
coole Schluesselwoerter einfallen lassen kann und sich dann einfach
einen neuen Parser generiert.
Vorteil ist das flex auf jedem ernst zunehmenden Betriebssystem bereits
installiert ist. Geht also einfach so.

Olaf

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

M. H. schrieb:
> Auf dem Rechner habe ich immer gerne libconfig verwendet. Das ist recht
> simpel und angenehm (https://github.com/hyperrealm/libconfig).
> Allerdings erfüllt diese Lib für mein aktuelles Programm die
> Anforderungen nicht ganz:
>
> Mein Controller hat 512 kB Flash und ist momentan zu ca 30 % voll. Grob
> geschätzt wird mein Code, wenn er fertig ist, den Controller zu 50 - 60
> auslasten. Die Library sollte somit in den verbleibenden Speicher passen
> ~200 kB.

libconfig hat bei mir für Cortex-M4 compiliert ~14kB

arm-none-eabi-size armv7e-m/lib/libconfig.a
   text    data     bss     dec     hex filename
   1896       0       0    1896     768 grammar.o (ex 
armv7e-m/lib/libconfig.a)
   3643       0       0    3643     e3b libconfig.o (ex 
armv7e-m/lib/libconfig.a)
    435       0       0     435     1b3 scanctx.o (ex 
armv7e-m/lib/libconfig.a)
   7962       0       0    7962    1f1a scanner.o (ex 
armv7e-m/lib/libconfig.a)
     78       0       0      78      4e strbuf.o (ex 
armv7e-m/lib/libconfig.a)

Bleibt das Problem mit dem dynamischen Speicher. Wenn du da aber nicht 
ständig neu einliest sondern z.B. nur einmalig beim start sehe ich da 
auch kein Problem.

Bisschen blöd ist die Lizenz (LGPL). Das verhindert bei uns den Einsatz 
auf Cortex-M.

Matthias

von Stefan F. (Gast)


Lesenswert?

Μαtthias W. schrieb:
> Bisschen blöd ist die Lizenz (LGPL). Das verhindert bei uns den Einsatz
> auf Cortex-M.

Erkläre mal, ich erkenne da keinen Zusammenhang zwischen LGPL und 
Cortex-M. Habe ich etwas verpasst?

von Rolf M. (rmagnus)


Lesenswert?

Stefan ⛄ F. schrieb:
> Μαtthias W. schrieb:
>> Bisschen blöd ist die Lizenz (LGPL). Das verhindert bei uns den Einsatz
>> auf Cortex-M.
>
> Erkläre mal, ich erkenne da keinen Zusammenhang zwischen LGPL und
> Cortex-M. Habe ich etwas verpasst?

Ist halt mitunter etwas unschön, die Hard- und Firmware so weitergeben 
zu müssen, dass der Anwender die Möglichkeit hat, die LGPL-Komponenten 
durch selbst compilerte zu ersetzen.

von Richard Z. (richard_z65)


Lesenswert?

Ich verwende in der Kombination "Microcontroller/SD-Karte" eigentlich 
immer:
https://github.com/benhoyt/inih
in Verbindung mit:
http://elm-chan.org/fsw/ff/00index_p.html

: Bearbeitet durch User
von Sonne (Gast)


Lesenswert?

Wenn die config so übermäßig kompliziert ist, dann schreib dir doch ein 
command line tool für den Rechner (ggf. mit beliebiger lib dahinter), 
das eine ASCII config einliest und in binär (unions, structs) übersetzt 
(oder binär in den Target-µC läd). Dadurch verschwendest du nicht so 
viel Platz und Zeit im µC und bist flexibel in der Wahl deiner lib.

von Peter D. (peda)


Lesenswert?

Sonne schrieb:
> Wenn die config so übermäßig kompliziert ist,

Das ist ja eben der Witz, er will nur was ganz einfaches:

M. H. schrieb:
> 'key = value' Paare abzubilden.

Ich würde dafür 10 Zeilen und 10min ansetzen. Aber er will ja unbedingt 
mit Kanonen auf Spatzen schießen.

von M. Н. (Gast)


Lesenswert?

Olaf schrieb:
> Als ich das letzte mal sowas gebraucht habe, da habe ich mir
> das in flex geschrieben und dann den erzeugten C-Code in mein
> Programm eingehaengt. Das ist super weil man sich jederzeit neue
> coole Schluesselwoerter einfallen lassen kann und sich dann einfach
> einen neuen Parser generiert.
> Vorteil ist das flex auf jedem ernst zunehmenden Betriebssystem bereits
> installiert ist. Geht also einfach so.

Daran habe ich auch schon gedacht. Allerdings benötigt (f)lex auch 
dynamischen Speicher. Flex würde ich nur verwenden, wenn ich, wie du 
sagst, eigene Schlüsselwörter etc. benötige.

Μαtthias W. schrieb:
> libconfig hat bei mir für Cortex-M4 compiliert ~14kB

Das sieht ja gar nicht mal so schlecht aus. Hat eventuell schonmal einer 
nen Leaktest mit libconfig gemacht, ob das Ganze speicher verliert?

Ich bin mittlerweile sehr vorsichtig geworden. Die letzte PC 
Applikation, die ich geschrieben habe, hatte so viele memory Leaks in 
extern verwendeten Libraries, dass ich teilweise dazu übergehen musste, 
Teile des Programms über Forking in extra Prozesse zu verlagern, um die 
Prozesse dann sauber wieder beenden zu können, damit der Speicher nicht 
vollläuft. Und auf embedded Geräten ist ein schleichend wachsender Heap 
recht schnell am Anschlag.

von W.S. (Gast)


Lesenswert?

Peter D. schrieb:
> Das ist ja eben der Witz, er will nur was ganz einfaches...

.. und dafür setzt er rund 200K an. Erstmal. Ich tippe da auf die 
bekannte Salami-Taktik: immer scheibchenweise.

Man fragt sich, was das eigentlich werden soll. Ich bin bei meinen 
Geräten bislang immer mit üblichen seriellen EEPROMs ausgekommen, da 
kriegt man eine stattliche Anzahl von Einstell-Flags, 
Kalibrierkonstanten und sonstiges Zeugs unter.

Möglicherweise ist das Ganze beim TO ein Denkfehler, nämlich daß er ein 
Menüsystem in diversen Sprachen haben will und daß er dieses genauso wie 
beim PC beim Programmstart aus einer Art Ressourcen-Datei in den RAM 
laden will. Der Denkfehler in diesem Falle ist, daß man im µC auch 
grafische Menüsystem mit Touch-Bedienung und in C geschrieben im Flash 
unterbringen kann. Sowas ist dann bereits beim Einschalten fertig 
miteinander verknüpft und das Initialisieren besteht bloß darin, daß ein 
jegliches Objekt des Menüs seine Variablen initialisiert. Texte hingegen 
macht man dann per Handle und läßt sich die Pointer auf die zugehörigen 
Strings von einer Funktion liefern, die den jeweiligen Text in der 
aktuellen Sprache liefert. Und sowas ist sehr viel platzsparender als 
200K an zu interpretierenden Konfig-Texten.

W.S.

von Walter T. (nicolas)


Lesenswert?

W.S. schrieb:
> Möglicherweise ist das Ganze beim TO ein Denkfehler, nämlich daß er ein
> Menüsystem in diversen Sprachen haben will und daß er dieses genauso wie
> beim PC beim Programmstart aus einer Art Ressourcen-Datei in den RAM
> laden will

Ich lese nichts derartiges in der Frage des TO. Eventuell ist die 
Antwort auf einen anderen Thread bezogen?

Ich lese aus der Frage lediglich: "Ich suche X, habe noch viel Flash 
(200 kb) frei, Verzicht auf malloc() wäre bevorzugt."

von Peter D. (peda)


Lesenswert?

M. H. schrieb:
> Aber IMHO ist es einfach blöd, wenn der Parser sich bei
> irgendwas verspult und dann Murks macht.

Genau das kann aber passieren, wenn man sich den maximal möglichen 
Overhead ans Bein bindet.
Eine riesen Lib kann durchaus fehlerfrei sein, aber man kann Fehler bei 
der Anwendung machen, weil man sie nicht in allen Details verstanden 
hat. Den Murks hat man dann selbst erzeugt.
Es ist gar nicht so einfach, eine Lib so zu schreiben, daß sie alle 
Anwenderfehler abfängt.
Je einfacher die Aufgabe, umso weniger lohnt sich die Einarbeitung in 
eine  unbekannte Lib. Eine Lib soll ja Entwicklungszeit sparen und nicht 
kosten.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

M. H. schrieb:
> Μαtthias W. schrieb:
>> libconfig hat bei mir für Cortex-M4 compiliert ~14kB
>
> Das sieht ja gar nicht mal so schlecht aus. Hat eventuell schonmal einer
> nen Leaktest mit libconfig gemacht, ob das Ganze speicher verliert?

Ja, libconfig läuft bei uns in unittests mit die mit valgrind (GCC) bzw. 
asan (clang) compiliert sind. Bisher keine Auffälligkeiten.

Matthias

von Funkdeppjäger (Gast)


Lesenswert?

https://github.com/compuphase/minIni

habe ich auf einem STM32F103C8 schon benutzt.

von M. Н. (Gast)


Lesenswert?

W.S. schrieb:
> .. und dafür setzt er rund 200K an. Erstmal. Ich tippe da auf die
> bekannte Salami-Taktik: immer scheibchenweise.

Ich finde das um ehrlich zu sein mittlerweile eine Frechheit hier: In 
allen Threads wird sich beschwert, dass der TO nicht mit den 
Infrormationen rausrückt. Ich habe hier gedacht: "Schreib halt hin wie 
viel du Platz hast, bevor einer erst fragen muss, wie viel Flash dafür 
da ist". Ich setze dafür keinesfalls 200k an. Das ist eben das, was ich 
noch zur Verfügung habe.

W.S. schrieb:
> Möglicherweise ist das Ganze beim TO ein Denkfehler, nämlich daß er ein
> Menüsystem in diversen Sprachen haben will und daß er dieses genauso wie
> beim PC beim Programmstart aus einer Art Ressourcen-Datei in den RAM
> laden will. Der Denkfehler in diesem Falle ist, daß man im µC auch
> grafische Menüsystem mit Touch-Bedienung und in C geschrieben im Flash
> unterbringen kann. Sowas ist dann bereits beim Einschalten fertig
> miteinander verknüpft und das Initialisieren besteht bloß darin, daß ein
> jegliches Objekt des Menüs seine Variablen initialisiert. Texte hingegen
> macht man dann per Handle und läßt sich die Pointer auf die zugehörigen
> Strings von einer Funktion liefern, die den jeweiligen Text in der
> aktuellen Sprache liefert. Und sowas ist sehr viel platzsparender als
> 200K an zu interpretierenden Konfig-Texten.

Ähm... nein. Und falls es dich interssiert: Das Menusystem ist recht 
schlank, da 4x16 Character LCD ohne groß verschachtelte Menüs.

W.S. schrieb:
> Man fragt sich, was das eigentlich werden soll. Ich bin bei meinen
> Geräten bislang immer mit üblichen seriellen EEPROMs ausgekommen, da
> kriegt man eine stattliche Anzahl von Einstell-Flags,
> Kalibrierkonstanten und sonstiges Zeugs unter.

Das habe ich leider beim Platinendesign verpeilt. Und der STM hat leider 
kein internes EEPROM. Und die Flashpage möchte ich nicht dafür 
freihalten. Das ist einfach bissle doof gelaufen. Deswegen kommen die 
Parameter auf die SD Karte.
Was es wird: Es lädt Regelparameter für einige Regler. Insgesamt so ca. 
56 Parameter + Eine Lookup Tabelle mit grob 1k Größe. ISt aber für diese 
Diskussion irrelevant.

Μαtthias W. schrieb:
> Ja, libconfig läuft bei uns in unittests mit die mit valgrind (GCC) bzw.
> asan (clang) compiliert sind. Bisher keine Auffälligkeiten.

Sehr schön. Vielen Dank für die Info.

Prinzipiell habe ich hioer im Forum nachgefragt, da ich nicht davon 
ausgehe immer alles besser coden zu können als andere und vielleicht 
hätte es ja "den Standard" für sowas gegeben. Alles in allem sind aber 
doch ein paar interessante Links rausgesprungen. Am Wochenende komme ich 
je nach Wetterlage dazu, weiterzubasteln.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

@bambel:
W.S. ist hier einer der übleren Schwätzer der so tut als wär er der 
Größte aber dan Code mit Magic Numbers, sinnlosen Dopplungen und gotos 
verzapft.
Was "const" in C ist weis er auch nicht.
Reinstes Comedygold zum lesen:
Beitrag "Re: C: Konstante weak definieren"

von nurmal so (Gast)


Lesenswert?

M. H. schrieb:
> Und der STM hat leider
> kein internes EEPROM. Und die Flashpage möchte ich nicht dafür
> freihalten. Das ist einfach bissle doof gelaufen.

Da du ja eh so viel Flash übrig hast, warum nicht den benutzen, schau 
dir mal die EEPROM-emulation Beispiele von ST an. Da kannst du (wenn es 
nicht super Zeitkritik ist) ganz einfach key (16 bit) value (16bit) 
Paare ablegen. muss halt 2 Flashpages für spendieren.

Das hat aber erst mal nichts mit einer Config Datei zu tun

von W.S. (Gast)


Lesenswert?

M. H. schrieb:
> Das habe ich leider beim Platinendesign verpeilt. Und der STM hat leider
> kein internes EEPROM. Und die Flashpage möchte ich nicht dafür
> freihalten. Das ist einfach bissle doof gelaufen. Deswegen kommen die
> Parameter auf die SD Karte.
> Was es wird: Es lädt Regelparameter für einige Regler. Insgesamt so ca.
> 56 Parameter + Eine Lookup Tabelle mit grob 1k Größe. ISt aber für diese
> Diskussion irrelevant.

Bist du dir sicher, daß du SO ETWAS tatsächlich tun willst? Ich nehme 
mal an, daß deine 'einige' Regler irgend etwas Wichtiges regeln. Und da 
willst du deren Parameter auf einer SD speichern? Mir wäre das viel zu 
unsicher, die Parameter würde ich auf alle Fälle mit in die Firmware 
integrieren - oder jedenfalls deren Default-Werte, die aber regelseitig 
auf der sicheren Seite liegen müssen.

W.S.

von Christopher J. (christopher_j23)


Lesenswert?

Peter D. schrieb:
> Je einfacher die Aufgabe, umso weniger lohnt sich die Einarbeitung in
> eine  unbekannte Lib. Eine Lib soll ja Entwicklungszeit sparen und nicht
> kosten.

Prinzipiell gebe ich dir da recht aber ich finde gerade die hier 
genannte Library doch sehr schlank und bis auf die #ifdef-Orgien (die 
der Wahl zwischen Stack und Heap geschuldet sind) auch durchaus elegant 
geschrieben.

Richard Z. schrieb:
> Ich verwende in der Kombination "Microcontroller/SD-Karte" eigentlich
> immer:
> https://github.com/benhoyt/inih

von Strubi (Gast)


Lesenswert?

Warum nicht das gute alte INI-Format?

https://gitlab.com/hackfin/netpp/-/blob/opensource_release/src/conffile.c

Die malloc-Zeile ist nur fuer den Test, der Rest ausschliesslich 
statisch.
Hintendran spult die spiffs-Library fuer die Speicherung in EEPROMs.

von M. Н. (Gast)


Lesenswert?

W.S. schrieb:
> Bist du dir sicher, daß du SO ETWAS tatsächlich tun willst? Ich nehme
> mal an, daß deine 'einige' Regler irgend etwas Wichtiges regeln. Und da
> willst du deren Parameter auf einer SD speichern?

Ja ich bin mir sicher! Per default macht das Gerät gar nichts, da es 
keine universal gültigen Regelparameter gibt. Diese müssen über eine 
UART Shell und einige Abgleichalgorithmen erst für jedes System gefunden 
werden. Sind diese gefunden, werden sie auf SD-Karte gespeichert und von 
dort auch beim Neustart wieder geladen. In der nächsten Version (falls 
sie jemals kommt) kommt dann entweder ein SPI EEPROM dran, oder der STM 
bekommt eine Backupbaterie für den Backupram.

von Christopher J. (christopher_j23)


Lesenswert?

M. H. schrieb:
> In der nächsten Version (falls sie jemals kommt) kommt dann entweder ein
> SPI EEPROM dran, oder der STM bekommt eine Backupbaterie für den
> Backupram.

Ich würde die Idee mit dem emulierten EEPROM durch den Flash nicht so 
schnell verwerfen. Das ist ja schließlich kein NAND-, sondern NOR-Flash 
und wenn ich mich recht erinnere garantiert ST 10k Schreibzyklen 
innerhalb des erlaubten Temperaturbereichs, was dann bei 
Zimmertemperatur nochmal deutlich mehr sein dürfte. Eine SD-Karte ist 
zwar günstig in der Beschaffung und bietet massig Speicher aber für die 
paar Parameter würde ich mir die Abhängigkeit von der SD-Karte glaube 
eher nicht ans Bein binden.

von M. Н. (Gast)


Lesenswert?

Christopher J. schrieb:
> Ich würde die Idee mit dem emulierten EEPROM durch den Flash nicht so
> schnell verwerfen. Das ist ja schließlich kein NAND-, sondern NOR-Flash

Darum geht es mir gar nicht. Mir geht es darum, dass der Flash nicht wie 
ein EEPROM geschrieben werden kann, sondern nur Pageweise gelöscht 
werden kann. Und die Pagegrößen des STMs sind eher unpraktisch dafür. 
Vorallem die hinteren Pages, die ich dafür gern verwendet hätte, sind 
128kB groß. Und das ist mir einfach zu viel Speicher, den ich Freihalten 
müsste.

von nurmal so (Gast)


Lesenswert?

Um was für ein STM32F handelt es sich denn, ich kenne keinen mit so 
großen Pages (eigentlich nur 1k oder 2k), und ob die Konfigdaten vorne 
oder hinten liegen spielt doch gar keine Rolle.
Die EEPROM Emulation ist imho wirklich gut ausgeklügelt, und fängt auch 
reset währen des Schreibprozesses usw ab. und du kannst einfach 
Paarweise Key:Value schreiben und auslesen, also wirklich einfach zu 
verwenden.

Wenn ich es richtig verstehe willst du aber nur einmalig Konfig Daten 
schreiben, da kannst du dir das auch ganz sparen und einfach so in den 
Flash schreiben, das muss nicht pageweise passieren, nur eine Änderung 
bedingt das die Page zuvor komplett gelöscht werden muss.

von Mike R. (thesealion)


Lesenswert?

nurmal so schrieb:
> Um was für ein STM32F handelt es sich denn, ich kenne keinen mit so
> großen Pages (eigentlich nur 1k oder 2k), und ob die Konfigdaten vorne
> oder hinten liegen spielt doch gar keine Rolle.

Die "hinteren" Sektoren der STM32F4 haben laut Reference Manual immer 
128k.
Aber normalerweise sollte man die App ja ohne Probleme weiter nach 
hinten schieben und dann die Pages 1 und 2 die jeweils 16k haben für die 
Daten verwenden können.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Da Pagegröße hängt stark von der Serie ab.
L4 haben schöne 2k Pages (auch da gibts sicher Ausnahmen die ich nicht 
gesehen habe).
Bei den F4 sind die Pagegrößen wild verteilt von ein paar k bis 128k 
hoch, das ist für eine EEPROM Simu im Flash natürlich etwas blöd.
Die kleinen L0 haben sogar nur 256?Byte große Pages.

Ansonsten gibts von ST selber ne Appnote zu dem Thema:
https://www.st.com/resource/en/application_note/dm00311483-eeprom-emulation-techniques-and-software-for-stm32-microcontrollers-stmicroelectronics.pdf

Mit dieser Appnote habe ich eine "Tag Length Value" Configspeicherung im 
Flash gebaut für L4 inkl. "RAID1" falls beim schreiben/page löschen mal 
der Strom verschwindet und somit die Config nicht inkonsistent wird.

von A. S. (Gast)


Lesenswert?

Mw E. schrieb:
> Bei den F4 sind die Pagegrößen wild verteilt von ein paar k bis 128k
> hoch, das ist für eine EEPROM Simu im Flash natürlich etwas blöd

Als flashes noch extern waren, und 64k eine Page, da würde viel Aufwand 
getrieben um eine Page in 16, 8, 8 und 32 zu teilen:
Einem loader/bootet in den 16k und dann 2 8k-Bereiche, um Bootinfos 
schreiben zu können. Z.b. jeweils 1k Felder mit den Segmenten, Version, 
Checksumme etc. Beim nächsten Booten altes Feld ungültig und nächste 1k 
beschreiben. War ein Block voll, den anderen nehmen und den einen 
löschen.

Und weil es genau dafür gemacht wurde, könnte man z.b.  den 16k Block 
schreibschützen und die 8ks offen lassen.

Und weil der Resetvektor manchmal ganz oben, manchmal unten war, gab es 
2 sonst identische Typen.

Will sagen, wild verteilt ist eher unwahrscheinlich....

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Es ist immer gut dazu zu lernen.
Bei den ext. (Q)SPI NOR Flashes die ich so kenne gibts 4k Pages.
Aber auch löschbare Blöcke, die dann 32k/64k haben und dann mehrere der 
4k Pages entahlten.
Daher sieht das beim F4 erstmal wild aus und beim L4 ist es eben schöner 
gelöst.

von DSGV-Violator (Gast)


Lesenswert?

>> Mal eine ernst gemeinte Frage: Was ist daran schwer, ein Properties File
>> zu parsen? Dafür braucht man doch keine Library!
>
> Wer sagt, dass es schwer ist? Aber wozu das Rad neu erfinden, wenn's
> schon eins gibt?

Dann kann man auch fragen:
"Warum noch arbeiten, wenn andere schon gearbeitet haben ..." ;-)

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.