Linux (ARM) Priorität eines Prozesses

Gast #3867229
Lesenswert?
• ▲
▼
Hallo,

ich schreibe gerade ein Programm in C (arm-linux-gnueabihf, 
Cross-Compile mit Eclipse) für das Beaglebone Black Board. Es 
funktioniert soweit ganz gut - allerdings habe ich festgestellt, dass 
hin und wieder Verzögungen auftreten und diese stören meine 
Datenkommunikation über die serielle Schnittstelle.

Ich habe bis jetzt fast nur mit den PIC Controllern gearbeitet. 
Natürlich ist das nicht vergleichbar mit einem Betriebssystem wie Linux. 
Dort war ich es jedenfalls gewohnt, dass Programme mittels Timern die 
Interrupts geben wirklich in definierten Zeitabständen etwas ausführen 
konnte.

Ich habe schon versucht, meinen Prozess per renice -10 bzw. -20 eine 
neue Priorität zu geben, das hat aber nicht wirklich geholfen. Da auch 
ein Webserver auf dem Board läuft, kommt es immer wieder bei Anfragen zu 
kurzen Delays in meinem Prozess.

Wie kann ich das lösen bzw. was macht ihr normal, wenn ihr so einen 
zeitkritischen Prozess erstellt?

Liebe Grüße,
Roblue
#3867346
Lesenswert?
• ▲
▼
Roblue schrieb:
> Wie kann ich das lösen bzw. was macht ihr normal, wenn ihr so einen
> zeitkritischen Prozess erstellt?

Auf eine CPU auslagern, die in Realtime arbeiten kann ohne von anderen 
Tasks unterbrochen zu werden; normalerweise ein Mikrocontroller der via 
I²C/SPI/UART/... an den Linuxrechner angebunden ist. Wobei der 
Beaglebone sogar eine extra CPU für sowas dabei hat 
http://elinux.org/BeagleBone_PRU_Notes
#3867523
Lesenswert?
• ▲
▼
Dem Prozess/Thread Realtimepriorität geben (sched_setscheduler), dann 
muss es aber entweder noch eine zweite CPU/Core geben (hat das BBB AFAIK 
nicht) oder der Prozess muss mal blocking in einem read/select/usleep 
stecken, sonst kommt kein anderer Prozess je dran und man kann bei 
Fehler gleich Reset drücken...

Beispiel:
1
void setscheduler(int prio)
2
{
3
  struct sched_param sched_param;
4
  if (sched_getparam(0, &sched_param) < 0) {
5
    printf("Scheduler getparam failed...\n");
6
    return;
7
  }
8
  sched_param.sched_priority = sched_get_priority_max(SCHED_RR)-prio;
9
  if (!sched_setscheduler(0, SCHED_RR, &sched_param)) {
10
    printf("Scheduler set to Round Robin with priority %i...\n", sched_param.sched_priority);
11
    fflush(stdout);
12
    return;
13
  }
14
    printf("!!!Scheduler set to Round Robin with priority %i FAILED!!!\n", sched_param.sched_priority);
15
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren