Go Down

Topic: Unbeabsichtigter Aufruf einer virtuellen Methode. (Read 1 time) previous topic - next topic

Doc_Arduino

#15
Feb 08, 2019, 03:28 pm Last Edit: Feb 08, 2019, 03:32 pm by Doc_Arduino
Hallo,

Arduino Mega2560

Code: [Select]

Start
Scheduler loops: 79540 per 1000ms
Scheduler loops: 79477 per 1000ms
Scheduler loops: 79395 per 1000ms
Scheduler loops: 79477 per 1000ms
Scheduler loops: 79396 per 1000ms
Scheduler loops: 79477 per 1000ms
Scheduler loops: 79396 per 1000ms
Scheduler loops: 79477 per 1000ms
Scheduler loops: 79477 per 1000ms
Scheduler loops: 79395 per 1000ms
Scheduler loops: 79478 per 1000ms
Scheduler loops: 79395 per 1000ms
Scheduler loops: 79477 per 1000ms
...

Quote
In file included from C:\Users\Worker\Documents\Arduino\WorkSpace_ATmega2560\Forums_Sketche\combieSchedulerLoopTest\combieSchedulerLoopTest.ino:6:0:

C:\Users\Worker\Documents\Arduino\libraries\Streaming\src/Streaming.h:102:52: warning: unused parameter 'arg' [-Wunused-parameter]

 inline Print &operator <<(Print &obj, _EndLineCode arg)

                                                    ^

Der Sketch verwendet 3582 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 266 Bytes (3%) des dynamischen Speichers, 7926 Bytes für lokale Variablen verbleiben.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#16
Feb 08, 2019, 04:48 pm Last Edit: Feb 08, 2019, 07:24 pm by combie
Danke für den Test!

Bei mir, mit einem Mega:
Code: [Select]

Start
Scheduler loops: 102540 per 1000ms
Scheduler loops: 102558 per 1000ms


OK...
Es ergibt sich also ein Unterschied.
124 Tausend zu 102 Tausend
Wo der her kommt ist mir dann erstmal ein Rätsel...
(Oder vielleicht auch nicht!)

Der Flash Adressbus des UNO ist 12Bit breit und der des Mega 18(?)Bit.
Das führt dazu, das alle Befehle, welche den PC (ProgrammCounter) manipulieren z.B. Call und Ret 50% mehr Daten schaufeln müssen, und damit länger brauchen.
Zusätzlich nutzt der GCC beim Mega eine Trampoline Section. Allerdings erst für Programmbereiche über 128kByte. Das dürfte hier nicht in Betracht kommen.

Mein Testcode im Anhang.
Die Unterschiede zwischen deinem Mega und meinem Mega können darin begründet liegen, dass ich die Lib noch mal, nach den Reparaturmaßnahmen, ordentlich gefegt habe.
Allen Testcode entsorgt.
Da wo es schnellere Verfahren gab, die schnelleren gewählt.
Merker Variablen und ihre Abhandlungen, reduziert

Auch verwende ich vermutlich eine leicht andere Boarddefinition/Kompiler
Mein Boardverwalter sagt: 1.6.209
Bei dir eher 1.6.23, oder so.




Quote
inline Print &operator <<(Print &obj, _EndLineCode arg)
Ja, das ist eine kleine Schlampigkeit des Streaming Programmierers.

Ersetze in der Lib
> inline Print &operator <<(Print &obj, _EndLineCode arg)
durch
> inline Print &operator <<(Print &obj, _EndLineCode)
Dann ist die Meldung weg.





Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Doc_Arduino

Hallo,

Danke für den Hinweis mit der Streaming Lib.

"Board Version" 1.6.23
IDE 1.8.8
Mega2560

So, neuer Test. Ca. 7% mehr Durchsatz.  :)


Code: [Select]
Start
Scheduler loops: 85069 per 1000ms
Scheduler loops: 85002 per 1000ms
Scheduler loops: 84916 per 1000ms
Scheduler loops: 85002 per 1000ms
Scheduler loops: 84915 per 1000ms
Scheduler loops: 85002 per 1000ms
Scheduler loops: 84916 per 1000ms
Scheduler loops: 85002 per 1000ms
Scheduler loops: 85002 per 1000ms
Scheduler loops: 84915 per 1000ms
Scheduler loops: 85003 per 1000ms
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#18
Feb 09, 2019, 02:13 pm Last Edit: Feb 09, 2019, 02:23 pm by combie
Immerhin!

85000 Durchläufe pro Sekunde ist doch schon etwas, womit man leben kann.

IDE 1.8.8 mit 1.6.23 sagt bei mir auch ca 85000 Durchläufe *korrigiert*



Am Rande:
Quote
"Board Version" 1.6.23
Wenn du unter Datei-Voreinstellungen
Diese http://downloads.arduino.cc/packages/package_avr_7.3.0_index.json als zusätzliche URL beim Boardverwalter einträgst...

Dann ist das Update (im Boardverwalter) auf 1.6.209 möglich.
Damit sollte dann auch C++14 vollständig und C++17 fast komplett zur Verfügung stehen
Selbst Teile von C++2y sind nutzbar
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Doc_Arduino

Hallo,

Code: [Select]
Start
Scheduler loops: 102643 per 1000ms
Scheduler loops: 102558 per 1000ms
Scheduler loops: 102453 per 1000ms
Scheduler loops: 102558 per 1000ms
Scheduler loops: 102453 per 1000ms


Irre. :)  Danke für den Tipp mit dem neuen avr-gcc.
Denn diese Methode von hier   http://blog.zakkemble.net/avr-gcc-builds/  funktioniert nicht.  Egal ob 8.2 oder 7.3
Das Paket funktioniert nur unter Atmel Studio.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

Irre. :)  Danke für den Tipp mit dem neuen avr-gcc.
Denn diese Methode von hier   http://blog.zakkemble.net/avr-gcc-builds/  funktioniert nicht.  Egal ob 8.2 oder 7.3
Das Paket funktioniert nur unter Atmel Studio.
Mittlerweile habe ich die Version 9.1 von genau der Seite bei mir am laufen.
Falls du (oder auch wer anders) interessiert bist, könnte ich mal eine Installationsanleitung basteln.
Denn die Anleitung auf der Seite funktioniert (bei mir) wirklich nicht.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Doc_Arduino

Hallo,

die Anleitung auf der Seite für die Arduino IDE hatte ich auch schon probiert. Im Thread steht dann was das es nur mit der 7er funktionieren soll. Aber auch das wollte bei mir nicht laufen. Irgendwann hast du dann den Tipp mit dem Update in Arduino IDE gegeben. Das läuft ohne Probleme.

Mein Atmel Studio 7 läuft schon eine Weile mit gcc 9.1 von der Seite. Ich muss nur immer eine alte Dateiversion der avr-size.exe im ersten bin Ordner mitschleppen. Sonst zeigt er nach Kompilierung immer falsche Codegrößen an bzw. gar keine.

Falls es dir keine Umstände macht würde ich deine Anleitung ausprobieren, dann wären bei mir beide gleichgezogen. Wenn getestet kannste das bei ihm ins Forum schreiben.   :)
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#22
Jul 05, 2019, 11:50 am Last Edit: Jul 05, 2019, 04:16 pm by combie
Ja, dann mal eine Kurzanleitung.

Auf der Seite gibt es drei Pakete.
x86, x64 und für Linux

x86, x64  laufen auf meinem Win 10
x64 ist deutlich schneller, sonst keine erkennbaren Unterschiede.

Ich gehe mal davon aus, dass du immer noch das Arduino AVR Paket 1.6.209 installiert hast.


Bei mir fahre ich die Arduino portable Version.
Du auch?
Egal.

Das 9.1 Paket kannst du in irgendeinen beliebigen Ordner stopfen.
Ich habe E:\Programme\arduino\portable\avr-gcc\avr-gcc-9.1.0-x64-mingw
gewählt/erzeugt.
Einziger Rat: Keine Leerzeichen im Path

In dem 1.6.209 Installationsordner findet sich eine platforms.txt Datei
Bei mir: E:\Programme\arduino\portable\packages\arduino\hardware\avr\1.6.209\platforms.txt
Daneben, eine platforms.local.txt anlegen

Mit folgendem Inhalt:
Code: [Select]

compiler.path={runtime.ide.path}/portable/avr-gcc/avr-gcc-9.1.0-x64-mingw/bin/

compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++2a  -fno-exceptions -fpermissive -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto
compiler.cpp.extra_flags=-fno-sized-deallocation  -fconcepts



Wenn du einen ganz anderen Ordner wählst, kannst du auch den absoluten Pfad angeben.
Hier eine ältere Variante von mir
Code: [Select]
#compiler.path=E:\Programme\arduino\portable\packages\arduino\tools\avr-gcc\avr-gcc-9.1.0-x64-mingw/bin/

So fluppt es bei mir.

-------
Am Rande:
https://www.gnu.org/software/gcc/projects/cxx-status.html


Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Doc_Arduino

#23
Jul 05, 2019, 09:14 pm Last Edit: Jul 05, 2019, 09:15 pm by Doc_Arduino
Hallo,

