Forum: FPGA, VHDL & Co. Mehrere Microblaze auf eine UART ausgeben lassen


von Andre (Gast)


Lesenswert?

Hallo an das Forum,

ich habe eine Frage bzgl. der Ausgabe mehrere Microblaze in einem SoC. 
Alle CPUs sind an den Processor Local Bus (plb_v46) angeschlossen, 
welche die UART ansprechen. Ich weiss, dass man dies über den 
Einstellungen in den "Software Platform Settings" -> "OS and Libraries" 
->"stdout und stdin" einstellen kann.

Das Problem ist aber dabei, das nur die ersten beiden CPUs eine Ausgabe 
machen. Hab auch schon versucht immer nur zwei gleich gleichzeitig 
ausgeben zu lassen (1-3, 1-4), was auch nicht ging.

Hat jemand eine Lsg dafür?

Gruß
Andre

von Duke Scarring (Gast)


Lesenswert?

Hast Du das ganze mal simuliert? Vielleicht belegen die ersten beiden 
CPUs den PLB zu lange, so das die anderen nicht zum Zuge kommen? Oder 
der UART ist überfordert?
Wieviele Microblaze hast Du denn?
Wenn nur einer was sendet, funktioniert das?
Wie stellst Du sicher, das nicht alle gleichzeitig was über UART senden 
wollen?
Wie kannst Du am Empfänger auseinanderhalten, wenn mehrere Microblaze 
"durcheinander" senden?

Duke

von Uwe (Gast)


Lesenswert?

-> Hab auch schon versucht immer nur zwei gleich gleichzeitig
-> ausgeben zu lassen

Habe jetz keinen Plan von DIESER UART aber warum sollten zwei 
GLEICHZEITIG auf irged etwas zugreifen können !
Versuch mal mit zwei CPUs auf ein RS-Flipflop gleichzeitig zuzugreifen.
Geht selbst bei Dual Port RAM nur lesend.

von Duke Scarring (Gast)


Lesenswert?

Uwe schrieb:
> Habe jetz keinen Plan von DIESER UART aber warum sollten zwei
> GLEICHZEITIG auf irged etwas zugreifen können !
Hast Du schonmal was von Busarbitrierung gehört?
Siehe [1]

Duke

[1] http://de.wikipedia.org/wiki/Arbitrierung

von Lattice User (Gast)


Lesenswert?

Busarbitrierung stellt nur sicher dass ein einzelner Registerzugriff auf 
die Uart funktioniert.

Die Uart braucht hanz sicher mehere Zugriffe um Zeichen zu senden.
Einfachster Fall:
1. Lesen status ob bereit (aka vorheriges Zeichen ist gesendet).
2. Schreiben Zeichen.

Wenn die Uart ohne weitere Massnahmen von mehr als einem Prozessor 
vwerwendet wird kann folgedens passieren:

Prozessor 1:  Liest Status, sieht dass Uart bereit
Prozessor 2:  Liest Status, sieht dass Uart bereit
Prozessor 1:  Schreibt Zeichen
Prozessor 2:  Schreibt Zeichen und überschreibt das von Prozessor 1.

Wenn die Uart einen Fifo hat sieht es etwas anders aus, aber auch da 
kann es schiefgehen, z.B. wenn der Fifo voll ist.

Es muss also eine Softwareveriegelung her, die sicherstellt dass sich 
die beiden Prozessoren nicht in die Quere kommen. Damit kann man dann 
auch dafür sorgen dass Datenpackete oder Textzeilen nicht gemischt 
werden.

von Uwe (Gast)


Lesenswert?

-> Hast Du schonmal was von Busarbitrierung gehört?
-> Siehe [1]
Das ist dann aber nicht gleichzeitig sonder koodiniert nacheinander.

von Klaus F. (kfalser)


Lesenswert?

Andre schrieb:
> Das Problem ist aber dabei, das nur die ersten beiden CPUs eine Ausgabe
> machen. Hab auch schon versucht immer nur zwei gleich gleichzeitig
> ausgeben zu lassen (1-3, 1-4), was auch nicht ging.

