Page 1 of 1

Schleife: Anstatt Sekunden doch lieber Millisekunden

Posted: 21. Feb 2007 11:11
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?)

Posted: 21. Feb 2007 11:25
by Marcel_F
ich sollte besser nicht von einer Schleife sprechen, sondern von einer Funktion ;-D

Posted: 21. Feb 2007 19:41
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

Posted: 22. Feb 2007 8:34
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

Posted: 22. Feb 2007 9:25
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

Posted: 22. Feb 2007 13:40
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