Forum: Compiler & IDEs Kein cout in AVR Eclipse.


von Frank T. (frankatmicro)


Lesenswert?

Hallo zusammen.

Ich bearbeite gerade ein Buch, um mich in die Programmierung von 
Microcontrollern ein zu arbeiten.

Dazu habe ich Eclipse mit AVR-Erweiterung eingerichtet und möchte jetzt 
die Beispiele durchgehen.

Das Beispiel:
1
 
2
#include <iostream>
3
#include <avr/io.h>
4
#include <avr/iotn13.h>      // ATtiny13
5
6
using namespace std;
7
8
#define TAKT 1000000UL      // Unsigned long 32 Bit Bereich 0 - 4.294.967.295
9
#define BAUD 9600UL        // Standard ist 16 Bit  Bereich 0 - 65535
10
11
12
int main() {
13
14
int x = 0;
15
x = TAKT / (16UL * BAUD) - 1;    // Beispielberechnung
16
cout << "x = " << x << endl;    // Kontrollausgabe
17
}

In der Console von Eclipse erscheint nur der Ausführungspfad, sonst 
nichts.
In anderen Projekten funktioniert das cout. Wieso hier nicht?

Gruß
Frank

von Marius W. (mw1987)


Lesenswert?

Woher soll denn bitte der AVR wissen, wohin das cout gehen soll? Das 
wird so nix. Du musst schon ein bisschen Grips in die µC-Entwicklungs 
stecken.

Gruß
Marius

von Oliver (Gast)


Lesenswert?

Worauf lässt du den Code denn laufen?

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Frank Thie schrieb:

> In der Console von Eclipse erscheint nur der Ausführungspfad,
> sonst nichts.
> In anderen Projekten funktioniert das cout. Wieso hier nicht?

Ähm.
Wie und wo soll denn der AVR was ausgeben, wenn du nach cout schreibst?

UART? (welche Baudrate ist eingestellt, wieviele Bis per Zeichen, Stopp 
bits)
LCD? (welches genau. Text? Grafik?)
7-Segmentanzeige?
LED-Matrix?
Morsecode-Ausgabe?
Bluetooth?

Sieh es ein.
Ein AVR hat per Default keine Konsole. Wenn du eine haben willst, dann 
musst du sie dir erst mal selber machen.
Genau das ist einer der UNterschiede zum erlernen einer 
Programmiersprache auf dem PC. Ein PC hat per Default so etwas wie eine 
Konsole, da er einen Bildschirm hat und die Runtime davon weiß. Und die 
Programmierumgebung ist so eingerichtet, diesen auch zu benutzen und als 
cout zur Verfügung zu stellen. Ohne das du etwas dazu beitragen muss.
Auf einem AVR fängst du ganz unten bei nahezu 0 an. Es gibt so gut wie 
keine Infrastruktur, die aus dem Stand heraus ohne dein Zutun für dich 
benutzbar wäre.

von M, nicht Q (Gast)


Lesenswert?

Frank Thie schrieb:
> Ich bearbeite gerade ein Buch, um mich in die Programmierung von
> Microcontrollern ein zu arbeiten.

Welches?

Weil, C++ cout auf einem ATtiny13 ist schon ein sehr sportlicher 
Versuch. 1 k FLASH, 64 Bytes RAM. Da passt nicht mal ein Bruchteil der 
internen Kontrollstrukturen eine C++ Streams rein.

Und wenn demnächst wieder jemand ankommt, der mir erzählen will, dass 
man Mikrocontroller nicht mehr in Assembler oder C, sondern mindestens 
in C++ programmiert, der soll mir mal cout auf einem ATtiny13 vorführen.

von Fred (Gast)


Lesenswert?

Zum Glück existiert printf in C++, ganz genauso wie in C.

cout kann also gar nicht gegen den Embedded-Einsatz von C++ sprechen.

von Karl H. (kbuchegg)


Lesenswert?

M, nicht Q schrieb:

> Und wenn demnächst wieder jemand ankommt, der mir erzählen will, dass
> man Mikrocontroller nicht mehr in Assembler oder C, sondern mindestens
> in C++ programmiert, der soll mir mal cout auf einem ATtiny13 vorführen.


Der springende Punkt ist, dass cout (oder stream Ausgabe) keines von den 
C++ Featuren ist, die auf einem µC (besonders nicht auf den kleinen), 
einen irgendwie gearteten Sinn machen.

von zong (Gast)


Lesenswert?

Das Buch scheint ja äußerst gut zu sein!

