Schleife: Anstatt Sekunden doch lieber Millisekunden

Post Reply
Message
Author
Marcel_F
Posts: 35
Joined: 13. Dec 2006 16:16

Schleife: Anstatt Sekunden doch lieber Millisekunden

#1 Post by Marcel_F »

Hallo,

ich möchte in einer Delay-Funktion eine bestimmte Zeit warten, um einen Strom einem bestimmten Wert rampenförmig anzunähern.

Eine Schleife die das in Sekunden macht hab ich. Das ist aber etwas zu lang. Daher brauche ich Millisekunden (+-100).

Geht das mit der time.h oder muss ich da andere Wege einschlagen? und wenn ja, welche?

Danke für die Hilfe

Code: Select all

void secDelay(double x){
   time_t start, stop;
   long 
   double diff;

   printf("Einen Augenblick bitte ...\n");
   start=time(NULL);
   while((diff=difftime(stop,start)) != x)
   stop=time(NULL);
   printf("%.1f sek. vorbei!!\n",diff);
}
in der time.h steht z.B. :
time_t tv_sec Seconds.
long tv_nsec Nanoseconds
ich kann aber nichts damit anfangen (nichtsblick?)

Marcel_F
Posts: 35
Joined: 13. Dec 2006 16:16

#2 Post by Marcel_F »

ich sollte besser nicht von einer Schleife sprechen, sondern von einer Funktion ;-D

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#3 Post by Janka »

Bau keine Busyloops! Das ist ein ganz böses AUA!

Wenn du eine bestimmte Zeit warten musst, rufe dafür immer eine Funktion auf, die den Kernel anweist, zu warten. Dann kann der den Prozessor in der Wartezeit nämlich einem anderen Prozess zuteilen oder heruntertakten.

$ man usleep
$ man nanosleep
$man select

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Marcel_F
Posts: 35
Joined: 13. Dec 2006 16:16

#4 Post by Marcel_F »

hi,

usleep() hab ich gestern schon gefunden. Die beiden anderen kannte ich noch nicht.
Danke!
Wobei ich select() nicht ganz blicke. Ist doch mehr für Dateizugriffe oder? Es müssen auch so viele Parameter mit gegeben werden ...

Mit usleep() scheint es vorerst zu funktionieren.

Wie kann ich es bewerkstelligen das ich in der Zeit etwas anderes abarbeiten kann? Bei Mikrocontrollern setze ich einen Timer, der mir einen Interrupt liefert wenn er abgelaufen ist. Bei einem OS ist das vermutlich komplizierter?

Gruß m

tom servo
Posts: 225
Joined: 01. Jun 2004 9:36

#5 Post by tom servo »

Marcel_F wrote:Wie kann ich es bewerkstelligen das ich in der Zeit etwas anderes abarbeiten kann?
In deinem Programm? Ich vermute du suchst Threads.Ansonsten laufen separate Programm eh "parallel".

Code: Select all

man pthreads 
Wobei ich noch nie mit pthreads gearbeitet habe. Vielleicht weiß Janka oder sonstwer mehr.
Wenn du mit Threads arbeiten willst, solltest du dich darüber erstmal informieren. Ich verweise mal einfach auf die Suchmaschine deiner Wahl. ;)
Marcel_F wrote:Bei Mikrocontrollern setze ich einen Timer, der mir einen Interrupt liefert wenn er abgelaufen ist. Bei einem OS ist das vermutlich komplizierter?
Naja, Interrupts können auch auf z.B. High-Low-Wechsel reagieren, abgeschlossene ADC... aber wir schweifen ab. :D

cu

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#6 Post by Janka »

Marcel_F wrote:hi,

usleep() hab ich gestern schon gefunden. Die beiden anderen kannte ich noch nicht.
Danke!
Wobei ich select() nicht ganz blicke. Ist doch mehr für Dateizugriffe oder? Es müssen auch so viele Parameter mit gegeben werden ...

Code: Select all

struct timeval wartezeit;
...
select(0,NULL,NULL,NULL,&wartezeit);
wartet einfach nur. Sehr portabel.

Wie kann ich es bewerkstelligen das ich in der Zeit etwas anderes abarbeiten kann? Bei Mikrocontrollern setze ich einen Timer, der mir einen Interrupt liefert wenn er abgelaufen ist. Bei einem OS ist das vermutlich komplizierter?
Ja. Entweder du benutzt mehrere Prozesse, die Daten austauschen, die laufen sowieso parallel. Oder du benutzt Pseudoprozess-Threads (z.B. pthread, wie der Vorposter schon empfahl). Oder du legst die zeitkritischen Teile deines Programms in den Kernelspace, indem du einen Gerätetreiber dafür schreibst -- dann kriegst du auch wieder Interrupts.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Post Reply