Bisher habe ich kaum Microcontrollerprojekte in C++ gesehen - deshalb wollte ich einfach mal diese Sprache für ein kleines AVR-Projekt ausprobieren. Das habe ich dann mit einer Erarbeitung der direkten digitalen Synthese (DDS) für mich verbunden. Ich habe das Resultat in Form einer Ausarbeitung zusammengefaßt - vielleicht hilft es dem einen oder anderen. Mein Fazit: C++ kann sich durchaus lohnen. Allein der objektbasierende Ansatz verhilft dazu, daß die Daten und die darauf arbeitenden Methoden "zusammengepackt" sind, womit zum einen keine explizite Übergabe von Adressen mehr nötig sind und zum anderen Fehlerquellen bei der Verwendung reduziert werden. Übersichtlicher wird der Quellcode dadurch auf jeden Fall. Für die DDS kann sich auch die volle Objektorientierung lohnen, indem das Funktionsprinzip und die Schnittstelle der DDS in einer Basisklasse implementiert wird, von der dann abgeleitete Klassen für die verschiedenen Signalformen (Sinus, Rechteck, Dreieck) abgeleitet werden. http://www.knoerig.de/AVR-CPP.html#SinGen
Hallo Rudi, danke für deinen Beitrag. Ich hätte da noch ein paar Fragen... 1. Mit welchem Tool kann man diesen Code übersetzen? 2. Vermischt du in der main.c nicht c mit c++? Soweit ich weiß können dabei "unfindbare" Fehler auftreten. 3. Was steht in der main.cpp drin? Ist dies das gleiche Programm wie in der main.c nur in assembler?
Ups... Es ist die main.c. Ich habe das Makefile von diesem Forum hier leicht angepaßt, aber es nicht so ganz hinbekommen daß er .cpp-Dateien verarbeitet. Deshalb habe ich nach einigem Grummeln die Sache bei der main.c belassen.... Kann man bestimmt schöner hinbekommen, aber in Sachen Makefiles kenne ich mich nur grundlegend aus.
Woran ist es gescheitert? Hat make dir dauernd den Quelltext gelöscht?
Yep. So prinzipiell habe ich ja verstanden wie das Makefile arbeitet, aber so genau kenne ich mich mit den generischen Anweisungen nicht aus... Jedenfalls habe ich das Handtuch geworfen, bin bei der main.c geblieben und habe mich der eigentlichen Aufgabe gewidmet.
Der Vektor mit der Sinustabelle ist auch noch doppelt definiert. Aber irgendwie is das jetzt kein soooo überzeugender Einsatz von C++, um ehrlich zu sein :-/
Das geht auch auf die schlechte Adaption des Makefiles zurück - geplant war, aus dem Klassenobjekt ein "abgeschlossenes" Modul zu bauen. Entnervt habe ich dann den Sinus-Vektor in die Deklaration übernommen. Ich gebe offen zu - das Makefile hätte ich selbst noch einmal schreiben sollen!
Den Ärger hatte ich nämlich auch mal mit einem Makefile aus dem Forum, als ich mit C++ arbeiten wollte. Das Problem ist, daß ein Listing erzeugt werden soll, und der Name dafür nur für *.c sinnvoll erzeugt wird. In der Originalversion steht eine Zeile in der Art:
1 | CFLAGS += -Wa,-adhlns=$(<:.c=.lst) |
Mit dem $(<:.c=.lst) wird vom Dateinamen das .c am Ende weggenommen und durch .lst ersetzt; der so erzeugte Name wird dann später für das Listing benutzt. Bei einer *.cpp wird nichts ersetzt, weil sie nicht auf .c endet, und der Name des Listingfiles wird wundersamerweise identisch mit dem des Quelltextes. Damit wird dann beim Kompilieren der Quelltext zerstört :-( Meine Korrektur sieht so aus:
1 | CFLAGS += -Wa,-adhlns=$<.lst |
Dabei wird dann nichts mehr ersetzt, sondern einfach .lst angehängt. Zu a.c und b.cpp werden also die Listings a.c.lst und b.cpp.lst erzeugt. Vielleicht könnte man ja mal die Vorlage in der Art korrigieren?
Sven P. schrieb: > Aber irgendwie is das jetzt kein soooo überzeugender Einsatz von C++, um > ehrlich zu sein :-/ Aber für C auch nicht überzeugender :-)
@Klaus Wachtler: Werde ich demnächst unbedingt ausprobieren! Der Makefile-Spezialist bin ich leider nicht.... Mea culpa - lastet der Programmiersprache nicht meine Übereiltheit mit der Doppeldeklaration an!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.