Mehrere Microblaze auf eine UART ausgeben lassen

Gast #2212929
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
Gast #2213875
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
Gast #2214067
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.
Gast #2214266
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.
Gast #2215213
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.
Gast #2218642
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??
Gast #2219085
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 ?
Gast #2219666
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
Gast #2219988
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.
Gast #2220093
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.

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