Können 3 oder 4 überhaupt nicht mit der UART sprechen oder nur nicht 
"gleichzeitig" zu 1 oder 2?

von Uwe (Gast)


Lesenswert?

Ich glaub du brauchst nen Mutex bzw. Semaphore . Ohne Koordiniertes 
Verhalten der CPUs kannst du gleich wieder aufhören. Versuch mal mit 4 
Texteditoren gleichzeitig eine bestehende Datei an Verschiedenen Stellen 
zu ändern und speicher dann am Ende alle ab.

von Andre (Gast)


Lesenswert?

Duke Scarring schrieb:
> Wieviele Microblaze hast Du denn?
4 MB sind im SoC

> Wenn nur einer was sendet, funktioniert das?
Ja das geht.

> Wie stellst Du sicher, das nicht alle gleichzeitig was über UART senden
> wollen?
> Wie kannst Du am Empfänger auseinander halten, wenn mehrere Microblaze
> "durcheinander" senden?
Dafür wird der Lösungsansatz von Uwe, mit der Mutex Sinn machen. Oder 
gibt es das irgendwas was dagegen spricht??

von Andre (Gast)


Lesenswert?

Jedoch habe ich noch eine Frage zum Einbinden des Mutex IP-Blocks in das 
System unter dem EDK 10.1.

1. Man verbindet das Mutex mit dem Bus (zb. PLB)

2. Unter "Configure IP-> user"  stellt man die nötige  PLB "Interfaces" 
ein
3. Die Anzahl der nötigen Mutex. 4 weil ich 4 CPUs habe
4. Unter "Addresses->Gernerate Addresses" gedrückt um das Mutex zu 
registrieren.

Müssen die CPUs auch irgendwie mit der Mutex verbunden werden ?

von Duke Scarring (Gast)


Lesenswert?

Nicht das ich Ahnung von Mutex hätte...

Andre schrieb:
> 3. Die Anzahl der nötigen Mutex. 4 weil ich 4 CPUs habe
Aber ich hätte gedacht, das einer reicht, weil Du ja nur einen UART 
hast.

> Müssen die CPUs auch irgendwie mit der Mutex verbunden werden ?
Die sollten natürlich auch Zugriff auf den PLB haben. Wahrscheinlich 
indirekt über OPB.

Duke

von Lattice User (Gast)


Lesenswert?

Andre schrieb:
> 1. Man verbindet das Mutex mit dem Bus (zb. PLB)
>
> 2. Unter "Configure IP-> user"  stellt man die nötige  PLB "Interfaces"
> ein

4 Stück, da 4 CPU's

> 3. Die Anzahl der nötigen Mutex. 4 weil ich 4 CPUs habe

Nein, pro gesharter Resource einen Mutex. Also 1 da nur eine Uart.
> 4. Unter "Addresses->Gernerate Addresses" gedrückt um das Mutex zu
> registrieren.
>
> Müssen die CPUs auch irgendwie mit der Mutex verbunden werden ?

Ja natürlich, Die Mutex müssen per Software bedient werden.

von Uwe (Gast)


Lesenswert?

Ein Mutex kann man sich als Bit im Speicher vorstellen das zu einer 
Bestimmten Datenstruktur gehört (in deinem Fall der UART) auf die 
mehrere Prozesse zugreifen wollen. Ablauf der auf jeder CPU ca. so 
passiert:

1. gucken ob UART_Locked==1
2. Wenn ja gehe zu 1 wenn nein weiter
3. UART_Locked=1
4. mache was mit UART
5. UART_Locked=0

jede CPU arbeitet ihr Programm durch und wenn sie auf den UART zugreifen 
möchte guckt sie nach ob dieser schon benutzt wird also Locked ist. Wenn 
er schon benutzt wird wartet Sie und guckt ab und zu mal nach ob er 
jetzt wieder freigegeben ist. Wenn er freigegeben ist Locked sie ihn 
selber und verbietet damit den Anderen den Zugriff bis sie ihn wieder 
freigibt.

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.