Forum: Mikrocontroller und Digitale Elektronik Embedded C general purpose Bilbliothek


von Aaron K. (aaron_b_k)


Lesenswert?

Ich suche seit längerem eine general purpose Bibliothek für embedded c 
Umgebungen. Also eine Bibliothek welche Sortieralgorithmen, abstrakte 
Datenstrukturen (wie z.B. hash tables, linked list, queues, ringbuffer, 
etc.), crc-Berechnungen, usw. enthält.

Dabei sollte sie vermeiden dynamisch Speicher zu allokieren, da wie 
gesagt in einem embedded Bereich.

Bisher habe ich lediglich glib gefunden. Da ist aber das Problem des 
dyanmisch allokierten Speichers und das die Zielgruppe hier eher auf dem 
PC programmiert.

Wie macht ihr das? Implementiert ihr eure eigenen Algorithmen, suche ihr 
euch auf bspw. auf github vertrauesnwürdige Snippets oder kennt ihr eine 
Bibliothek?

von Patrick C. (pcrom)


Lesenswert?

Die libraries nehme ich von Fabrikanten (infinion; meistens 
hardware-ansteuerung) und die standard-C-libraries. Oder schreibe ich 
selber (basiert auf beispielen) damit ich genau weiss was das an 
resources benutze und weil ich es dann besser anpassen kann.

Auch sind grossere datenmengen oft nicht im internen processor aber auf 
SD karte damit die libraries schon schnell hardware-gebunden werden. Die 
Residenz von daten lass ich dann soviel moeglich im library damit ich, 
wenn die Residenz sich aendert, nur die library aendere.

Patrick aus die Niederlaende

von Joe J. (j_955)


Lesenswert?

Aaron K. schrieb:
> Wie macht ihr das? Implementiert ihr eure eigenen Algorithmen, suche ihr
> euch auf bspw. auf github vertrauesnwürdige Snippets oder kennt ihr eine
> Bibliothek?

Hallo Aaron,

ich habe mir über die Zeit von allen Seiten her Bibliotheken 
zusammengezogen.  Vieles aus dem Netz, vieles von den Projekten die ich 
im Laufe der Zeit bearbeitet habe. Du brauchst ein modernes 
Konfigurationssystem, wie zb CMAKE. Dann kannst du dir dein eigenes 
Archiv aufbauen und nach Bedarf die Bibliotheken verknüpfen, je nach 
Projekt.

Da gibt es dann eine lib algorithm, pathwalker,crclib, stringlib und, 
und, und. Mit der Zeit kommt dann einiges zusammen. Du brauchst eine 
Vorstellung davon wo du die libs parken kannst und ob die öffentlich 
einsehbar sein dürfen. Ich hoste privat mein Zeug über Gitlab auf meinem 
eigenen Server, so hat auch nicht unbedingt hinz und kunz Zugriff 
darauf.  Und wenn ich dann im beruflichen Umfeld Probleme lösen muss, 
scheue ich es nicht, diese auch mal beim AG liegen zu lassen.

Du hast gut erkannt, das du bei oft wiederkehrenden Problemen nicht 
ständig das Rad neu erfinden musst. Und hinter einer crclib ist 
sicherlich auch kein Geschäftsgeheimnis, ist aber eine Grauzone.

Was spricht eig. gegen dynamische Speicherallokation? Die nutze ich 
zuhauf in meinen Projekten. Wenns gut gemacht ist, y not?
JoJo

: Bearbeitet durch User
von Aaron K. (aaron_b_k)


Lesenswert?

Joe J. schrieb:
> Was spricht eig. gegen dynamische Speicherallokation? Die nutze ich
> zuhauf in meinen Projekten. Wenns gut gemacht ist, y not?

Erst mal danke für die Antwort. Ich meine herauszulesen, dass auch dir 
keine allgemeien Bibliothek für c bekannt ist und du dich an 
öffentlichem Code inspirierst und dir die snippets für später 
abspeicherst.

Zu deiner Frage bezüglich dynamischer Speicherallokation:

Ich habe mich intensiv damit beschäftigt ob dyamische Datenstrukturen 
eine gute oder schelchte Idee im embedded Bereich sind und bin zu dem 
Entschluss gekommen, dass es mit modernen µC (mit viel Speicher) kaum 
ein Problem ist. Da oftmals ausreichend Speicher vorhanden ist, dass 
malloc() fehlschlägt. Falls es jedoch fehlschlägt, gibt es oft keine 
Möglichkeit diesen Error zu lösen und das System stürzt ab.

Da ich jetzt nicht mit Satelitten oder ähnlich schwierig zu erreichenden 
Geräten zu tun habe, wäre ein Memory-Leck auch kein Beinbruch. Jedoch 
unter Umständen sehr teuer, da wir bisher keine bootloader verwenden.

