Hallo,
bin gerade auf einen seltsamen Effekt mit _delay_ms aus der avr/delay.h
gestossen.
Folgendes Setup:
Atmega8 mit externem 16MHz Crystal. lfuse:w:0x9f:m hfuse:w:0xd9:m.
F_CPU per Makefile auf 16000000 gesetzt.
Es laufen mehrere ISRs und auch usart wird per
1
#define BAUD 38400
2
#define UBRR F_CPU/16/BAUD-1
gesetzt und funktioniert.
Daher wuerde ich davon ausgehen, dass die Settings alle korrekt sind.
Wenn ich testweise auf den langsameren internen Oszillator wechsle, geht
z.B. usart erwartungsgemaess nicht mehr.
So, nun die _delay_ms()-Funktion: laeuft relativ genau Faktor 13
langsamer als sie soll, also ein Testsignal mit _delay_ms(38)
ontime+offtime laeuft ca. mit 1Hz.
Finden konnte ich nichts dazu, hat jemand sowas schonmal gesehen?
_delay_ms funktioniert nur korrekt mit eingeschaltetem Optimizer. Stell
Dein Projekt auf Release um oder schalte die Optmierung ein, also zum
Beispiel -Os.
Und was wäre dann korrekt? -O1 ist identisch.
Hat sich da was mit einem avr-gcc update geändert?
avr-gcc ist bei mir 5.4.0 aus debian testing.
Wenn ich mich recht erinnere, ist das Verhalten recht neu, fast
identische init code templates + gleiches Makefile habe ich schon Jahre
verwendet, das hat bisher immer wie gewollt funktioniert.
c-hater schrieb:> mc schrieb:>>> Ah richtig, das hatte ich vergessen zu erwähnen: -Os wird verwendet.>> Das ist die falsche Optimierung.
Das ist Quatsch, wie üblich bei dir.
Kalter Rechner schrieb:> mc schrieb:>> _delay_ms(38)>> ontime+offtime laeuft ca. mit 1Hz.>> Um 1 Hz mit ontime+offtime zu erzeugen müsste man _delay_ms(500)> benutzen .....
Ja, stimmt doch? 38x die erwähnte Abweichung um den Faktor 13 ergibt
knapp 500.
mc schrieb:> Es laufen mehrere ISRs
... die evtl. eine Menge Arbeit inline erledigen?
Z.B. Zeichenketten in der ISR über UART ausgeben ist tötlich,
aber wir kennen ja dein Programm nicht ....
Oliver S. schrieb:> Mach ein Minimalprogram daraus, und zeig das hier.>> Oliver
Gerne, hab das mal minimalisiert. USART-Kram ist noch drinnen weil auch
ISR.
Ich habe übrigens definitiv eine Abhängigkeit von compiler+lib bei dem
Effekt. Bin gerade am schauen, wo das genau herkommt, vielleicht
irgendwelche falsch gezogenen Artefakte.
Das muß ein Problem in deiner toolchain sein. Bei mir tut es das
prinzipiell (avr-gcc 10.1, Windows). Es sind zwar keine 50ms, sondern
ca. 61ms, weil da die ISRs noch dazwischenfunken, aber ansonsten
fuktioniert das.
Oliver
Oliver S. schrieb:> Das muß ein Problem in deiner toolchain sein. Bei mir tut es das> prinzipiell (avr-gcc 10.1, Windows). Es sind zwar keine 50ms, sondern> ca. 61ms, weil da die ISRs noch dazwischenfunken, aber ansonsten> fuktioniert das.>> Oliver
Vielen Dank für den Test! Sieht wirklich ganz nach build-umgebung aus,
auf einer neuen VM bekomme ich es (auch debian) nicht reproduziert. In
diesem Sinne Verzeihung fuer die eigentlich überflüssige Frage, aber da
denkt man erstmal nicht dran...
Oliver S. schrieb:> Das muß ein Problem in deiner toolchain sein.
Es gibt da noch ein Problem mit der Toolchain.
Wollte das Programm testen und mein 10.2.0 Gcc hats mir um die Ohren
gehauen.
mc schrieb: