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
> Wie kann ich das lösen bzw. was macht ihr normal, wenn ihr so einen > zeitkritischen Prozess erstellt? Ein Echtzeitbetriebssystem benutzen.. ;)
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
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.