von Frank T. (frankatmicro)


Lesenswert?

Hallo.

Danke für die rege Beteiligung.

Das Buch heist
"Microcomputertechnik mit Controllern der Atmel AVR-RISK-Familie".

Und weil ich vorher ein Buch mit C++ durch hatte, dachte ich, es ging 
mit cout und wurde von mir eingefügt, um x zu kontrollieren.

Die Berechnung selber soll nur die Verwendung der Variablen darstellen 
und nicht einem tieferen Sinn genügen.

Der ATtiny13 stammt noch von einem Blink-Versuch, andere ucś sind 
bestellt.
Im Buch wird ein ATmega16 verwendet.

Ich dachte, wenn ich "#include <iostream>" verwende, könnte ich cout 
verwenden. Ich werde es mal mit printf versuchen.

Dank und Gruß
Frank

von Frank T. (frankatmicro)


Lesenswert?

@ Karl Heinz.

Danke für die Erläuterung.

Da der Code ja noch auf meinem Rechner läuft und so garnicht auf dem uc 
laufen soll, dachte ich daran, Kontrollen von Variablen mit cout ein zu 
richten.

von franz (Gast)


Lesenswert?

Auch für printf gilt das, was Karl Heinz oben geschrieben hat ...

von Frank T. (frankatmicro)


Lesenswert?

Ja wie kann ich denn dann Variableninhalte kontrollieren?

von Karl H. (kbuchegg)


Lesenswert?

Frank Thie schrieb:
> @ Karl Heinz.
>
> Danke für die Erläuterung.
>
> Da der Code ja noch auf meinem Rechner läuft

Der 'läuft' ganz sicher nicht auf deinem Rechner.
Der läuft höchstens innerhalb eines Simulators. Die nobelste Aufgabe 
eines Simulators ist es aber, die zu simulierende Hardware (hier den 
Tiny13) in möglichst allen Details 100% nachzubilden. 100% nachbilden 
bedeutet aber auch: wenn der Tiny13 keine Konsole hat, dann hat auch der 
simulierte Tiny keine. Was es aber in der Simulation gibt: einen 
Debugger, mit dem du dir den Zustand der simulierten Umgebung bzw. die 
Werte von Variablen ansehen kannst, während der simulierte Tiny13 
innerhalb der Simulation dein Programm abarbeitet.

Benutze für deine C++-Studien einen PC-Compiler und keinen AVR-Compiler. 
Soweit kannst du deinem C++ Compiler schon über den Weg trauen, dass er 
C++ Code korrekt umsetzt. Für alles andere kannst du so vorgehen
* benutze den Simulator/Debugger
* wenn du in der realen Hardware ein LCD am µC hängen hast, dann benutze 
das (mit den dafür zuständigen Funktionen), um dir Zwischenwerte 
ausgeben zu lassen
* selbiges mit der seriellen Schnittstelle
* hast du ein Problem mit einem Algorithmus, der dem Prinzip nach 
unabhängig von der Hardware ist, dann bette den Algorithmus in ein PC 
Programm ein, und debugge den Algorithmus am PC um den Denkfehler zu 
finden.

von M, nicht Q (Gast)


Lesenswert?

Karl Heinz schrieb:
> Der springende Punkt ist, dass cout (oder stream Ausgabe) keines von den
> C++ Featuren ist, die auf einem µC (besonders nicht auf den kleinen),
> einen irgendwie gearteten Sinn machen.

Eben.

von Rolf Magnus (Gast)


Lesenswert?

Frank Thie schrieb:
> Da der Code ja noch auf meinem Rechner läuft und so garnicht auf dem uc
> laufen soll, dachte ich daran, Kontrollen von Variablen mit cout ein zu
> richten.

Auf deinem Rechner ist das ok. Auf dem AVR gibt's halt einfach kein 
cout. printf gibt es dort auch, aber du mußt wie erwähnt dazu erst 
definieren, wo die Ausgaben hingeschrieben werden sollen.
Dein Programm sieht aber weder für den PC, noch für den AVR passend aus, 
da einerseits #include <iostream>, was es auf dem AVR nicht gibt und 
andererseits #include <avr/io.h>, was es auf dem PC nicht gibt.

Noch eine Anmerkung:
Frank Thie schrieb:
> #include <avr/iotn13.h>      // ATtiny13

Das macht man nicht. Man gibt avr/io.h und teilt dem Compiler über 
-mmcu=atttiny13 mit, welchen Prozessor man hat. Das prozessorspezifische 
Header-File wird dann automatisch dazu passend gewählt.

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Frank Thie schrieb:
> Ja wie kann ich denn dann Variableninhalte kontrollieren?

