Schleife: Anstatt Sekunden doch lieber Millisekunden

Antworten
Nachricht
Autor
Marcel_F
Beiträge: 35
Registriert: 13. Dez 2006 16:16

Schleife: Anstatt Sekunden doch lieber Millisekunden

#1 Beitrag von Marcel_F » 21. Feb 2007 11:11

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: Alles auswählen

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
Beiträge: 35
Registriert: 13. Dez 2006 16:16

#2 Beitrag von Marcel_F » 21. Feb 2007 11:25

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

Benutzeravatar
Janka
Beiträge: 3585
Registriert: 11. Feb 2006 19:10

#3 Beitrag von Janka » 21. Feb 2007 19:41

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
Beiträge: 35
Registriert: 13. Dez 2006 16:16

#4 Beitrag von Marcel_F » 22. Feb 2007 8:34

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
Beiträge: 225
Registriert: 01. Jun 2004 9:36

#5 Beitrag von tom servo » 22. Feb 2007 9:25

Marcel_F hat geschrieben: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: Alles auswählen

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 hat geschrieben: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

Benutzeravatar
Janka
Beiträge: 3585
Registriert: 11. Feb 2006 19:10

#6 Beitrag von Janka » 22. Feb 2007 13:40

Marcel_F hat geschrieben: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: Alles auswählen

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.

Antworten