www.mikrocontroller.net

Forum: Compiler & IDEs avrgcc c++ gloables objekt?


Autor: Cyb3r (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ist es möglich ein globales Objekt mit dem Avrgcc zu haben?
Ich habe dies mal versucght mit valatile ein globales Objekt anzulegen 
aber da wirdi mmer ein Fehler ausgegeben.

ALos anlegen geht nur ich darf nicht auf funktionen des Objektes 
zugreifen dann komm imm der fehler:
z.B.:
passing 'volatile Steppermotors' as 'this' argument of 'void 
Steppermotors::move_motor(uint8_t, uint8_t, uint8_t)' discards 
qualifiers

MFG

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zeig mal deinen quelltext..

Autor: Cyb3r (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
OK

Ich wollte den Code erstmal soweit testen. Ich weiß das die while 
Schleifen tödlich sind...

Guckt euch den Anhang an
und die Main dann:
#include "../../Tools/StepperMotors.h"


void msleep(int msec)
{  
  for (int s=0; s<msec; s++) {
    for (long int i=0; i<2403; i++) {
      asm volatile("nop"); 
    }
  }
}

int main()
{
  drives.move_motor(160, FORWARD, 0);
  msleep(3000);
  drives.move_motor(160, BACKWARD, 1);
  while(true);
  return 0;
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in eine Header datei gehört die Definition rein und nicht der Komplette 
quellcode.

Die andere Frage ist ob es wirklich sinnvoll ist auf einen µC c++ zu 
verwenden.

Autor: Cyb3r (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit der Definition ist egal. Da ich .cc Dateine verwende geht es 
nicht anders des werde ich evtl. später optimieren und das mit c++ ist 
ja auch eine andere Frage.

Weiß jemand wie ich mein Problem löse?
Also soll ich einfach Funktionen schreiben und dann die momentanen 
Member Variablen der Klasse global machen? .. und dann wird das 
funktionieren?

Oder wie würdet ihr so eine gleichzeitige Schrittmotransteuerung 
realisieren?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob das sinnvoll ist, ist eine andere Frage.

Das Problem hier ist m.E., daß jede Methode, die für
ein volatile-Objekt aufgerufen wird, auch als volatile-geeignet
deklariert werden muß mit einem angehängten volatile (ähnlich
wie angehängtes const für const-Objekte).
Dabei können die Methoden für volatile und nicht-volatile
getrennt überladen werden:
#include <iostream>


class Steppermotors
{
public:
  Steppermotors()
    : i(1)
  {
  }

  void tuwas()
  {
    std::cout << "ich tu was (normal)..." << std::endl;
  }

  void tuwas() volatile
  {
    std::cout << "ich tu was (volatile)..." << std::endl;
  }

private:

  int i;
};


volatile Steppermotors  st_vol;
Steppermotors  st_nonvol;



int main( int nargs, char **args )
{

  st_vol.tuwas();
  st_nonvol.tuwas();

  return 0;
}

Ausgabe:
klaus@i4a:~ > g++ -Wall t.cpp && ./a.out
ich tu was (volatile)...
ich tu was (normal)...

Die nicht-volatile-Version kann auch weggelassen werden, dann
wird die volatile-Variante sowohl für volatile- als auch
nicht-volatile-Objekte verwendet:
#include <iostream>


class Steppermotors
{
public:
  Steppermotors()
    : i(1)
  {
  }

  void tuwas() volatile
  {
    std::cout << "ich tu was (volatile)..." << std::endl;
  }

private:

  int i;
};


volatile Steppermotors  st_vol;
Steppermotors  st_nonvol;



int main( int nargs, char **args )
{

  st_vol.tuwas();
  st_nonvol.tuwas();

  return 0;
}

Das erzeugt:
klaus@i4a:~ > g++ -Wall t.cpp && ./a.out
ich tu was (volatile)...
ich tu was (volatile)...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Mit global hat das alles nix zu tun.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja der ganze Quellcode in der Header datei ist für andere nicht 
wirklich schön zu lesen.
Warum ist dein globales Object in der header datei? Wenn du mehere 
quellen verwendetst und diese Date inclutiertst dann ist das objekt 
mehrfach vorhanden.

Ich kann nicht genau sagen wo der Fehler ist, aber wenn du schon c++ 
schreibst dann teile den code auch sinnvoll auf die Dateien auf. Also 
für die Klasse ein header eine eine quelle. Dazu noch das Hauptprogramm. 
Eventuell ist dann der Fehler schon weg.

Auch wenn ich ein freund von c++ bin, so würde ich auf dem µC nur C 
einsetzen.
Also mach es wie die meisten leute, verwende globale variabeln oder 
struturen und schreibe normale Funktionen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:

> Auch wenn ich ein freund von c++ bin, so würde ich auf dem µC nur C
> einsetzen.
> Also mach es wie die meisten leute, verwende globale variabeln oder
> struturen und schreibe normale Funktionen.

Was hat dieses Problem denn mit der prinzipiellen Verwendung von C++ zu 
tun? Rein garnichts. Mit der gleichen Logik landest du beim erstbesten 
Unverständnis von C bei Assembler und kurz darauf bei Programmierung in 
nackten Bits.

Dem exakt gleichen Problem kann man auch in Windows, Linux, 
Mac-Programmierung begegnen  - zur Erinnerung: "volatile" begegnet man 
auch bei Multithreading, nicht nur bei Mikrocontrollern.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Was hat dieses Problem denn mit der prinzipiellen Verwendung von C++ zu
> tun? Rein garnichts.

richtig, was anderes habe ich auch nicht geschrieben. Aber das man die 
komplette implementierung in eine Header datei schreibt finde ich sehr 
unschön.
Auch das verwenden von volatil für eine kompletten Objekt ist für mich 
ein kleine anzeichen dafür das sobalt das Projekt etwas größer wird die 
performance sehr stark darunter leitet.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:

> richtig, was anderes habe ich auch nicht geschrieben. Aber das man die
> komplette implementierung in eine Header datei schreibt finde ich sehr
> unschön.

Ich auch.

> Auch das verwenden von volatil für eine kompletten Objekt ist für mich
> ein kleine anzeichen dafür das sobalt das Projekt etwas größer wird die
> performance sehr stark darunter leitet.

Basierend auf dem bischen gezeigten Code ist das eine mutige 
Extrapolation. Aber selbst dann ist deine globale Verdammnis von C++ auf 
Mikrocontrollern dadurch nicht gerechtfertigt.

Autor: Cyb3r (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So
Eure vermutungen schön und gut... Das ist "Pseudo" eher Testcode.
Deswegen unschön unperformant...
Dass das ganze momentan noch nicht getrennt ist liefgt an der Software 
die ich für die Compilierung und die Übetragugn benutzte.
Ich neutze zwar ganz noormal AVRGCC und AVRDUD jedoch gekoppelt mit 
notepad++ in einem.
Falls jemand von euch das qfix Package kennt:
http://www.graupner-robotics.de/downloads/software.html
Das habe ich auf meine Bedürfnisse angepasst und bin noch dabei momentan 
ein paar Dinge umzuschreiben... deswegen funktioniert das splitten von 
Header und Source File momentan nicht. Sobald ich das wieder geregelt 
habe wird das auch wieder "schön" sein.

Falls das mal jemand testen möchte ein Tipp. Das ganze so wie von 
Graupner zur verfügung gestellt funktioneirt nur wenn ihr die ISO auf CD 
brennt und von dort aus installiert und ihr dürft den Programmpfad nicht 
ändern.

Naja habe eine recht unkomfortable Lösung gefunden, somit habe ich das 
ganze in reinem neu C geschrieben. Für diese Andwendung auf jedenfall 
sinvoll meines erachtens, aber ansosnten C++ rules.
Naja jedem das seine

Werd mich ejtzt mal an meine Matrizen Rechnung setzten (Laufroboter).
Inline Assembler FTW^^

Bis die Tage
Danke für dioe Atnworten
MFG Cyb3r

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.