Mit uC oder RPi einen Bitstrom ausgeben

Gast #5974918
Lesenswert?

Guten Abend Leser.

Ich habe eine Protokollimplementierung auf einem RPi gemacht , bei der 
in jeder Sekunde zwei Bitströme mit je 10.24Mbit im Speicher erzeugt 
werden. Nun möchte ich diese Bitströme zu einen Modulator über die GPIOs 
ausgeben. Wie wäre die Datenausgabe auf einem Pi zum Beispiel umsetzbar? 
Man bräuchte ja einen feingranularen Timer der dann alle 1/10.24M 
Sekunde eine Routine aufruft um ein Bit des Datenstromes per Bitbanging 
auszugeben. Gibt es so feingranulare Timer auf einem Pi unter Linux??? 
Schaft das ein "normaler" Linux-Kernel noch oder sind hier schon 
RT-Linuxkernel von Nöten? Bei einem uC kann man ja die Takte als Timer 
auszählen, da hängt dann aber auch kein OS dazwischen. Allerdings würde 
ich ein Pi o.a. Board und ein Linux bevorzugen, da ich für die 
Erstellung der 2* 10.24MBit/s  Content aus mehreren Programmen mittel 
TCP/IP Unterprozesskommunikation erhalte.

Für ein paar Ratschläge von Leuten die den Pi SoC im Schlaf kennen wäre 
ich dankbar.

Gruß Rudolph
Gast #5974940
Lesenswert?

Ist nicht machbar. Linux haut dir gerne mal fuer ein paar Millisekunden 
dazwischen. Auch ein Echzeitlinux wird die 10M nicht schaffen. 
Hoechstens unter Verwendung eines Schedulers, der zwischen deinem 
Echtzeittask und dem Linux umschaelt. Dann ist der 
Betriebssystem-Komfort aber irgendwie wieder weg...
Gast #5974972
Lesenswert?

Du könntest die Daten ja auch Byteweise ausgeben. Also nicht seriell and 
einem GPIO, sondern parallel an 8 GPIO Pins + Takt.
Die könnte man dann ja theoretisch im auch wieder serialisieren - aber 
der der RPi wäre erstmal entlastet.

Allerdings wäre die Frage, was es mit Deinem "Modulator" auf sich hat.
Kannst Du da überhaupt schnell genug modulieren?
Gast #5974985
Lesenswert?

RudolphB schrieb:
> Wie wäre die Datenausgabe auf einem Pi zum Beispiel umsetzbar?

Bei der Datenrate würd ich versuchen, das in einen kleinen FPGA 
auszulagern. Dort Bufferst du die Daten und lässt ihn die Daten 
serialisieren.

10MHz auf einen GPIO mit RT-Linux ist wahnsinnig. Das Ding geht in den 
Interrupts unter.
Gast #5975249
Lesenswert?

Marvin schrieb:
> Allerdings wäre die Frage, was es mit Deinem "Modulator" auf sich hat.
> Kannst Du da überhaupt schnell genug modulieren?

Das ist kein Problem und auch nicht die Frage. Diese "Blackbox" muss nur 
kontinuierlich ohne Aussetzter 2x 10.24 MBit/s empfangen.
Der Knackpunkt ist momentan nur die Ausgabe von 2x10.24 MBit/s am GPIO.

Einige Nutzer schreiben ja, das Linux das nicht zulässt? Das dürfte dann 
doch aber sicher nur den Userspace betreffen oder wie schaufelt das 
System USB2/3 oder Ethernet mit weit höheren Datenraten rein/raus?

Ließe sich nicht über ein Gerätetreiber mehr Echtzeitverhalten aus einem 
normalen Kernel rausholen?


Als Ultima Ratio würde ich eventuell die Daten per Ethernet auf ein 
STM32H7 (Nucleo Board mit 400 MHz Takt) senden und die Daten dort per 
GPIOs ins Auge fassen. Aber eigentlich sollten doch "läppische" 2x 10 
MBit auch per Gerätetreiber auf einem Linux-Board möglich sein ohne das 
Linux da einen ein Bein stellt?
#5975359
Lesenswert?

RudolphB schrieb:

> Der Knackpunkt ist momentan nur die Ausgabe von 2x10.24 MBit/s am GPIO.
>
> Einige Nutzer schreiben ja, das Linux das nicht zulässt? Das dürfte dann
> doch aber sicher nur den Userspace betreffen oder wie schaufelt das
> System USB2/3 oder Ethernet mit weit höheren Datenraten rein/raus?

1. mit spezialisierter Hardware. Die Serialisierung wird in Hardware 
gemacht und die Hardware hat dedizierte Buffer, die über einen breiten 
und schnellen Bus gefüllt werden.

2. mit Kernel-Treibern. Spätestens dann, wenn Datenmengen größer als der 
Hardware-Buffer übertragen werden sollen, braucht man DMA und Interrupts 
und eben einen Kernel-Treiber, der das handlen kann.

> Ließe sich nicht über ein Gerätetreiber mehr Echtzeitverhalten

Mit Echtzeit hat das so erstmal nichts zu tun.

> Als Ultima Ratio würde ich eventuell die Daten per Ethernet auf ein
> STM32H7 (Nucleo Board mit 400 MHz Takt) senden und die Daten dort per
> GPIOs ins Auge fassen.

GPIO impliziert "in Software am Pin wackeln". Und da wirst du dich auch 
auf einem 400MHz ARM schwer damit tun, 10.24 MBit rein in Software 
zeitsynchron hinzubekommen. Ein SPI wirst du schon wenigstens dafür 
brauchen.
Gast #5975690
Lesenswert?

Axel S. schrieb:
> Ein SPI wirst du schon wenigstens dafür
> brauchen.

Zu den SPI auf dem Pi habe ich nun zwei verschiedene Sachen gefunden.


1. der Pi unterstützt generell nur 500kHz als Geschwindigkeit.


2.

Der Treiber spi_bcm2835/spi_bcm2708 unterstützt folgende 
Geschwindigkeiten:

  cdiv     speed          cdiv     speed
    2    125.0 MHz          4     62.5 MHz
    8     31.2 MHz         16     15.6 MHz
   32      7.8 MHz         64      3.9 MHz
  128     1953 kHz        256      976 kHz
  512      488 kHz       1024      244 kHz
 2048      122 kHz       4096       61 kHz
 8192     30.5 kHz      16384     15.2 kHz
32768     7629 Hz ...

für 10.24 Mbit bräuchte ich theoretisch ein cdiv von 24.4140625 ... 
Hmmmm. Müsste man die den Signalgenerator so verändern können, das bei 
10.24 MBit ein ganzzahliges cdiv möglich wird.
#5975709
Lesenswert?

RudolphB schrieb:
> Axel S. schrieb:
>> Ein SPI wirst du schon wenigstens dafür
>> brauchen.
...

> Der Treiber spi_bcm2835/spi_bcm2708 unterstützt folgende
> Geschwindigkeiten:
...
> für 10.24 Mbit bräuchte ich theoretisch ein cdiv von 24.4140625 ...
> Hmmmm.

Siehste. Der nächste Grund, der gegen den RasPi spricht. An einen 
Cortex-M kannst du zumindest im Prinzip einen Quarz deiner Wahl 
dranhängen, der dir die gewünschte, krumme SPI-Taktfrequenz erlaubt. 
Wobei sich dann gleich die nächste Frage stellt, ob du damit auch das 
Ethernet zum Laufen kriegst.

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