[linux] Restart van setitimer gaat niet goed.

Ad van den Broek advandenbroek.nl op gmail.com
Ma Jun 15 15:20:15 CEST 2009


Ha linux vrinden,

Het gebruiken van een timer met setitimer gaat goed.
Het resultaat (de timer interrupt of alarm signal) komt keurig op tijd.

Na het alarmsignal wordt een stukje code (Sendloop) doorlopen en wordt
de timer opnieuw gestart (100mS).
Dit gaat goed.

Echter,
soms komt er andere data binnen,
waardoor de sendloop eerder gestart moet gaan worden
en de actuele wachttijd dus verkort moet gaan worden.
De actuele timer moet dan beperkt worden tot 10mS.
Dat doe ik door de setitimer te stoppen
en de setitimer opnieuw te starten met de nieuwe timerwaarde van 10mS.
(heb ook geprobeerd zonder eerst te stoppen en dit maakt niets uit).

De volgende alarmsignal is dan echter niet na 10mS
maar al eerder,
en zelfs wat random, dus bv na 1mS al.

Onderstaand een stukje code met een stukje log.

Overigens....
in dit voorbeeld proberen we de timer op 5mS te zetten maar
dit wordt dan blijkbaar vanzelf 10mS gemaakt.

Iemand ervaring met herhaald setten van setitimer ?
Kan bijna niet voorstellen dat hier iets mis mee kan gaan
maar tegelijkertijd ben ik ook blind geworden voor een eventuele
fout in de eigen code.
Wellicht hier iemand met een frisse blik die iets vreemds ziet ?


Setting the timer:
[CODE]
    // set
    itv_real = itv;

    fprintf(stderr, "(%d) setitimer: value = %d s + %d us, interval = %d s + %d
us\n", (int) getpid(), (int) itv.it_value.tv_sec, (int)
itv.it_value.tv_usec, (int)
itv.it_interval.tv_sec, (int) itv.it_interval.tv_usec);
    setitimer(ITIMER_REAL, &itv_real, NULL);

    getitimer(ITIMER_REAL, &itv_get);
    fprintf(stderr, "(%d) getitimer: value = %d s + %d us, interval = %d s + %d
us\n", (int) getpid(), (int) itv_get.it_value.tv_sec, (int)
itv_get.it_value.tv_usec,
(int) itv_get.it_interval.tv_sec, (int) itv_get.it_interval.tv_usec);
[/CODE]

When the alarm signal has arrived:
[CODE]
         getitimer(ITIMER_REAL, &itv_get);
          fprintf(stderr, "(%d) getitimer: value = %d s + %d us,
interval = %d s +
%d us\n", (int) getpid(), (int) itv_get.it_value.tv_sec, (int)
itv_get.it_value.tv_usec, (int) itv_get.it_interval.tv_sec, (int)
itv_get.it_interval.tv_usec);
[/CODE]
... and the SendLoop is executed (which will display the time)


This gives strange behaviour:
[CODE]
/* We starten met de normale timerwaarde van 100mS
1245058533.560818 | SendLoop: loopstate=2, respcount=1
1245058533.560933 |     start timer 100 000 us @ SendLoop-case1
(10125) setitimer: value = 0 s + 100 000 us, interval = 0 s + 0 us
(10125) getitimer: value = 0 s + 100 000 us, interval = 0 s + 0 us

/* We hebben de andere data ontvangen en
/* We stoppen de timer, dit lijkt goed te gaan
1245058533.573431 |     stop timer @ newData
(10125) setitimer: value = 0 s + 0 us, interval = 0 s + 0 us
(10125) getitimer: value = 0 s + 0 us, interval = 0 s + 0 us

/* We zetten een nieuwe timerwaarde van 5mS (wordt 10mS)
1245058533.573667 |     start timer 5 000 us @ newData
(10125) setitimer: value = 0 s + 5 000 us, interval = 0 s + 0 us
(10125) getitimer: value = 0 s + 10 000 us, interval = 0 s + 0 us

/* het alarmsignal komt
(10125) getitimer: value = 0 s + 0 us, interval = 0 s + 0 us
1245058533.574632 | SendLoop: loopstate=2, respcount=2
/* maar helaas komt het alarmsignal al na 965uS ipv de 10mS.

/* We gaan weer verder met de normale Sendloop van 100mS herhaling
1245058533.574769 |     start timer 100 000 us @ SendLoop-case1
(10125) setitimer: value = 0 s + 100000 us, interval = 0 s + 0 us
(10125) getitimer: value = 0 s + 100000 us, interval = 0 s + 0 us

(10125) getitimer: value = 0 s + 0 us, interval = 0 s + 0 us
1245058533.674643 | SendLoop: loopstate=2, respcount=2
1245058533.674792 |     start timer 100 000 us @ SendLoop-case1
(10125) setitimer: value = 0 s + 100000 us, interval = 0 s + 0 us
(10125) getitimer: value = 0 s + 100000 us, interval = 0 s + 0 us

(10125) getitimer: value = 0 s + 0 us, interval = 0 s + 0 us
1245058533.774598 | SendLoop: loopstate=2, respcount=2
[/CODE]


What happens:
- timer is started with 100000us @ .560933
- timer is stopped @ .573431
- timer is started with 5000us (actually 10000us) @ .573667
- timer is finished @ .574632
The time between last start and finish is not 10000us, but 965us :confused: .

The kernel version is 2.4.32.


-- 

With best regards,
Ad van den Broek



More information about the Linux mailing list