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
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 | }
|
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.
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?
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)... |
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.