Forum: Compiler & IDEs AVR programmieren in c++ Einstieg?


von Lars (Gast)


Lesenswert?

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:)

von Oliver (Gast)


Lesenswert?

Alles zu C auf dem AVR steht hier:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

C++ ist auf dem AVR mit avr-gcc nur eingeschränkt möglich.
Als Alternative schau dir Arduino an.

Oliver

von Tom M. (tomm) Benutzerseite


Lesenswert?

Ich hab mich vor einigen Monaten auch  mal ein bisschen damit 
beschäftigt und fand diese Sites recht interessant, hilfreich:

http://avr-cpp.de/doku.php
http://avr-cpp-lib.sourceforge.net/

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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?

von Marwin (Gast)


Lesenswert?

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...

von hey maaan (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Malte S. (maltest)


Lesenswert?

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.

von Detlev T. (detlevt)


Lesenswert?

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...

von Roland H. (batchman)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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

von Pete (Gast)


Lesenswert?

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.

von Detlev T. (detlevt)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

Detlev T. schrieb:
> 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?).

Schon alt, und pures C, aber als Ideenspender ganz ok:
http://www.procyonengineering.com/embedded/avr/avrlib/

Oliver

von Marwin (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Malte S. (maltest)


Lesenswert?

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.

von Roland H. (batchman)


Lesenswert?

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? :-)

von Marwin (Gast)


Lesenswert?

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 :-(

von Oliver (Gast)


Lesenswert?

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

von Roland H. (batchman)


Lesenswert?

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

von Stefan N. (stefan_n)


Lesenswert?

Pete schrieb:
> Hallo zusammen,
>
> man kann auch in C objektorientiert programmieren.

Man kann auch in Assembler objektorientiert programmieren.

;-)

von Marwin (Gast)


Lesenswert?

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!

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.