Dazu kommt noch die fragmentierung. Entweder man verwendet einen 
custom-Allocator, der den Speicher defragmentiert, oder man hat früher 
oder später eine fehlallocation.

Alles in allem kann man dynamische Speicherallokation schon verwenden, 
vor Allem wenn ein bootloader mit an Bord ist, jedoch ist es oftmals 
leicht möglich die maximale Auslatung von Datenstrukturen abzuschätzen 
und demenstrpechend den Speicher statisch zu allokieren.

Hoffe ich habe deine Frage beantwortet

von Joe J. (j_955)


Lesenswert?

Aaron K. schrieb:
> Erst mal danke für die Antwort. Ich meine herauszulesen, dass auch dir
> keine allgemeien Bibliothek für c bekannt ist und du dich an
> öffentlichem Code inspirierst und dir die snippets für später
> abspeicherst.

Mehr als ein Snippet. Eine vollständige Bibliothek für ein spezifisches 
Problem, die sich dann statisch ins Projekt linken lässt.
Unbedingt auch Lizenvorgaben beachten, nicht das jemand gegen mich wegen 
diesem Post irgenwann rechtlich vorgeht,wegen falscher Beratung;-=)

Aaron K. schrieb:
> Da ich jetzt nicht mit Satelitten oder ähnlich schwierig zu erreichenden
> Geräten zu tun habe, wäre ein Memory-Leck auch kein Beinbruch. Jedoch
> unter Umständen sehr teuer, da wir bisher keine bootloader verwenden.

Da offtopic, kannst das ja so stehen lassen.
Grüße Jo

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Joe J. schrieb:
> Was spricht eig. gegen dynamische Speicherallokation? Die nutze ich
> zuhauf in meinen Projekten. Wenns gut gemacht ist, y not?
> JoJo

Es spricht z.B. dagegen dass du einen relativ kleinen Speicher hast und 
du sicherstellen musst dass dieser IN JEDEM FALL ausreicht. Das ist mit 
dynamischem Speicher ungleich schwieriger.

Was machst du wenn dein malloc einmal fehl schlägt? Wenn du Glück hast, 
kannst du eine Fehlermeldung auf einem LCD Display anzeigen. Und dann? 
Für den Nutzer ist das Gerät kaputt. Es gibt keine gute Möglichkeit 
solche Fehler auf einem Embedded System zu behandeln. Oft hat man gar 
keine UI und das Gerät stoppt einfach und ist dann eben auch für den 
Nutzer defekt.
Auf einem PC ist das was anderes, da poppt halt ein Fenster auf, der 
Anwender schließt ein paar Anwendungen und versucht es nochmal.

Und auf kleinen Controllern gibt es nur einen Fall in dem dynamischer 
Speicher notwendig ist: Wenn du eine große Anzahl von Objekten mit stark 
unterschiedlicher Größe im Speicher halten musst, und erst zur Laufzeit 
weißt, wie viele von welcher Sorte es werden sollen.

Wenn sich diese Objekte größenmäßig stark unterscheiden, ist auch eine 
union nicht mehr praktisch, weil es bei statischem Speicher die max. 
Anzahl der kleineren Objekte auf die max. Anzahl der größeren Objekte 
beschränkt.

: Bearbeitet durch User
von Joe J. (j_955)


Lesenswert?

Cyblord -. schrieb:
> Es gibt keine gute Möglichkeit
> solche Fehler auf einem Embedded System zu behandeln. Oft hat man gar
> keine UI und das Gerät stoppt einfach und ist dann eben auch für den
> Nutzer defekt.

Embedded Systeme sind vielfältig, daher stimmt diese deiner Meinung nach 
allgemeingültige Aussage einfach nicht. Mir fallen da schon Lösungen 
ein, für den einen oder anderen Fall aber mag das gelten was du da 
schreibst.
Jojo

von Cyblord -. (cyblord)


Lesenswert?

Joe J. schrieb:

> Embedded Systeme sind vielfältig, daher stimmt diese deiner Meinung nach
> allgemeingültige Aussage einfach nicht.

Dann sagen wir so: In den meisten Fällen ist das so wie von mir 
beschrieben.

von Aaron K. (aaron_b_k)


Lesenswert?

Joe J. schrieb:
> Mir fallen da schon Lösungen

Aus interesse, wie sähe eine solche Lösung aus? :)

von Aaron K. (aaron_b_k)


Lesenswert?

Und dann bitte nochmal zurück zum Topic. Gehe ich richtig in der 
Annahmen, dass das typische Vorgehen für code-snippets wie bspw. ein 
Sorting-Algo oder Datenstrukturen wie linked-lists ist, dass man bspw. 
github danach dursucht, sich an dem code inspiriert oder ihn sogar 
übernimmt (wenn erlaubt)?

Also:

1. Recherche
2. Implementierung

