Danke für den Tip. Ich dachte millis() ist bekannt, aber woher denn
auch?!
Es gelingt mir allerdings nicht, eine Pseudo-millis() zu definieren, die
unsigned long liefert, so dass das Gesamtergebnis stimmt.
> liefert eine Warnung und wird zu
Die Warnung hättest du ruhig mal im Posting nennen können: millis() ist
nicht deklariert. Der Compiler wird daher annehmen, dass es einen int
zurückliefert und da der auf AVR nur 16 Bit breit ist, schiebst du den
Wert komplett raus und bekommst als Rückgabewert nur noch 0 oder -1 je
nach Vorzeichen.
> Kann jemand dieses Verhalten logisch erklären und die Zeile mit Shift in> C so formulieren, dass das Erwartete herauskommt?
Das Problem ist erstmal nicht die Zeile mit dem Shift, sondern die
fehlende Deklaration von millis().
DerAltePete schrieb:> lsl r25> sbc r24,r24> mov r25,r24>> Kann jemand dieses Verhalten logisch erklären und die Zeile mit Shift in> C so formulieren, dass das Erwartete herauskommt?
r25:r24 = (r25 < 0) : -1 : 0.
Das kommt raus, wenn du eine 16-Bit Integer mit Vorzeichen durch 65536
dividierst. Ausser dem Vorzeichen bleibt nichts mehr übrig.
Danke A. K. und C-Frickler, völlig richtig und auf der blöden falschen
Annahme von mir basierend, dass "unsigned long millis()" bekannt sein
müßte, was es natürlich nicht ist.
Aber mit meinen Versuchen, eine Pseudo-"unsigned long millis()" zu
definieren, so dass ich den Assembler-Code testen kann, bin ich bisher
im Godbolt gescheitert. Vielleicht helft Ihr kurz?
Peter D. schrieb:>> liefert eine Warnung>> Und deren Wortlaut ist?
Ich tippe auf sowas wie "Missing declaration". Bei millis kommt
eigentlich "unsigned long" raus, aber ohne Deklaration geht der Compiler
von "int" aus.
DerAltePete schrieb:> Aber mit meinen Versuchen, eine Pseudo-"unsigned long millis()" zu> definieren, so dass ich den Assembler-Code testen kann, bin ich bisher> im Godbolt gescheitert. Vielleicht helft Ihr kurz?
"unsigned long millis();" wäre die einfachste Möglichkeit, wenn dem
Compiler der Funktionsinhalt unbekannt sein soll.
Ansonsten halt wie im ersten Link mit einem "return timer;" drin und
geeigneter Definition von timer?
Es wäre einfacher dir zu helfen, wenn du mal erklären würdest warum du
den Assemblercode anschaust und was das dahinterstehende Problem ist.
C-Frickler schrieb:> Es wäre einfacher dir zu helfen, wenn du mal erklären würdest warum du> den Assemblercode anschaust und was das dahinterstehende Problem ist.
Das "Problem" ist Größenwahnsinn bzw. mindestens Überheblichkeit, die
ihn den Fehler beim Compiler suchen läßt. Statt vor dem Bildschirm, wo
er mit 99% Wahrscheinlichkeit zu finden wäre.
Kein Fehler im Programm, pures Interesse, was der Compiler aus dem
C-Code macht, weil ich durch einen Post hier das Tool von Godbolt
entdecken durfte.
Nun tu ich mich aber zunächst schwer, es korrekt in Betrieb zu nehmen.
Deswegen hatte ich um Anschubförderung gebeten und keine bösartigen
Unterstellungen erwartet.
godbolt musst du nicht in Betrieb nehmen, weder korrekt noch sonstwie.
Das macht der Betreiber für dich.
Ansonsten ist das, wie auch alle Compiler, ein SiSo-Tool. Shit in, shit
out.
Oliver
@ DerAltePete
Du solltest Dir klarmachen, dass Compiler Werkzeuge sind, auf deren
korrekter Funktion sich eine sehr große Anzahl Softwareentwickler
verlassen und verlassen müssen. So ein Fehler (in so einem grundlegenden
Zusammenhang) wäre ein ernsthaftes Alarmzeichen! Ungefähr wie in einem
überfüllten Raum "Feuer" rufen!
Kurz: Bitte sei sehr sorgfältig und gewissenhaft, mit solchen Aussagen
bzw. Fragen. Es ist zwar möglich und schon vorgekommen, aber äusserst
unwahrscheinlich, dass Fehler in eher simplen Zusammenhängen in
Compilern auftreten.
DerAltePete schrieb:> Hier einer meiner Versuche, der einfach zeigt, dass der Compiler> wenigstens merkwürdige Dinge tut:
Ja ja. Suprafluide Substanzen sind auch merkwürdig.
DerAltePete schrieb:> Hier einer meiner Versuche, der einfach zeigt, dass der Compiler> wenigstens merkwürdige Dinge tut:
Wenn der Compiler die Wahl hat, das zu tun was du sagst, und das zu tun
was du meinst, entscheidet er sich eigentlich immer für Ersteres.
DerAltePete schrieb:> Danke für den Tip. Ich dachte millis() ist bekannt, aber woher denn> auch?!
Willst Du, daß man Dir bei Deinem Problem hift?
Ich benutze nicht Deinen Programmcode und Dein Entwicklungssystem, aber
ich finde, daß Du auf meine Frage Dir die geschätzt 30 Sekunden Zeit
spendieren können solltest, die Antwort herauszufinden und zu posten.
Ich bin mir recht sicher, daß Dein Problem genau damit zu tun haben
wird, und genau deswegen habe ich Dir die Frage gestellt.
DerAltePete schrieb:> mit meinen Versuchen, eine Pseudo-"unsigned long millis()" zu> definieren, so dass ich den Assembler-Code testen kann, bin ich bisher> im Godbolt gescheitert
Ernsthaft?
1
unsignedlongmillis();
2
3
unsignedshortsetup(){
4
returnmillis()>>16;
5
}
Das war dir zu schwierig? Eventuell willst du ja auch nochmal den
Unterschied zwischen Deklaration und Definition in C nachlesen.
DerAltePete schrieb:> Hier einer meiner Versuche, der einfach zeigt, dass der Compiler> wenigstens merkwürdige Dinge tut
Merkwürdigkeit liegt im Auge des Betrachters. Der Compiler tut schon das
Richtige. Nur gilt eben: garbage in - garbage out. Auch der beste Koch
kann aus ScheiXXe kein wohlschmeckendes Kompott zaubern.
Axel S. schrieb:> Ernsthaft?
Je nachdem wie man millis() in Godbolt definiert, declariert oder
implementiert, und welche Optimierungsoptionen man einstellt, ändert
sich auch der generierte Code von "setup". Für Menschen die den AVR
nicht von innen und aussen kennen, kann das schon für Verwirrung sorgen.
Eric B. schrieb:> unsigned long millis() {> // Damit millis() nichts konstantes zurückliefert
So gehts einfacher: extern unsigned long millis(void);
Generell würde ich in C von f() abraten, f(void) ist besser.
Eric B. schrieb:>> Je nachdem wie man millis() in Godbolt definiert, declariert oder> implementiert, und welche Optimierungsoptionen man einstellt, ändert> sich auch der generierte Code von "setup".
Jein. So lange millis() in der aktuellen Übersetzungseinheit lediglich
deklariert, aber nicht definiert ist, hat der Compiler keine andere
Option, als einen rcall zu millis() zu generieren und dann das Ergebnis
wie gefordert zu manipulieren. Was - aufgrund des avr-gcc ABI [1] - auf
eine Nulloperation hinausläuft. Denn millis() liefert sein unsigned long
Resultat in R25..R22 zurück mit dem MSB in R25. setup() liefert sein
unsigned int Resultat in R25:R24 zurück, was erfreulicherweise schon
genau die gewünschten beiden höherwertigen Bytes des Rückgabewerts von
millis() enthält. Sowohl die Schiebeoperation als auch die Division
durch 65536 optimiert der Compiler zu - nichts. In jeder
Optimierungsstufe außer O0 - da kopiert er die Daten ein bißchen im
Kreis herum.
> Für Menschen die den AVR nicht von innen und aussen kennen, kann> das schon für Verwirrung sorgen.
Wenn man den Anspruch hat, den von avr-gcc generierten Code verstehen
und gar dessen Korrektheit oder Qualität beurteilen zu wollen, dann
muß man mindestens die Aufrufkonventionen des Compilers kennen.
[1] https://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_reg_usage
Rufus Τ. F. schrieb:> Welchen Typ hat der Rückgabewert Deiner Funktion millis?DerAltePete schrieb:> Danke für den Tip. Ich dachte millis() ist bekannt, aber woher> denn> auch?!Rufus Τ. F. schrieb:> Ich bin mir recht sicher, daß Dein Problem genau damit zu tun haben> wird, und genau deswegen habe ich Dir die Frage gestellt.
Ja, hatte es und deswegen hatte ich ja auch "Danke für den Tip" gesagt.
Das war der Kern des Problems.
Alles andere war nur noch meine Unfähigkeit, den Godbolt zu beherrschen
und eine vernünftige Herumprobierumgebung zu schaffen.
Es hat ja am Schluss geklappt, und
Nico W. schrieb:> Wo ist denn das Problem das Millis aus meinem Beispiel zu> übernehmen?
ja, das hätte ich mal tun sollen. Und Eric B. und A. K. haben auch gute
Vorschläge. Und schön, dass Axel S. mir wieder ein paar Dinge
wachgerufen hat.
Das einzige Problem ist, der zu oft unterschwellig unfreundliche und
leicht überhebliche Ton. In keinem anderen Forum der Welt nehmen sich
die Mitglieder diesen "Gotteston", Tenor "Du kleiner Wurm, freu Dich,
dass ich Dich nicht zerquetsche" heraus.
Man wird wie ein Idiot behandelt und es spielt auch keine Rolle, dass
ich in meinem Leben >1Mio Zeilen C-Code geschrieben habe. Mir bleibt
also nur noch, wie so vielen anderen hier, mich irgendwann wieder als
Gast mit neuer Identität anzumelden. Nette Leute gibts hier auch, aber
sie sind so selten
DerAltePete schrieb:> Das einzige Problem ist, der zu oft unterschwellig> unfreundliche und leicht überhebliche Ton.
Du bist aber auch nicht viel besser. Hast damit angefangen, Fehler im
Compiler herauf zu beschwören. Dabei wissen wir alle, dass der Fehler in
99% der Fälle vor dem Bildschirm sitzt.
> In keinem anderen Forum der Welt nehmen sich die Mitglieder> diesen [ton] ... heraus.
Doch. Nicht überall aber in vielen Foren. Zum Beispiel im Heise Forum,
oft auch auf Tagesschau.de und in diversen Beauty Foren die meine Frau
nutzt geht es auch heftig ab.
Stefanus F. schrieb:>> In keinem anderen Forum der Welt nehmen sich die Mitglieder>> diesen [ton] ... heraus.>> Doch. Nicht überall aber in vielen Foren. Zum Beispiel im Heise Forum,> oft auch auf Tagesschau.de und in diversen Beauty Foren die meine Frau> nutzt geht es auch heftig ab.
Na dann ist ja alles im Lot.
Adieu