Hier gibt's die ausführlichen Infos dazu: http://rn-wissen.de/index.php/Warteschleife
MfG Bernhard
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.
Hier gibt's die ausführlichen Infos dazu: http://rn-wissen.de/index.php/Warteschleife
MfG Bernhard
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 mitGruß,Code:asm volatile ("nop");
askazo
Hi askazo!
Wie deklariere ich eine Variable als volatile?
Und was bedeutet das genau?
Lies Dir am besten Bernhards Link durch. Da habe ich gerade auch noch was von gelernt
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?
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_ */
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Wie genau funktioniert eigentlich die Funktion _delay_ms()?
Die Quelle findest du in deiner Installation von avr-gcc inZitat von masasibe
./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.
Lesezeichen