Ich habe bis jetzt immer in Assembler programmiert mit dem AVR Studio,
nun würde ich gerne wissen wie dies in C++ möglich ist, habe mir zwar
schon einiges ergooglet kann dies aber nicht genau einordnen da es zu
viele unterschiedliche Quellen gibt. Ich wäre sehr dankbar für die
Vermeidung von vielen Fachbegriffen, und einfaches erklären ich bin kein
Studierter:)
Oliver schrieb:> C++ ist auf dem AVR mit avr-gcc nur eingeschränkt möglich.
In gewissem Maße, OK. Insbesondere sollte man auf Exceptions
verzichten, und sich genau überlegen, ob man "late binding"
tatsächlich benötigt.
> Als Alternative schau dir Arduino an.
Was sollte daran anders/besser sein als einfach so C++ mit einem
GCC zu compilieren?
Jörg Wunsch schrieb:> Was sollte daran anders/besser sein als einfach so C++ mit einem> GCC zu compilieren?
Ich habe meine Quellen nicht hier und wahrscheinlich habe ich da
Neuigkeiten verpasst, aber bisher musste man da immer ein wenig fummeln.
Zum Beispiel virtuelle Methoden funktionierten nicht einfach so.
Allerdings sitze ich auch auf einem aelteren gcc...
wenn du wirklich avr in c++ programmieren willst würde ich dir arduino
ans herz legen!
das ist billig und es gibt haufenweise material tutorials displays
sensoren entwicklungsumgebungen .. alles eben ...
ich persönlich halte nichts davon!
ich programmiere µCs in C .. objektorientiert ist meiner meinung für pc
software da
mfg
Jörg Wunsch schrieb:>> Als Alternative schau dir Arduino an.>> Was sollte daran anders/besser sein als einfach so C++ mit einem> GCC zu compilieren?
Ich sach mal so: Die Art der Fragestellung lässt eventuell erahnen, daß
der TO gar nicht unbedingt C++ meint, wenn er von C++ schreibt, und daß
er vor allem noch kein C, geschweige denn C++ kann.
Mit richtigem C++ hat das das Aruduino-Zeugs auch nix zu tun, es gibt
jemandem, der kein C++ kann, aber das Gefühl, es zu können.
hey maaan schrieb:> ich persönlich halte nichts davon!
dito
Oliver
hey maaan schrieb:> ich persönlich halte nichts davon!
Das sei Dir gegönnt.
> ich programmiere µCs in C .. objektorientiert ist meiner meinung für pc> software da
C++ heißt weder automatisch objektorientiert, noch erschöpfen sich die
Möglichkeiten darin. Templates z. B. können ohne jeden Overhead zu ganz
anders strukturiertem Code führen, als das mit C in der Form drin ist.
Die Betonung liegt auf können, anders und in der Form. Am Ende ist es
Geschmackssache.
hey maaan schrieb:> ich programmiere µCs in C .. objektorientiert ist meiner meinung für pc> software da
So habe ich bis vor einer Weile auch gedacht - so lange ich mich mit
Tiny und Mega beschäftigt habe. Das hat sich geändert seitdem ich auf
XMega umgestiegen bin. Da gibt es diverse Hardware mehrfach (z.B. bis zu
8 USARTs), die es nahelegen, mehrere Instanzen einer einzigen
USART-Klasse zu erzeugen. Bislang helfe ich mir damit, alle Daten in
einem struct zu sammeln und den entsprechenden Routinen zu übergeben.
Das ist schon ein Stück des Weges in Richtung von Objekten.
Auch werden meine Projekte immer größer und komplexer. Deswegen bin ich
zur Zeit dabei, C++ auf dem AVR auszuprobieren. Ein Grund ist dabei
sicher auch, ein Multitasking-OS zu vermeiden und stattdessen lieber
voneinander getrennte Objekte zu haben.
Sicher kann man den Programmierstil vom PC nicht einfach auf den µC
übertragen. RAM ist immer noch sehr knapp und um dessen Fragmentierung
zu vermeiden, muss man viel "statischer" programmieren.
Mal sehen, in ein paar Wochen bin ich da wohl schlauer...
Marwin schrieb:> Ich habe meine Quellen nicht hier und wahrscheinlich habe ich da> Neuigkeiten verpasst, aber bisher musste man da immer ein wenig fummeln.> Zum Beispiel virtuelle Methoden funktionierten nicht einfach so.
Das würde mich interessieren, da ich damit noch nie Probleme hatte.
Zeige mal bitte die Quellen für Deine Aussage.
Malte S. schrieb:> C++ heißt weder automatisch objektorientiert, noch erschöpfen sich die> Möglichkeiten darin. Templates z. B. können ohne jeden Overhead zu ganz> anders strukturiertem Code führen, als das mit C in der Form drin ist.
Genau. OOP ist nur ein Aspekt.
Alleine die Möglichkeit, mit templates von dem Präprozessor ein Stück
loszukommen, lohnt sich. Oder typsichere enums, Parameter mit
Default-Werten, static_cast et. al., initializer lists, operator
overloading, zusätzliche Warnings - setze ich alles auf µC ein.
Detlev T. schrieb:> Da gibt es diverse Hardware mehrfach (z.B. bis zu> 8 USARTs), die es nahelegen, mehrere Instanzen einer einzigen> USART-Klasse zu erzeugen. Bislang helfe ich mir damit, alle Daten in> einem struct zu sammeln und den entsprechenden Routinen zu übergeben.> Das ist schon ein Stück des Weges in Richtung von Objekten.
Was hält Dich davon ab, es sofort in C++ zu implementieren? Der GCC wird
in diesem Fall exakt den gleichen Code erzeugen (Funktion + struct vs.
Klasse + this). Jeder Tag später vergrößert Deine Code-Basis, welche Du
später evtl. dann migrieren möchtest.
Roland H. schrieb:>> Zum Beispiel virtuelle Methoden funktionierten nicht einfach so.>> Das würde mich interessieren, da ich damit noch nie Probleme hatte.
Virtuelle Funktionen funktionieren schon, verbrauchen aber kostbares
SRam.
"Out of the box" gehen abstrakte Basisklassen nicht, da fehlt dem Linker
eine Funktion, die man aber leicht selber implementieren kann ( heisst
irgend was mit _pure_virtual..., genau weiß ichs gerade nicht).
Oliver
Hallo zusammen,
man kann auch in C objektorientiert programmieren. Das sollte wohl eher
was für den TO sein. Dann sollten aber auch die Grundlagen in C sitzen.
Roland H. schrieb:> Was hält Dich davon ab, es sofort in C++ zu implementieren?
Das ganze ist - wie gesagt - ein allmählicher Prozess an dessen Ende
sich jetzt herausgestellt hat, dass C++ vielleicht besser wäre.
Ich bin jetzt erst einmal dabei, mir eine Library zu schreiben um die
Hardware in Objekte zu kapseln. (Oder kennt jemand so etwas in fertig?).
So muss ja zum Beispiel ein Hardware-Interrupt erst einmal das
zuständige Objekt dafür finden. Und soll die ISR dann die Daten des
Objektes direkt manipulieren (unter Bruch der Kapselung) oder Methoden
des Objektes aufrufen - vielleicht sogar noch virtuelle -, die die Dauer
der ISR verlängern? Da gibt es noch so einiges auszuprobieren.
Das hier habe ich in meinen Quellen:
---
void* operator new( size_t Size)
{
return( NULL);
}
void operator delete( void* Buffer)
{
}
extern "C" void __cxa_pure_virtual( void)
{
}
---
Was wofuer gebraucht wird, steht in meinen Quellen leider nicht, da habe
ich offensichtlich geschlampt :-(
Was ich am Makefile schrauben musste, weiss ich nicht mehr. Aber auch
das kann ja mittlerweile obsolet sein, meine Basis war ein AVR-Makefile
von 2007.
Pete schrieb:> man kann auch in C objektorientiert programmieren.
Vom Regen unter Umgehung der Traufe direkt in die Scheiße, pflegte
ein früherer Kollege zu sowas zu sagen. :-)
Das kann man natürlich, aber es bringt keinen einzigen Vorteil,
außer Purismus natürlich.
Jörg Wunsch schrieb:> Pete schrieb:>> man kann auch in C objektorientiert programmieren.>> Vom Regen unter Umgehung der Traufe direkt in die Scheiße, pflegte> ein früherer Kollege zu sowas zu sagen. :-)
YMMD
Merken muss, danke :-)
Man kann vieles in C machen. Auch Kunstwerke à la http://www.ioccc.org/
Aber das geht wahrscheinlich in allen Sprachen außer Pascal (das hat zu
viele Airbags eingebaut, um sich selbst gegen die Wand zu fahren oder
auch nur so zu tun).
Es ist sicher auch spannend und v.a. lehrreich, ohne vorhandenes
Framework mit z.B. OOP in C auszuloten, was diese Sprache alles wie
kann. Ob das abgesehen von Selbstbildung auch sinnvoll ist, sei
dahingestellt.
Es ist ja relativ verbreitet, aus obskuren Gründen C++ so stark
abzulehnen, dass man sich dann antut, quasi C with Classes ohne
Zuhilfenahme von cfront mit dem Präprozessor nachzubauen. Oder Vorstufen
davon. Dabei lässt sich C-Code im Allgemeinen mit nur kleinen Änderungen
auch mit einem C++-Compiler übersetzen und dann ganz gezielt um Nutzung
nur der Features der Sprache erweitern, die man vielleicht nicht
ablehnt.
Wobei viel dieser Ablehnung m.E. auf Unkenntnis oder Unsicherheit beruht
und v.a. auf Basis alter Entwicklungsstände von C++, Horrorstories über
Compilerbugs aus dem letzten Jahrzehnt und allgemein der Annahme, dass
es irgendwie doch nur eine kuriose Erweiterung von C ist und als solche
nicht perfekt.
Seit Festfahren der entsprechenden Horizonte hat sich aber bei beiden
Sprachen so einiges getan (C11/C++11), wobei sich am Ende zwei Dinge
zeigen: erstens, was viele schon immer übersehen haben und dann von
"C/C++" reden, ja es sind zwei durchaus verschiedene Sprachen bzw. im
Sprachgebrauch äußerst unterschiedliche Abkömmlinge eines gemeinsamen
Ursprungs. Zweitens: Trotzdem wird einem Auseinanderdriften der Sprachen
da, wo es Sinn ergibt, durchaus entgegengewirkt, so dass die gemeinsame
Untermenge möglichst groß bleibt und am Ende hoffentlich wirklich jeder
die Freiheit hat, sich trotz erwähnter großer Unterschiede gewissermaßen
fließend zwischen den Sprachen zu bewegen.
Oliver schrieb:> Virtuelle Funktionen funktionieren schon, verbrauchen aber kostbares> SRam.
Ich bezog mich auf "virtuelle Methoden funktionierten nicht einfach so".
Es war mir bewusst, dass das auf AVR RAM kostet. Und? Es gab kürzlich
einen Thread, in welchem diskutiert wurde, was zuerst auf AVR zur Neige
geht. Das ist bei nicht ekzessivem Einsatz von "virtual functions" bzw.
im Allgemeinen eher der Flash:
Beitrag "Re: Atmel AVRs: SRAM so unwichtig?" und
Beitrag "Re: Atmel AVRs: SRAM so unwichtig?"
Falls dennoch der RAM knapp wird, dann nimmt man einfach einen größeren
AVR. Wenn das wg. Stückzahlen nicht geht, dann nimmt man einfach einen
ARM/MSP430/Renesas RX/PIC32. Alle anderen haben dieses Problem - zu dem
auch die PROGMEM-Problematik gehört - nicht. Oder man nimmt einen
anderen Compiler.
Aus Gründen des "kostbaren RAMs" auf gutes SW-Design zu verzichten ist
teurer.
Marwin schrieb:> Was wofuer gebraucht wird, steht in meinen Quellen leider nicht, da habe> ich offensichtlich geschlampt :-(
Für den "new" und den "delete" operator, außerdem für "pure virtual
functions".
Die ersten beiden benötigt man genauso oft (oder selten) wie malloc()
und free() in C. Momentan verwende ich weder malloc/free noch
new/delete, Instanzen lege ich statisch an. Die beiden ersten benötigt
man m. W. nach nicht, wenn new/delete nicht verwendet wird (GCC 4.5 /
GCC 4.6).
"__cxa_pure_virtual" benötige ich, da ich vom Design her entweder
"abstract" oder "final member functions" verwende.
Marwin schrieb:> Was ich am Makefile schrauben musste, weiss ich nicht mehr.
Vermutlich werden die Exceptions und RTTI abgeschaltet.
Alles in allem vielleicht 15 Zeilen. Bitte mal ins Verhältnis zum
restlichen Source-Code bzw. Makefile setzen. Kein Vergleich zum Gewinn
durch bessere Möglichkeiten, das SW-Design anders gestalten zu können.
Detlev T. schrieb:> So muss ja zum Beispiel ein Hardware-Interrupt erst einmal das> zuständige Objekt dafür finden.
Das ist in C nicht anders. Auch dort muss in der ISR der Puffer gefunden
werden.
> Und soll die ISR dann die Daten des> Objektes direkt manipulieren (unter Bruch der Kapselung) oder Methoden> des Objektes aufrufen - vielleicht sogar noch virtuelle -, die die Dauer> der ISR verlängern?
Direkt ist nicht Sinn der Sache, dafür gibt es "inline member functions"
unter Beibehaltung der Kapselung und Performance. Ich hab's gemessen, es
entsteht exakt der gleiche Code wie bei einer direkten Zuweisung in C.
Der Vorteil ist, dass der Compiler prüft, ob erlaubt oder unerlaubt
manipuliert wird.
Zum zweiten Punkt "virtual functions": Das ist in C genauso schnell oder
langsam. Ein "function pointer" in C oder "virtual function" in C++ - da
ist kein Unterschied. Kurios dürfte es auf AVR sein: Durch das etwas
unfreiwillige Ablegen der vtable im RAM könnte es sogar schneller sein
:-)
Ein paar Anregungen zu UART und templates finden sich hier:
Beitrag "Re: C++ für Embedded: ab welchen Prozessormerkmalen?"Detlev T. schrieb:> dass C++ vielleicht besser wäre.
Was ist denn wirklich schlechter? :-)
Roland H. schrieb:> Alles in allem vielleicht 15 Zeilen. Bitte mal ins Verhältnis zum> restlichen Source-Code bzw. Makefile setzen. Kein Vergleich zum Gewinn> durch bessere Möglichkeiten, das SW-Design anders gestalten zu können.
Darum ist es in meinem Kommentar ueberhaupt nicht gegangen. Bitte mal
vor dem Posten die eigene Profilneurose runterschalten, das Thema und
den Kontext beachten. Das gilt uebrigens auch fuer die Pappnasen, die
diesen Thread in die n-te Inkarnation von "Warum C++ auf dem
Mikrocontroller" verwandeln wollen. Hier im Thread hat's genau 2 Posts
die ueberhaupt auf die Frage des OT eingehen und dank dir ist dieser
leider auch keiner davon :-(
Marwin schrieb:> Hier im Thread hat's genau 2 Posts> die ueberhaupt auf die Frage des OT eingehen und dank dir ist dieser> leider auch keiner davon :-(
Je nun, da der TO nur einen einzigen, dazu sehr weir interpretierbaren
Beitrag geschrieben hat, um danach auf die kommenden Fragen überhaupt
nicht mehr zu reagieren, ist das Verhältnis doch schon prima.
Wer mehr passende Antworten will, muß sich schon um seine Threads
kümmern. Oder er kriegt halt die Gesamtmenge aller denkbaren
Antworten...
Oliver
Marwin schrieb:> Bitte mal> vor dem Posten die eigene Profilneurose runterschalten, das Thema und> den Kontext beachten.
Die Messlatte mit dem Thema/Kontext könntest Du zunächst bei Dir selbst
anlegen, nämlich an Dein erstes Posting. Hat dieses Posting dem TO bei
seiner Frage geholfen, einen Weg zu C++ auf AVR zu finden?
Zurück zum Thema: Zu den technischen Hintergründen findet sich hier
einiges:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453&postdays=0&postorder=asc
Roland H. schrieb:> Hat dieses Posting dem TO bei> seiner Frage geholfen, einen Weg zu C++ auf AVR zu finden?
Zumindest hat es die Behauptung, es ginge "einfach so" relativiert - so
dass er einen Ansatz hat, dass es bei Problemen durchaus nicht nur an
seinem Code liegen muss.
Auf einen Riesenthread zu verlinken und zu behaupten, da stecke die
Antwort drin, ist auch nicht sehr sinnvoll!