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


von Cyb3r (Gast)


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

von TestX .. (xaos)


Lesenswert?

zeig mal deinen quelltext..

von Cyb3r (Gast)


Angehängte Dateien:

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:
1
#include "../../Tools/StepperMotors.h"
2
3
4
void msleep(int msec)
5
{  
6
  for (int s=0; s<msec; s++) {
7
    for (long int i=0; i<2403; i++) {
8
      asm volatile("nop"); 
9
    }
10
  }
11
}
12
13
int main()
14
{
15
  drives.move_motor(160, FORWARD, 0);
16
  msleep(3000);
17
  drives.move_motor(160, BACKWARD, 1);
18
  while(true);
19
  return 0;
20
}

von Peter (Gast)


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.

von Cyb3r (Gast)


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?

von Klaus W. (mfgkw)


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:
1
#include <iostream>
2
3
4
class Steppermotors
5
{
6
public:
7
  Steppermotors()
8
    : i(1)
9
  {
10
  }
11
12
  void tuwas()
13
  {
14
    std::cout << "ich tu was (normal)..." << std::endl;
15
  }
16
17
  void tuwas() volatile
18
  {
19
    std::cout << "ich tu was (volatile)..." << std::endl;
20
  }
21
22
private:
23
24
  int i;
25
};
26
27
28
volatile Steppermotors  st_vol;
29
Steppermotors  st_nonvol;
30
31
32
33
int main( int nargs, char **args )
34
{
35
36
  st_vol.tuwas();
37
  st_nonvol.tuwas();
38
39
  return 0;
40
}

Ausgabe:
1
klaus@i4a:~ > g++ -Wall t.cpp && ./a.out
2
ich tu was (volatile)...
3
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:
1
#include <iostream>
2
3
4
class Steppermotors
5
{
6
public:
7
  Steppermotors()
8
    : i(1)
9
  {
10
  }
11
12
  void tuwas() volatile
13
  {
14
    std::cout << "ich tu was (volatile)..." << std::endl;
15
  }
16
17
private:
18
19
  int i;
20
};
21
22
23
volatile Steppermotors  st_vol;
24
Steppermotors  st_nonvol;
25
26
27
28
int main( int nargs, char **args )
29
{
30
31
  st_vol.tuwas();
32
  st_nonvol.tuwas();
33
34
  return 0;
35
}

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

von Klaus W. (mfgkw)


Lesenswert?

PS: Mit global hat das alles nix zu tun.

von Peter (Gast)


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.

von (prx) A. K. (prx)


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.

von Peter (Gast)


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.

von (prx) A. K. (prx)


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.

von Cyb3r (Gast)


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

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.