Forum: PC-Programmierung Raspberry - Timer


von Manni (Gast)


Lesenswert?

Hallo, für eine Anwendung in C benötige ich einen Softwaretimer.
Der Handler "timer_handler" wird allerdings nicht jede 10ms ausgeführt.
Der Timer läuft viel langsamer.
1
void timer_handler (int signum)
2
{
3
   /* do something */     
4
}
5
 
6
void Init(void)
7
{
8
    struct sigaction sa;
9
    struct itimerval timer;
10
11
    /* Installiere timer_handler als Signal Handler fuer SIGVTALRM. */
12
    memset(&sa, 0, sizeof (sa));
13
    sigemptyset(&sa.sa_mask);
14
    sa.sa_handler = &timer_handler;
15
    sigaction(SIGVTALRM, &sa, NULL);
16
17
    /* Timer konfigurieren fuer 10 ms ... */
18
    timer.it_value.tv_sec = 0;
19
    timer.it_value.tv_usec = 10000;
20
21
    /* ... und alle 10 ms danach */
22
    timer.it_interval.tv_sec = 0;
23
    timer.it_interval.tv_usec = 10000;
24
25
    /* Timer starten */
26
    setitimer(ITIMER_VIRTUAL, &timer, NULL);
27
}

von Mikro 7. (mikro77)


Lesenswert?

Du benutzt ITIMER_VIRTUAL: "This timer counts down against the user-mode 
CPU time consumed by the process. (The measurement includes CPU time 
consumed by all threads in the process.) At each expiration, a SIGVTALRM 
signal is generated."

Ist das was du wirklich willst?

von Manni (Gast)


Lesenswert?

Ja das mit dem Timer (setitimer) ist doch nicht so eine gute Idee.
Ich bräuchte quasi einen 1ms Tick für meinen Scheduler. Was für 
Möglichkeiten gibt es da für den raspberry pi?

von Mikro 7. (mikro77)


Lesenswert?

Was für ein Scheduler? Muss der Auslöser asynchron sein? Gehen auch 
Threads?

Zu deinem Code: Was du willst ist doch ITIMER_REAL/SIGALRM statt 
ITIMER_VIRTUAL/SIGVTALRM, oder nicht?

Ob der es dann schafft wirklich alle 10ms auszulösen, oder gar jede 1ms, 
und ob du die Signale schnell genug verarbeiten kannst musst du halt 
ausprobieren.

https://linux.die.net/man/2/setitimer

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.