mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik unter C die Funktion Sleep() nutzen


Autor: Kücken (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,
was für Header muss ich denn includen, damit ich die Funktion Sleep 
aufrufen kann.
Danke schön

: Verschoben durch Admin
Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unter Unix:
#include <unistd.h>

unter Windows:
#include <sleep.h>

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du nicht verrätst, welche Plattform und welchen Compiler Du 
verwendest, musst Du wohl selber in der Dokumentation des Compilers 
nachsehen...

Autor: Kücken (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<
Wenn Du nicht verrätst, welche Plattform und welchen Compiler Du
verwendest, musst Du wohl selber in der Dokumentation des Compilers
nachsehen...
>
Also: bei windows mit µVision programmiere ich einen XC167
Eigenltich möchte ich einfach eine LED ein und aus machen und damit man 
sie blinken sieht, brauch ich eine Pause dazwischen. Also habe ich mich 
an die gute alte Sleep erinnert, allerdings klappt das mit includen 
nicht, auch nicht #include <sleep.h>

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sleep.h ist auch für Win32 anwendungen..
Schonmal an timer und interrupts gedacht?

Autor: Kücken (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<Sleep.h ist auch für Win32 anwendungen..
Schonmal an timer und interrupts gedacht?>

wollte es eigentlich vermeiden, da das Blinken nur zum Test ist

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich erinnere mich nicht mehr wirklich an Keil µVision für C167, aber es 
ist sehr wahrscheinlich, dass auch der Keil-Compiler eine Bibliothek 
besitzt, die delay.h oder so ähnlich heißt. Das steht aber sicher alles 
in der Dokumentation von µVision bzw. in der Hilfe.

Autor: Snt Opfer (snt-opfer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn nicht, kann man 'Quick & Dirty' mit for super Warteschleifen bauen, 
für einen Test sollte das reichen und es versteht jeder Compiler, auf 
jeder Plattform.

 for (i=0; i<=10000; i++);

Je nach Geschwindigkeit braucht man int oder long int, wie weit man halt 
zählen will (= warten will). Zur Not innerhalb der Schleife noch was 
"sinnloses" tun oder zwei for - Schleifen kaskadieren.

Aber nur für solche Tests, der Controller macht innerhalb der Wartezeit 
rein gar nix ausser zählen, in "echten" Programmen sieht das etwas 
unprofessionell aus ;)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Snt Opfer wrote:
> Wenn nicht, kann man 'Quick & Dirty' mit for super Warteschleifen bauen,
> für einen Test sollte das reichen und es versteht jeder Compiler, auf
> jeder Plattform.
>
>  for (i=0; i<=10000; i++);
...Und der Optimizer versteht meist auch, dass die Schleife leer ist und 
optimiert sie weg...

Autor: Snt Opfer (snt-opfer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, aber wer hat dem beim Port togglen an ?
Er will doch nur testen...

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deklarier i als volatile, dann darf der compiler nix wegoptimieren. Der 
GCC lässt leere Schleifen stehen, der icc macht sie öfters mal weg. 
Compiler speziell für uC dürften bei weitem nicht so gut optimieren.

Autor: Snt Opfer (snt-opfer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder so.
Alternativ kann man ja in der Schleife irgendwas machen, anderes 
Portregister setzen zum Beispiel oder "sinnlos" den Inhalt einer 
Variable auf eine andere zuweisen, das dürfte dann stehen bleiben.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der icc macht es weg ;)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kücken wrote:
> <Sleep.h ist auch für Win32 anwendungen..
> Schonmal an timer und interrupts gedacht?>
>
> wollte es eigentlich vermeiden, da das Blinken nur zum Test ist

Willst Du nur Testen oder auch Programmieren?

Kein vernünftiges Programm kommt ohne Timer aus, also ist es keine 
Vergeudung, sich mit dem Timer zu beschäftigen.
Man muß dazu nichtmal einen Interrupt aufsetzen, man kann ja das 
Überlaufbit auch pollen.

Und das schönste ist, man muß nicht rumprobieren, der Timer zählt exakt.
Man kann also ein Programm schreiben mit berechneten 1s Timerintervall 
und dann sinds auch wirklich 1s.

Zählschleifen muß man dagen erst ausprobieren.


Peter

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

mach ein _nop_(); in die Schleife und include die intrins.h (KEIL)

Dann optimiert der Compiler die Schleife net raus.

Du kanst nat. auch optimierung im Projekt Eigenschaft ausschalten. Aber 
über kurz oder lang MUSST du verstehen was ein Timer macht und wie er 
funktionert ...

Also fang gar net erst das Schludern an ..

cu

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I_ H. wrote:
> Der
> GCC lässt leere Schleifen stehen, ...

Schon ein ganzes Weilchen nicht mehr.  Die sind schneller weg, als
man gucken kann.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, also der 4er macht's weg, der 3er lässt es stehen.

Aber wie gesagt, mit volatile muss es der compiler sowieso stehen 
lassen.

Autor: EK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
// AVR-GCC C#

#include <inttypes.h> //
#include <avr/io.h> //
#include <avr/interrupt.h>// #warning "This header file is obsolete.
//#include <avr/signal.h> //
//#include <avr/intrins.h>

//#include <mscorlib.dll>
//#include <unistd.h>

void delay_ms(unsigned short ms){
unsigned short outer1, outer2;//Init
outer1 = 1000; //Init
    while (outer1--) { //Cicle N1
        outer2 = 100; //init
        while (outer2--) { //Cicle N2
            while ( ms ) ms--; //Cicle N1+N2
        }
        outer2--; //-1
        outer1--; //-1
    }
}
//Hauptteil ===================================
int main(void){
    DDRC |= _BV(PC0); //Line1 PortC=1 "out"
    while(1) { // ewig
        PORTC &= ~_BV(PC0); //Bit PC0=0 (0V)---an
     //delay_ms(500); //Wartezeit 0.5 sek.
        PORTC |= _BV(PC0); //Bit PC0=1 (5V)---aus
     // delay_ms(500); //Wartezeit 0.5 sek.
    }
}
//=======================================================

Autor: unbekannt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mircrostft vc++ 2008:

//--------------------Countdown 3-1 unendlich 
oft----------------------------
#include <iostream>
#include <windows.h> //wegen Sleep
using namespace std; //wegeb cout
void main()
{
cout<< "Start\n";
anfang:;
cout<< "3\n";
Sleep(1000);
cout<< "2\n";
Sleep(1000);
cout<< "1\n\n\n";
Sleep(1000);
goto anfang;
}
//---------------------------ENDE--------------------------------------- 
-
Das Prog zählt immer von 3 bis 1 toll oder. So geht die sleep function 
unter vc++
Fals ich fehler gemacht hab sorry bin neu in c/c++.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unbekannt wrote:
> Fals ich fehler gemacht hab sorry bin neu in c/c++.
Ja, hast du... :-)

Erster Fehler:
> Mircrostft vc++ 2008:

Zweiter Fehler: Dieses tolle Forum besitzt eine Funktion, um 
C-Quelltexte farblich hervorzuheben:
[c]C-Quelltext[/c]
.

Dritter Fehler:
goto ist fast immer die schlechteste Alternative. Besser und eindeutig 
übersichtlicher wäre hier eine Schleife.
 //--------------------Countdown 3-1 unendlich
 oft----------------------------
 #include <iostream>
 #include <windows.h> //wegen Sleep
 using namespace std; //wegeb cout
 void main()
 {
 cout<< "Start\n";
 for (;;) {
   cout<< "3\n";
   Sleep(1000);
   cout<< "2\n";
   Sleep(1000);
   cout<< "1\n\n\n";
   Sleep(1000);
 }
 }
 //---------------------------ENDE----------------------------------------

Autor: chorus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich sollte man allen C-Compiler Entwicklern für Mikrocontroller 
vorschreiben, dass sie eine "Sleep()" Funktion anbieten.

Allein die Diskussionlänge dieses Threads zeigt, dass so eine Funktion 
notwendig ist.

Ich sage nur: warum einfach, wenn man es sehr umständlich machen kann?

Autor: unbekannt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haku zu deinem Quelltext:

1.
error C2143: Syntaxfehler: Es fehlt ';' vor '--'
error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: 
"default-int" wird von C++ nicht unterstützt.
zu deinen Kommentar:
1. Der Tippfehler ist doch nicht so schlimm oder?
2.Die Quelltext Function hab ich nicht gemacht weils die Anderen auch 
nicht geamcht haben
3.Das mit Schleifen kann ich noch nicht. Ich befasse mich mit c++ seit 2 
Wochen Anhand des Buches: C++ Das Grundlagenbuch von Gerhard Willms und 
und goto hab ich halt in nem anderem Forum gelesen.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mircrostft vc++ 2008:

Hier wird die Win32-API-Funktion Sleep() verwendet. Die wird nicht vom 
Compiler zur Verfügung gestellt, sondern vom Betriebssystem. Und im 
Gegensatz zu ähnlich benannten Varianten auf irgendwelchen µCs 
"verballert" die Funktion auch nicht Rechenzeit in Zählschleifen, 
sondern nutzt den Scheduler des Betriebssystemes ...
Und daher ist Sleep auf einem Win32-System überhaupt nicht mit einem 
Sleep auf einem µC zu vergleichen.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht recht einfach.

Allerdings heißt die Funktion in C, welche in windows.h deklariert ist.
"_sleep();"
#include <stdio.h>
#include <windows.h>

int main(void)
{
    while(42)
    {
        _sleep(1000); //millisekunden
    }
    return 0;
}
Getestet mit DevC++, Code::Blocks auf WinXP

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly wrote:

>> Mircrostft vc++ 2008:

> Hier wird die Win32-API-Funktion Sleep() verwendet.

...die natürlich prima inkompatibel mit der Posix-Funktion sleep()
ist, die ihr Argument in Sekunden nimmt. :-)

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super dann installiert mal Windows XP auf eurem µC^^
Gruß.

Autor: anonymouse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
>> Hier wird die Win32-API-Funktion Sleep() verwendet.
>
> ...die natürlich prima inkompatibel mit der Posix-Funktion sleep()
> ist, die ihr Argument in Sekunden nimmt. :-)
>
>
>
>

Danke, Danke, Danke, jetzt verstehe ich, warum die 5000ms so quälend 
langsam vergehen, seit ich auf Linux gewechselt bin...

Das sollte ganz oben stehen (vor Gastbeitrag), da dieser Thread nun 
Referenz Nr. 1 in der google suche nach sleep in c ist

Autor: Abdul K. (ehydra) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sleep() ist eine Funktion eines (Echtzeit)-BS und hat erstmal nix mit 
einem C-Compiler zu tun.
Sobald man sleep implementiert, hat man eine Abhängigkeit von Timern und 
CPU-Clock. Da aber der typische µC-Programmierer die Gewalt über alle 
Timer haben will, ist da ein Konflikt!
Keil hat dies so gelöst, das sie ein extra Mini-BS passend für ihre 
Umgebung anbieten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.