Forum: Mikrocontroller und Digitale Elektronik C Bibliotheken in C++ Projekt


von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin Zusammen,

Ich baue gerade ein größeres Projekt für das STM32F4 Discovery.
Da der F4 massig Speicher hat, dacht ich mir probier ichs mal mit C++ im
embedded Bereich.

Nun zu meiner Frage, wie macht ihr das mit den C Librarys? Also ich 
benutze die StandardLib von ST so wie die USB-OTG und die HOST Lib von 
ST dazu noch FreeRTOS und HelixMP3... Das sind alles Libs die in C 
geschrieben sind, für FreeRTOS gibts die FreeRTOS Extension Class die 
lediglich als Wrapper dient.

Wenn ich jetzt über meinen Code schaue sieht der aus wie mein C-Code ich 
benutze die C Funktionen direkt, und mache Cpp Code nur für meinen 
Display Treiber den ich mit eine Virtuellen Klasse etwas generisch 
geschrieben habe.

Wie macht ihr das mit C-Lib im C++ Code? schreibt ihr Wrapper, nutzt ihr 
die einfach so und macht euren eigenden Code in C++?

Ich hatte mir eigendlich mehr von der Nutzung von C++ versprochen,
aber da ich noch nicht viel Erfahrung mit C++ habe mag das auch an 
meinem beschränkten Kenntnissen liegen oder daran das ich noch recht 
nahe ander Hardware Programmiere und die ganzen Userinterface 
Geschichten noch nicht geschrieben habe, vllt lohnt es sich ja da.

MfG

Tec

von Karl H. (kbuchegg)


Lesenswert?

Tec Nologic schrieb:

> Wie macht ihr das mit C-Lib im C++ Code? schreibt ihr Wrapper, nutzt ihr
> die einfach so und macht euren eigenden Code in C++?

Erst mal weiterbenutzen.
Im Laufe der Zeit stellt sich dann schon raus, welche Komponenten von 
einem darübergelegten Klassenaufbau profitieren würden.

> Ich hatte mir eigendlich mehr von der Nutzung von C++ versprochen,

Du benutzt ja offenbar noch gar keine OOP. Von daher ist es nicht weiter 
verwunderlich, dass dein C++ momentan noch wie C (mit Klassen) aussieht.

> nahe ander Hardware Programmiere und die ganzen Userinterface
> Geschichten noch nicht geschrieben habe, vllt lohnt es sich ja da.

Kommt schon noch.
Wenn du erst mal den Dreh raus hast, wie du Vererbung und Polymorphie zu 
deinem Nutzen einsetzen kannst, ändert sich die Sachlage.

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin Karl Heinz,

Danke für deine Antwort.

Naja bei dem Displaytreiber klappte das schon ganz gut, das war mein 
erster Versuch, Polymorphie zu nutzen, aber das ist das einzige in 
meinen 200K Code der rest ist wie du sagst C mit Klassen. Aber ich werd 
da mal am Ball bleiben.

Was ich mich noch frage hat das Linken von C Code gegen C++ Code 
auswirkungen auf die Codesize? Mir kommt mein Code doch recht großvor. 
Klar ich hab n paar riesen Libs drin. Aber wenn ich meinen Code mit dem 
STM32F4 Beispiel AudioPlay and Record aus dem Discovery Package 
vergleiche, spiele ich MP3 vom Stick und die wave, ich hab also FreeRTOS 
+ EC + Helix mehr drin und das Beispiel hat 34k mit O0 und mein Code 
>200k Code das wundert mich dann doch. Vllt mache ich ja was falsch.

RTTI und Exceptions sind aus, Alle Objekte sind global angelegt, damit 
die nicht auf dem Heap liegen.


MfG

Tec

von Peter II (Gast)


Lesenswert?

Tec Nologic schrieb:
> Alle Objekte sind global angelegt, damit
> die nicht auf dem Heap liegen.

und warum? Wenn sie auch global gebraucht werden ist ja gut. Wenn es 
aber nur objekte sind die in einer funktion notwendig sind dann macht 
das wenig sinn.


hast du Templates verwendet, diese erzeugen nicht viel code?

Es gibt eigentlich eine auswirkungen wenn man C funktionen aus c++ 
aufruft. Das sollte sie nicht auf die codegröße auswirken.