Mit einem Debugger oder indem du dir den Variableninhalt über ein 
geeignetes Interface (Display, UART, Funk etc.) an ein Gerät sendest, 
das Daten ausgeben kann.

Edit: Wobei der Debugger hier wegfällt.

von Karl H. (kbuchegg)


Lesenswert?

Daniel H. schrieb:

> Mit einem Debugger oder indem du dir den Variableninhalt über ein
> geeignetes Interface (Display, UART, Funk etc.) an ein Gerät sendest,
> das Daten ausgeben kann.

Allerdings, und genau darauf wollte ich ja die ganze Zeit hinaus, sind 
das alles Dinge, die man sich auf einem AVR erst mal selber machen muss. 
Was wiederum bedeutet, dass man das dann schon können muss.
Da hat man es auf dem PC leichter. Denn dort ist cout schon sinnvoll mit 
einem Ausgabegerät verknüpft, wenn main() startet.

Aber Frank, ich kann dich beruhigen.
Bei deinen ersten Programmen wirst du das alles nicht sehr vermissen. 
Denn all das sind Dinge, die gerade für die ersten programme nicht sehr 
typisch sind. IN deinen ersten Prgorammen wird nicht viel gerechnet und 
das was gerechnet wird, das kannst du im Kopf leicht nachvollziehen. Und 
wenn nicht: Ab in den Debugger damit und nachgesehen was wirklich 
passiert.
Zum anderen stellt sich auch des öfteren die Frage "welcher 
Programmzweig wird denn zb in einem if wirklich genommen". Fragen dieser 
Art kann man zb durch Aufleuchtenlassen einer LED (oder eben nicht 
aufleuchten) einfach klären.

Also: so schlimm ist es nicht. Es gibt Möglichkeiten zum Debugging. Aber 
es sind halt andere als du es am PC unter Mithilfe von cout gewohnt 
warst.

von Frank T. (frankatmicro)


Lesenswert?

@Karl Heinz
Achso, wenn ich AVR Eclypse benutze, dann läuft das über einen 
Simulator, Danke für die Info.
LCD und so hatte ich noch nicht, ich bin gerade bei meinem ersten 
Beispiel im Buch und war überrascht, das cout nicht funktionierte. Aber 
jetzt weis ich ja, warum. Danke also.

@ Rolf Magnus
Ich hatte mit #include <iostream> versucht, cout zum laufen zu bekommen, 
wusste ja noch nicht, das der attiny simuliert wird und es also garnicht 
funktionieren kann. Werde also #include <iostream> rausnehmen.

Wenn ich "-mmcu=attiny13" einsetze, kommt "expected unqualified-id 
before ‘-’ token".

@ Daniel H
Das sind ja Themen für Fortgeschrittene, das kommt wohl noch später, 
aber Danke.

@ Karl Heinz
Danke für den Tipp mit der LED und für die weiteren Erläuterungen und 
für dein Mut machen.
War halt nur überrascht, das cout nicht funktionierte, aber das hat sich 
ja geklärt. Ist halt blöd, wenn beim ersten Programm was nicht 
funktioniert aber mit eurer Hilfe hab ichs ja verstanden.

Danke also an alle
und Gruß
Frank

von Oliver (Gast)


Lesenswert?

Frank Thie schrieb:
>> Achso, wenn ich AVR Eclypse benutze, dann läuft das über einen
> Simulator, Danke für die Info.

Was meinst du mit "AVR Eclypse" ? Was genau hast du installiert?

Oliver

von Frank T. (frankatmicro)


Lesenswert?

Eclipse:
The AVR Plugin is an extension to the C/C++ Development Toolkit to
support development for the Atmel AVR series of embedded processors.

Aber was ist hiermit?
Wenn ich "-mmcu=attiny13" einsetze, kommt "expected unqualified-id
before ‘-’ token".

Frank

von Oliver (Gast)


Lesenswert?

Frank Thie schrieb:
> Eclipse:
> The AVR Plugin ...

Ok. Dann mal Klartext: Du hast keinen Simulator.

Eclipse ist ein erweiterter Editor, mehr nicht. Das braucht zum 
compilieren einen Compiler, den du zusätzlich installieren musst. In 
deinem Fall ist das der avr-gcc. Das AVR-plugin sorgt nur dafür, daß 
Eclipse passende makefiles für den AVR-gcc erzeugen kann. Da ist kein 
Simulator dabei.