Oder gibt es auch iwo. eine Datenbank oder wo hochwertige 
Implementierungen von Algorithmen hinterlegt sind? Wenn ja welche?

Gruß

von Purzel H. (hacky)


Lesenswert?

Ich verwende ausschliesslich meine eigenen Libraries. Und ja, kein 
dynamischer Speicher,

von Joe J. (j_955)


Lesenswert?

Aaron K. schrieb:
> Oder gibt es auch iwo. eine Datenbank oder wo hochwertige
> Implementierungen von Algorithmen hinterlegt sind? Wenn ja welche?

Naja für spezifische Probleme kannst du Bibliotheken auch einkaufen. Die 
haben sicherlich aucht tlw eine bessere Qualität wie OS Zeug oder 
schlichtweg überhaupt eine Lösung(weg von not-invented-here). Ist immer 
ein Mix und die Frage ist, was du suchst udn wie die Prioritäten 
sind(Projektvorgaben zb). Hersteller Libs wurde ja bereits genannt - und 
sind tlw. nicht nur auf einen Hersteller begrenzt anwendbar.

: Bearbeitet durch User
von Joe J. (j_955)


Lesenswert?

Aaron K. schrieb:
> Oder gibt es auch iwo. eine Datenbank oder wo hochwertige
> Implementierungen von Algorithmen hinterlegt sind? Wenn ja welche?

Für bestimmte Probleme ist sicherlich Recherche unerlässlich. Geübter 
Umgang mit Suchmaschinen - wieso habe ich das eig. noch nie in einer 
Stellenausschreibung gesehen? Imho Skills die eig. zwingend erforderlich 
sind für einen guten Ingenieur.

Beispiel TLS:
https://en.wikipedia.org/wiki/Comparison_of_TLS_implementations

von Purzel H. (hacky)


Lesenswert?

> Geübter Umgang mit Suchmaschinen - wieso habe ich das eig. noch nie in einer 
Stellenausschreibung gesehen?

Wie misst man das ?

Eine Library einkaufen. Dazu muesste das Designziel bekannt sein. 
Moeglichst schnell, moeglichst kompakt, moeglichst unversell, kompatibel 
bis in die Steinzeit ...

Bei TLS, genannt oben, macht das wahrscheinlich schon Sinn, bei 
Matritzen diagonalisieren vielleicht auch, oder eben auch nicht.

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


Lesenswert?

Aaron K. schrieb:
> Ich suche seit längerem eine general purpose Bibliothek für embedded c
> Umgebungen. Also eine Bibliothek welche Sortieralgorithmen, abstrakte
> Datenstrukturen (wie z.B. hash tables, linked list, queues, ringbuffer,
> etc.), crc-Berechnungen, usw. enthält.

Hast Du Dir mal angeguckt, was die C++ Standard-Bibliothek so zu bieten 
hat? In C++ ist es auch etwas einfacher, Datenstrukturen zu 
implementieren, die sich dann über den zu haltenden Typen und z.B. 
Maximal-Länge parametrisieren lassen. Für hash tables, möchtest Du 
wahrscheinlich auch die Hash-Funktion vorgeben können.

von Bruno V. (bruno_v)


Lesenswert?

Aaron K. schrieb:
> Oder gibt es auch iwo. eine Datenbank oder wo hochwertige
> Implementierungen von Algorithmen hinterlegt sind?

Das Problem ist in der Regel, dass es irgendwie doch nicht passt. Von 
16/32-Bit Unter (und nein, das ist nicht egal) angefangen über Alignment 
hin zu Performance vom 8 bitter 1MHz bis zum PPC@1GHz.

Allein von sprintf hat jeder 100 Version und trotzdem schreiben sich die 
meisten eine Byte to AsciiHex immer wieder selber.

Binary search hat jeder embedded C-compiler dabei. Trotzdem nutzt das am 
Ende kaum jemand um eigenen Code

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Naja, die Anforderungen an eine Lib sind doch stark unterschiedlich.
Der eine will die perfekte Lib mit 1000 Bells & Whistless, nicht unter 
1MB je Funktion. Der andere will sie möglichst einfach und 
übersichtlich, daß sie auch auf einem ATtiny85 läuft.
Eine Lib, die es jedem recht macht, wird es nie geben.

von Klaus H. (klummel69)


Lesenswert?

Wenn Du tatsächlich viele komplexere Datenstrukturen hast, würde ich 
wirklich Richtung C++ statt reinem C gehen. Die Fülle an Libraries ist 
im Raum C/C++ einfach größer.

Ich nutze oft die C++ Template Klassen. Falls in embedded Systemen kein 
dynamischer Speicher genutzt werden soll, gibt es inzwischen auch einige 
kompatible Libraries mit statischen Klassen, z.B. 
https://www.etlcpp.com/

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.