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
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
-> 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.
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
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.
-> Hast Du schonmal was von Busarbitrierung gehört? -> Siehe [1] Das ist dann aber nicht gleichzeitig sonder koodiniert nacheinander.
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?
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.
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??
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 ?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.