Forum: PC-Programmierung Linux (ARM) Priorität eines Prozesses


von Roblue (Gast)


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

von dunno.. (Gast)


Lesenswert?

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

Ein Echtzeitbetriebssystem benutzen.. ;)

von Simon S. (-schumi-)


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

: Bearbeitet durch User
von Georg A. (georga)


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
}

von Roblue (Gast)


Lesenswert?

Vielen Dank für eure Hilfe. Ich werde jetzt Teile auf einen PIC 
auslagern.

LG, roblue

von Lothar (Gast)


Lesenswert?

Roblue schrieb:
> Beaglebone Black Board hin und wieder Verzögungen

RISCOS statt Linux:

https://www.riscosopen.org/wiki/documentation/show/Cortex-A8%20port

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.