-         

Ergebnis 1 bis 9 von 9

Thema: Wird leere For-Schleife wegoptimiert?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von masasibe
    Registriert seit
    21.01.2011
    Beiträge
    181

    Wird leere For-Schleife wegoptimiert?

    Anzeige

    Hallo zusammen!
    Ich habe wieder eine Frage:
    Kann man eigentlich eine leere Forschleife als "Warteschleife" für ganz kurze Wartezeiten in WinAVR verwenden? Ich habe nämlich einmal gehört das leere Schleifen vom Compiler wegoptimiert werden.

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    26
    Beiträge
    1.192
    Hier gibt's die ausführlichen Infos dazu: http://rn-wissen.de/index.php/Warteschleife
    MfG Bernhard

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Eine leere For-Schleife wird mit Sicherheit wegoptimiert, wenn man keine besonderen Vorkehrungen trifft.
    Mir fallen 2 Möglichkeiten ein, dies zu verhindern:
    - Du deklarierst die Schleifenvariale als volatile
    - Du lässt die Schleife nicht leer, sondern füllst sie mit
    Code:
    asm volatile ("nop");
    Gruß,
    askazo

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von masasibe
    Registriert seit
    21.01.2011
    Beiträge
    181
    Hi askazo!
    Wie deklariere ich eine Variable als volatile?
    Und was bedeutet das genau?

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Lies Dir am besten Bernhards Link durch. Da habe ich gerade auch noch was von gelernt

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied Avatar von masasibe
    Registriert seit
    21.01.2011
    Beiträge
    181
    Ah vielen Dank!
    Ach und noch eine Frage:
    In dem Artikel über Warteschleifen steht auch etwas über die avr/delay.h - Datei.
    Ist das eine andere Datei als die util/delay.h?

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    In der aktuellen WinAVR-Version wird delay.h im Verzeichniss util gespeichert, es ist aber dieselbe Datei.

    Inhalt der aktuellen Datei delay.h im avr-Verzeichniss:
    Code:
    /* Copyright (c) 2005 Joerg Wunsch
       All rights reserved.
    
       Redistribution and use in source and binary forms, with or without
       modification, are permitted provided that the following conditions are met:
    
       * Redistributions of source code must retain the above copyright
         notice, this list of conditions and the following disclaimer.
    
       * Redistributions in binary form must reproduce the above copyright
         notice, this list of conditions and the following disclaimer in
         the documentation and/or other materials provided with the
         distribution.
    
       * Neither the name of the copyright holders nor the names of
         contributors may be used to endorse or promote products derived
         from this software without specific prior written permission.
    
      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
      LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
      CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
      SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
      INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
      CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
      POSSIBILITY OF SUCH DAMAGE. */
    
    /* $Id: delay.h,v 1.14 2005/11/05 22:23:15 joerg_wunsch Exp $ */
    
    #ifndef _AVR_DELAY_H_
    #define _AVR_DELAY_H_
    
    #warning "This file has been moved to <util/delay.h>."
    #include <util/delay.h>
    
    #endif /* _AVR_DELAY_H_ */

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von masasibe
    Registriert seit
    21.01.2011
    Beiträge
    181
    Wie genau funktioniert eigentlich die Funktion _delay_ms()?

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Zitat Zitat von masasibe
    Wie genau funktioniert eigentlich die Funktion _delay_ms()?
    Die Quelle findest du in deiner Installation von avr-gcc in
    ./avr/include/avr/delay.h

    Beachte auch, daß dort weitere Header includet werden. Also einfach an die Fersen heften...

    Die Funktionen arbeiten nur gscheit mit optimierendem Compiler zusammen, da ansonsten Divisionen überbleiben, die erst zur Laufzeit berechnet werden und das ganze Delay-Zeug unbrauchbar machen.

    BTW: Verzögerungsschleifen braucht man nur für
    1) Einfachste Beispielprogramme
    2) Kurze (!) Wartezeiten für lahme Hardware

    ANsonsten sind Timer/IRQs dein Freund. Schreib einfach mal ein Programm, daß eine LED mit 1 Hz blinken lässt und gleichzeitig eine zweite mit 0.9 Hz. Da ist mit Rumtrödelschleifen schon Ende Gelände.
    Disclaimer: none. Sue me.

Berechtigungen

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