Pro-Linux.de

Pro-Linux

Pro-Linux Diskussions- und Hilfeforum
Aktuelle Zeit: 20. Nov 2018 8:24

Alle Zeiten sind UTC+01:00




Ein neues Thema erstellen  Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 21. Feb 2007 11:11 
Offline

Registriert: 13. Dez 2006 16:16
Beiträge: 35
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:
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. :
Zitat:
time_t tv_sec Seconds.
long tv_nsec Nanoseconds
ich kann aber nichts damit anfangen (nichtsblick?)


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 21. Feb 2007 11:25 
Offline

Registriert: 13. Dez 2006 16:16
Beiträge: 35
ich sollte besser nicht von einer Schleife sprechen, sondern von einer Funktion ;-D


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 21. Feb 2007 19:41 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 22. Feb 2007 8:34 
Offline

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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 22. Feb 2007 9:25 
Offline

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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 22. Feb 2007 13:40 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
Zitat:
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:
struct timeval wartezeit;
...
select(0,NULL,NULL,NULL,&wartezeit);
wartet einfach nur. Sehr portabel.

Zitat:
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.


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC+01:00


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de