Der avr-gcc erzeugt code für einen AVR (welch Überraschung). Dieser Code 
läuft nicht auf einem PC. Der läuft nur auf einem AVR.

Du hast jetzt zwei Möglichkeiten: Ein board mit einem AVR drauf nehmen, 
und da einen JTAG-Debugger dranhängen (Atmel Dragon oder JTAG 2/3). Der 
kann dann mit AVIce und gdb aus Eclipse deine Programme ausführen.

Oder aber simulavr installieren (was unter Windows eine Katastrophe 
ist), und den als Simulator verwenden.

Aber selbst dann wird ein cout nicht funktionieren. avr-gcc kommt ohne 
C++ libaries, der kennt kein cout.


Frank Thie schrieb:
> Wenn ich "-mmcu=attiny13" einsetze

Du brauchst überhaupt nichts einzusetzen, den passenden Prozessor wählst 
du in den projektsettings unter AVR aus. Gebau deise Dinge wickelt das 
AVR-plugin ab.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Oliver schrieb:

> Du hast jetzt zwei Möglichkeiten:


Dritte Möglichkeit:
AVR-Studio installieren.
(Nur der Vollständigkeit halber)

von Frank T. (frankatmicro)


Lesenswert?

Hallo Oliver, Danke für die Aufklärung.
simulavr installieren unter Ubuntu ist einfach.
Wie verwende ich sumulavr jetzt?

von Masl (Gast)


Lesenswert?

simulavr dient als Backend (debug-server) für ein Debug-Frontend, zB 
avr-gdb oder insight.
Dazu müssen beide Tools miteinander verheiratet werden.

Aaaaaber wenn du noch nicht mal weist auf welcher Maschine dein Code 
eigentlich ausgeführt wird, denkst dass Eclipse einen AVR Simulator 
hätte oder dein Tiny auf magischem Weg Texte auf deinen PC erscheinen 
lässt - tut mir leid - dann ist das noch ein paar Hausnummern zu groß 
für dich.

Ich sags nur sehr sehr ungern, aber mir scheint AVR Studio unter Windows 
ist für dich momentan das ideale Gesamtpaket. Da hast du alles, IDE, 
Compiler, Simulator und später auch on-target Debugger unter einem Hut. 
Dir fehlt noch zuviel um das Potpori an Tools, welches ich z.B. hier 
unter Linux am laufen habe einzurichten und miteinander zu verheiraten. 
Das erzeugt nur Frust am Anfang und du wirst die Lust verlieren.

Und leg bitte dein Buch weg und arbeite dafür hier auf der Seite das 
avr-gcc Tutorial durch. Komplett bis hinten. Inklusive LCD und UART 
Teil.
Danach wirst du diesen Thread hier nochmal mit einem Schmunzeln lesen.

Du sagst du hast weitere Controller bestellt? Darf man fragen, wie du 
die betreibst? Also Welches Board (selber gesteckt, Pollin, STK500)?

von Frank T. (frankatmicro)


Lesenswert?

Hi Masl.
Danke für deine Hinweise, aaaaber:

> Masl schrieb:
> Aaaaaber wenn du noch nicht mal weist auf welcher Maschine dein Code
> eigentlich ausgeführt wird, denkst dass Eclipse einen AVR Simulator
> hätte oder dein Tiny auf magischem Weg Texte auf deinen PC erscheinen

Letzteres hab ich nie behauptet; war eine Fehlinterpretation am Anfang 
des Threads.
Dafür dürfte der UART zuständig sein.

Bezogen auf die angesprochene Problematik war es nicht entscheidend, ob 
ein Simulator oder der eingeschränkte Befehlssatz des avr-compilers für 
das nicht funktionieren des cout ursächlich war.
Nur wenn das hier expliziet behauptet wird, dann nehm ich als Anfänger 
das erstmal zur Kenntnis.
Und die Maschine, auf der bei mir alles läuft, ist mein Computer. ;-)

Aber gut, wenn du meinst, das zusammenbinden von zwei Programmen währe 
zu kompliziert, nehm ich das ebenfalls zur Kenntnis, aber auf Windows 
hab ich keine Lust mehr.

Debuggen ist ja auch noch nicht mein Thema, obwohl ,irgendwann muss ich 
da ja auch mal ran.

Board ist: 
http://www.modellbau-und-mehr.de/UDB-28-Universelles-Entwicklungs-Board
Programmer: 
http://shop.myavr.de/Programmer%20und%20Bridges/mySmartUSB%20light.htm?sp=article.sp.php&artID=200006