läuft  :smiley-mr-green:

Meine IDE ist installiert.  Habs entpackt unter   (32Bit)
Code: [Select]

C:\Users\xyz\Documents\Arduino\avr-gcc-9.1.0-x86-mingw


Mein Pfad lautet  
Code: [Select]

C:\Users\xyz\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.209


Der Eintrag entsprechend
Code: [Select]
compiler.path=C:\Users\xyz\Documents\Arduino\avr-gcc-9.1.0-x86-mingw/bin/

compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++2a  -fno-exceptions -fpermissive -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto
compiler.cpp.extra_flags=-fno-sized-deallocation  -fconcepts

Besten Dank kann ich da nur sagen. Damit kann man jede aktuelle Version verwenden.  :)
Klappt das auch ohne das "1.6.209 Paket" ?   Wobei das nicht wirklich stört.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#24
Jul 05, 2019, 09:55 pm Last Edit: Jul 05, 2019, 09:56 pm by combie
Quote
Klappt das auch ohne das "1.6.209 Paket" ?
Nicht getestet...

Vielleicht stiften wir ja einen stillen Mitleser an?
?

Laut dem Kommentar müsste das funktionieren:
Quote
Code: [Select]
# Default "compiler.path" is correct, change only if you want to override the initial value
compiler.path={runtime.tools.avr-gcc.path}/bin/
Das kann man schon fast als Empfehlung auffassen.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Doc_Arduino

Hallo,

wenn ich mal mehr Zeit haben sollte ... könnte ich das ausprobieren, glaube aber selbst nicht dran.

Habe den SchedulerLoopCount mit der 32 und 64Bit Version vom avr-gcc-9.1 laufen lassen. Bekomme wie erwartet gleiche Werte.
Die 100.000er Marke wurde jedoch unterschritten. Vielleicht sind irgendwo noch verschiedene Einstellungen vorhanden.
Oder das IDE Paket 1.6.209 mit seinem gcc-7.3er war/ist optimiert. Naja was solls.   ;) 

Code: [Select]

// 32Bit
Scheduler loops: 87368 per 1000ms
Scheduler loops: 87278 per 1000ms
Scheduler loops: 87369 per 1000ms

// 64Bit
Scheduler loops: 87278 per 1000ms
Scheduler loops: 87369 per 1000ms
Scheduler loops: 87368 per 1000ms


Welche Unterschiede hast du in den xx Bit Versionen?
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

heweb

Hallo combie,

ich habe mal Dein:
QuadroDynamicDefekt mal ausprobiert.
Dabei habe ich nicht - wie vorgesehen - die Library benutzt, sondern die Dateien in die lokale Dir kopiert.
Dabei ist mir aufgefallen, dass ich in Task.h  #include "Listnode.h"  #include "ListNode.h" umbenennen musste.
Das Ergebnis ist ok:

Start
BlinkTask begin, pin: 10
BlinkTask begin, pin: 11
BlinkTask begin, pin: 12
Init 13
BlinkTask begin, pin: 13

Oder habe ich etwas falsch verstanden?





combie

Quote
Dabei ist mir aufgefallen, dass ich in Task.h  #include "Listnode.h"  #include "ListNode.h" umbenennen musste.
Oh...
Windows meldet mir solche Fehler leider nicht.

Wird in der nächsten Version geändert!

Danke.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

heweb

So, die "QuadroBlinkDynamicDefekt" funktioniert. Es lassen sich jederzeit - auch später im Programm - dynamisch neue Tasks starten.
Anbei als Zip. (keine Library - alles in Sketch-Folder).

Ich benutze kooperatives Multitasking schon seit vielen Jahren - lange vor dem Erscheinen von Arduino.
Hier meine "Werke":
https://github.com/MacLeod-D/Arduino-Multitasking-CoopOS
https://github.com/MacLeod-D/CoopOS-Kurs-Deutsch
http:/HelmutWeber.de
Daher darf ich bei aller Bescheidenheit wohl sagen, über einige Erfahrung zu verfügen - ohne zu beanspruchen, die Weisheit mit Löffeln gefuttert zu haben.

Es juckt mich, einige Bemerkungen loszuwerden, aber die könnten als Kritik verstanden werden.
Das möchte ich vermeiden!

Deshalb positiv:
Combie hat die beste C++ Version erstellt, die ich bisher gesehen habe - deutlich besser, als meine eigenen Versuche dazu.

Glückwunsch - weiter so! ;)


heweb

Sorry, firstD, firstE müsssen Global statt local ;)

Go Up