PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wird leere For-Schleife wegoptimiert?



masasibe
24.01.2011, 18:56
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.

BMS
24.01.2011, 19:17
Hier gibt's die ausführlichen Infos dazu: http://rn-wissen.de/index.php/Warteschleife
MfG Bernhard

askazo
24.01.2011, 19:26
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
asm volatile ("nop");

Gruß,
askazo

masasibe
24.01.2011, 19:29
Hi askazo!
Wie deklariere ich eine Variable als volatile?
Und was bedeutet das genau?

askazo
24.01.2011, 19:38
Lies Dir am besten Bernhards Link durch. Da habe ich gerade auch noch was von gelernt
:)

masasibe
25.01.2011, 15:21
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?

radbruch
25.01.2011, 16:01
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:

/* 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_ */

masasibe
25.01.2011, 16:30
Wie genau funktioniert eigentlich die Funktion _delay_ms()?

SprinterSB
25.01.2011, 20:34
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.