Gruß
Frank

von Karl H. (kbuchegg)


Lesenswert?

Frank Thie schrieb:

> Bezogen auf die angesprochene Problematik war es nicht entscheidend, ob
> ein Simulator oder der eingeschränkte Befehlssatz des avr-compilers für
> das nicht funktionieren des cout ursächlich war.

Du hast es immer noch nicht.

Ein analoges Beispiel:
Du bist an ein normales Auto gewohnt. Das kaufst du, steigst ein, 
schaltest den Autoradio ein und die Klimaanlage.

Hier, mit deinem Tiny, hast du aber kein normales Auto. Du hast eine 
Bodenplatte, einen Motor, 4 Räder, ein Lenkrad und einen Sitz. Wenn du 
ein Autoradio willst, dann musst DU das einbauen. Und auch der beste 
Pannenhelfer kann daran nichts ändern.

Das hat nichts mit eingeschränktem Befehlssatz zu tun! Du bist hier auf 
dem nackten Silizium unterwegs. All die Softwareschichten, die auf einem 
PC zwischen deinem Programm und dem Silizium liegen, die fehlen auf 
deinem Tiny! Dafür ist dein Tiny-Programm dann aber auch nur 3 Bytes 
groß, während ein minimales PC-Programm gleich mal ein paar KiloByte auf 
die Waage bringt, weil da eben eine Unmenge an Unterbau automatisch 
mitkommt, von dem du nichts merkst, der aber den Komfort zb. einer 
Streamausgabe an cout mitbringt.
Der SImulator simuliert das nackte Silizium. Der Simulator kann daher 
auch nicht irgendwie magisch ein cout aus dem Hut zaubern. Denn in 
erster Linie hat der COmpiler das Programm für das nackte Silizium 
erstellt und auf dem gibt es diesen Teil nun mal nicht.

von Frank T. (frankatmicro)


Lesenswert?

Eingeschränkt ist er ja deshalb, weil er angepasst an die existierenden 
Möglichkeiten des uc ist.
So weit hab ich das schon verstanden.
Was soll denn so schwer sein, Eclipse mit simulavr bekannt zu machen?
Kennst du eine Seite, die das Thema behandelt?

von Frank T. (frankatmicro)


Lesenswert?


von Masl (Gast)


Lesenswert?

Hier auf der Seite im Artikel "Simulation" steht ein wenig, und dann hab 
ich eben gegoogelt. Ich hab das aber recht schnell aufgegeben weils 
irgendwie nicht richtig lief. Muss aber dazu sagen, ich hab mich nicht 
so lange damit beschäftigt.

Das hier war noch als Leiche in einem makefile: Damit startest du den 
debug Server. Du kannst ja mal anfangen zu Recherchieren, was der Aufruf 
genau macht.
1
simulavr --gdbserver -p4242 --device atmega16 -F20000000 -f build/bin/out.elf -t trace.log

Danach musst du dich mit einem Debugger-Frontend deiner Wahl damit 
verbinden. Wenn du noch nie mit Eclipse gedebuggt hast würd ich aber für 
erste Versuche avr-gdb verwenden, das ist nicht gleich so überladen.

von Masl (Gast)


Lesenswert?

So, ich hab noch weiter gegraben:
Das hier ist der Inhalt einer Datei namens "avr-gdb.conf":
1
file build/bin/out.elf
2
target remote localhost:4242

Und das hier der Aufruf von ddd (ein graphisches FrontFront-End für 
gdb):
1
ddd --debugger "avr-gdb -x avr-gdb.conf"
.

Das Ganze zusammengefasst:
Du startest den Simulator, dieser lauscht auf den Port 4242 nach 
ankommende Verbindungen.
Du startest ddd.
ddd liest die Konfigurationsdatei, findet dort den verwendeten Port und 
die Binärdatei, und verbindet sich zum Server.

von Frank T. (frankatmicro)


Lesenswert?

Ja Danke Masl.
Das ist auch hilfreich: simulavr --help
Oben mein Link von 20.28 zeigt schön das Einbinden in Eclipse.
Als Standard-Port-Adresse verwendet simulavr 1212.

von Rolf Magnus (Gast)


Lesenswert?

Frank Thie schrieb:
> Wenn ich "-mmcu=attiny13" einsetze, kommt "expected unqualified-id
> before ‘-’ token".

Das gehört auch nicht in den Code, sondern ist ein 
Kommandozeilenparameter des Compilers.

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.