von Karl H. (kbuchegg)


Lesenswert?

Tec Nologic schrieb:

> Was ich mich noch frage hat das Linken von C Code gegen C++ Code
> auswirkungen auf die Codesize?

Normalerweise nicht.

Aber probiers aus:

Mache ein leeres C

int main()
{
}

compiliere und linke es.
dann dasselbe mit dem C++ Compiler.

Die Exe-Size sollte in etwa die gleiche sein. Es kann natürlich sein, 
dass die Runtime-Lib deines C++ ein wenig größer ist, aber das ist 
normalerweise eine Konstante. D.h. dein EXE ist ganz einfach um, 
hausnummer, 10k größer. Aber diese 10k verändern sich nicht.

Damit hast du die Basiszahlen. Und dann veränderst du dieses 
Minimalprogramm in die Richtung in die dein Verdacht fällt, dass du 
unbemerkt Code dazukriegst.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Exe-Size

Target x86 win32 ?

von Karl H. (kbuchegg)


Lesenswert?

Kan asta schrieb:
> Karl Heinz Buchegger schrieb:
>> Exe-Size
>
> Target x86 win32 ?

:-)
Old habit

Manchmal achte ich nicht drauf und bezeichne das ausführbare Programm 
als 'das EXE' auch wenn es nicht für die PC-Microsoft-Schiene gedacht 
ist.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Karl Heinz Buchegger schrieb:
> und bezeichne das ausführbare Programm
> als 'das EXE'


Na du bist mir ja einer. Dann nenn es wenigstens "die Exe(-Datei)".

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

Wegen der Codesize hatte ich vor das Projekt testweise auf c zu 
portieren.
Das wollte ich aber erst machen wenn das jetzige einen vernünftigen 
Stand hat.

Templates habe ich bisher nicht genutzt weil ich nicht viele gleiche 
Strukturen habe. Wie ich bereits geschrieben habe bin ich noch dabei die 
ganze benötigte Hardware mit einer "Highlevel" Api auszustatten.

Wenn wer interesse hat der Code ist hier zu finden.
http://code.google.com/p/thundercyer-the-alarm-clock/

ich bin für jeden Tip und Hinweis dankbar

MfG

Tec

von Karl H. (kbuchegg)


Lesenswert?

Tec Nologic schrieb:

> Wenn wer interesse hat der Code ist hier zu finden.
> http://code.google.com/p/thundercyer-the-alarm-clock/


114MB in einem Zip-File(!)

Was habt ihr denn da alles drinnen?

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

Da müsste das GitRepository mit drin gepackt sein :)
Außer dem lege ich immer alle Libs mit im Projekt ab.
Das Zip was da drin steht ist leider aber schon alt.
nichts desto trotz kannst du einen Endruck bekommen.
Das Projekt ist Eclipse mit Arm Plugin und Yagarto als Toolchain


Am einfachsten geht das wenn du Mit Eclipse und EGit dir den Code 
ziehst, falls du die Möglichkeit dazu hast. Oder mal unter Source/Browse 
gucken.

MfG

Tec

von Udo S. (urschmitt)


Lesenswert?

Kan asta schrieb:
> Na du bist mir ja einer. Dann nenn es wenigstens "die Exe(-Datei)".

Na du bist mir ja einer (ein Erbsenzähler) EXE steht für executable, 
meines Wissens hat Microsoft auf den Begriff kein Patent oder 
Gebrauchsmuster.

von Roland H. (batchman)


Lesenswert?

Tec Nologic schrieb:
> Mir kommt mein Code doch recht großvor.
> Klar ich hab n paar riesen Libs drin. Aber wenn ich meinen Code mit dem
> STM32F4 Beispiel AudioPlay and Record aus dem Discovery Package
> vergleiche, spiele ich MP3 vom Stick und die wave, ich hab also FreeRTOS
> + EC + Helix mehr drin und das Beispiel hat 34k mit O0 und mein Code
>>200k Code das wundert mich dann doch.

Wie wird gelinkt? Mit "archives" oder zumindest mit gc-sections ?

Tec Nologic schrieb:
> Wegen der Codesize hatte ich vor das Projekt testweise auf c zu
> portieren.

Zu 99% wird sich an der Code-Größe nicht viel ändern.

Tec Nologic schrieb:
> Das Zip was da drin steht ist leider aber schon alt.

Toll. Und die neuen Versionen sind geheim.

> 114MB in einem Zip-File(!)

Ist da ein Makefile drin?

von Peter II (Gast)


Lesenswert?

Roland H. schrieb:
>> 114MB in einem Zip-File(!)
>
> Ist da ein Makefile drin?

nein, aber dafür viele debug binarys

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

Das ArmPlugin generiert die Makefiles alle selber. die müssten im 
DebugOrdner liegen. Die Version im Repo ist sehr aktuell, ich werde 
heute abend mal die aktuelle Version hochladen auch als Zip, die spielt 
dann MP3 hoffendlich fehlerfrei.

Edit: ich bringe zumindest die Zip mal auf den neuesten Stand.

mit Eclipse und EGit einfach über File->Import und dann Import Git 
Projekt

da den Ordner als Local Repository wählen.

Edit2: leider geht das von hier doch nicht, ich mache das wenn ich heute 
Abend zu Hause bin.

MfG

Tec

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

So hab mal n neues Zip gemacht, MP3 läuft, aber wie ich gesehen habe 
machen das hier auch noch andere :) siehe hier:
Beitrag "STM32F4 Discovery MP3 Player - komplett mit Code"

Mir gehts aber eher um C++ als um das Mp3 effizient abspielen.

MfG

Tec

von Roland H. (batchman)


Lesenswert?

Tec Nologic schrieb:
> So hab mal n neues Zip gemacht

Da fehlt immer noch das "Top level" Makefile ;-)

Ich kann's deshalb nicht wirklich prüfen, zumindest in dem 
Debug/Makefile finden sich Spuren von gc-sections beim Linken. Ob 
allerdings die Sourcen auch dafür kompiliert werden? Im map-File scheibt 
er auch etwas von "discarded input sections". Das scheint also zu 
passen.

Wo ist denn nun eigentlich das Problem?

Mach doch einfach mal ein Listing mit nm für alle Funktionen, sortiert 
nach Größe.

von Alex E. (tecnologic) Benutzerseite


Angehängte Dateien:

Lesenswert?

Moin Roland,

Das Problem an sich war lediglich die Frage wie ich mit C Libs in einem 
Cpp Projekt ambesten verfahre. Speziell Callbackfunktionen aus C Libs 
sind ein Problem im Zusammenspiel der beiden Sprachen. Eben deshalb 
erhärtete sich bei mir die Vermutung das die unerwartet große Codesize 
aus Problemen zwischen C und C++ herrührt.

Das Makefile das er generiert ist im Unterordner Debug zu finden. Ich 
habs mal angehängt.

Was nm angeht, muss ich gerade mal gucken wie ich das als Postbuildstep 
bei Eclipse einstelle.

MfG

Tec

Ps ich hoffe du kannst es dann Compiieren sonst muss ich mal eines 
schreiben.

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

welche Flags muss ich nm geben damit der mir die Symboltable lesbar 
ausgibt. Bzw kann man die in eine textdatei ausgeben? die Liste ist 
ellen lang die nm ausgibt.

MfG

Tec

von Roland H. (batchman)


Lesenswert?

Tec Nologic schrieb:
> Das Problem an sich war lediglich die Frage wie ich mit C Libs in einem
> Cpp Projekt ambesten verfahre.

Die Header bekommen ein /#ifdef __cplusplus extern "C"/, das war's.

> Speziell Callbackfunktionen aus C Libs
> sind ein Problem im Zusammenspiel der beiden Sprachen.

Wenn die Callbacks im C++-Modul sind, dann bekommen diese gezielt ein 
/extern "C"/.

> Eben deshalb
> erhärtete sich bei mir die Vermutung das die unerwartet große Codesize
> aus Problemen zwischen C und C++ herrührt.

Wie schon gesagt, mit 99%iger Sicherheit liegt es nicht daran.

Tec Nologic schrieb:
> welche Flags muss ich nm geben damit der mir die Symboltable lesbar
> ausgibt. Bzw kann man die in eine textdatei ausgeben? die Liste ist
> ellen lang die nm ausgibt.

Einfach umleiten: nm x.elf > x.txt

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.