- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Fehler beim Multiplizieren? Weiß nicht mehr weiter!

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Anzeige

    Praxistest und DIY Projekte
    Solche Schleifen haben keinen Effekt auf die Maschine. Ergo: Ein optimierender Compiler wie GCC kann das *komplett* in die Tonne kloppen.
    Disclaimer: none. Sue me.

  2. #12
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Bei mir wurden die Schleifen ja offensichtlich nicht wegrationalisiert.

    Ich verwende Optimierung: Size (Größe). Bei beiden Schleifen wird vor der Schleife der Vergleichswert in R24/25 gespeichert. Das hätte ich nicht erwartet, aber ich bin ja auch Kompilerlaie :)

    Normalerweise verzögere ich so:

    int count, dummy;
    for(count=0; count<1234; count++) dummy^=count;

    Das exclusive OR bremst die Schleife zusätzlich und wird nicht wegoptimiert.

    Ach, noch was:

    int ba = 6, tempo = 45, temp;
    temp = 8505 - (ba * tempo);

    temp ist hier für den Kompiler ja eigentlich auch 'ne Konstante, oder? Weil an dieser Stelle des Programms ba und tempo vor der Zuweisung von temp nicht verändert werden kann ein schlauer Kompiler hier ohne Rechnung direkt das Ergebniss als Konstante ablegen. Deshalb wird wohl vor Adresse 62 auch nichts multipliziert oder subtrahiert.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #13
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn der Compiler mit den Konstaten so gut ist, fragt sich, wieso die Schleifen nicht ganz wegfallen. Das einzige was sich tut is da i verändert wird, aber i wird danach ja gar nicht weiter genutzt. Wenn der Compiler noch etwas besser wird könnter er die schleifen wirklich weglassen.

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von Besserwessi
    Wenn der Compiler mit den Konstaten so gut ist, fragt sich, wieso die Schleifen nicht ganz wegfallen. Das einzige was sich tut is da i verändert wird, aber i wird danach ja gar nicht weiter genutzt. Wenn der Compiler noch etwas besser wird könnter er die schleifen wirklich weglassen.
    So ist es. Und dann wundert man sich, daß nix mehr geht...

    Wenn man wiklich Warteschleifen braucht, dann gibt's das Zeug aus util/delay.h (Doku siehe Doku zur avr-libc, ist bei WinAVR anbei) oder sowas

    http://www.mikrocontroller.net/topic/120146

    Falls es unbedingt handgeklöppelt sein soll, muss man dem Compiler sagen, daß er die Schleife nicht wegwerfen darf. Das geht zB so:
    Code:
     for (i=0; i < 1000; i++)
        asm volatile (""::);
    Aber selbst dann muss es nicht eine Schleife sein, der Compiler könnte die Schleife aufrollen in 1000 leere Inline-ASM-Zeilen...

    Mir fällt wirklick keine Möglichkeit ohne Inline-Assembler ein, die /garantiert/ zu einer Schleife wird. Weder for noch goto-Konstrukte.

    Wenns um Verzögerung geht, wohl sowas:
    Code:
     for (i=0; i < 1000; i++)
        asm volatile (" ":"=r"(i):"0"(i));
    Aber auch das kann (teilweise) aufgerollt werden; selbst wenn die Anzahl der Durchläufe nicht zur Compilezeit bekannt ist.
    Disclaimer: none. Sue me.

  5. #15
    Erfahrener Benutzer Begeisterter Techniker Avatar von Jacob2
    Registriert seit
    26.05.2007
    Ort
    Berlin
    Beiträge
    345
    Bei dem Link oben von SprinterSB wird immer von Ticks geredet. Ist das jeweils ein Takt? Der ATmega8 wird glaub ich mit 1MHz ausgeliefert, sind das die Ticks?
    Roboter, CNC Fräse, Elektronik und Basteleien stelle ich auf meiner Website vor...

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Bei einem Takt von 1MHz vergehen in 1 Sekunde 1000000 Ticks.

    Bei einem Takt von x MHz vergehen in 1 Sekunde x*1000000 Ticks.
    Disclaimer: none. Sue me.

  7. #17
    Erfahrener Benutzer Begeisterter Techniker Avatar von Jacob2
    Registriert seit
    26.05.2007
    Ort
    Berlin
    Beiträge
    345
    ok danke! Ich nehm jetzt aber doch _delay_ms/us
    Roboter, CNC Fräse, Elektronik und Basteleien stelle ich auf meiner Website vor...

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress