Hallo ich schreibe gerade meine Diplomarbeit. Es geht darum einen Videostream per DMA in den Speicher zu schreiben und einzelne Bilder aus dem stream per Ethernet auf einem PC darzustellen.Ich will den Microblaze mit Xilkernel und LwIP lib für die Schnittstelle zum PC nutzen. Das ganze soll auf einem Spartan 3ANDSP1800 realisiert werden. Ich habe mir schonmal die DMA Möglichkeiten angesehen die von Xilinx angeboten werden. Werde einen MPMC mit VFBC Port einsetzen. Als Schnittstelle zu meinen Videosignalen habe ich mir schonmal den Video DMA Controller angesehen, der bei dem VideostarterBoard als OpenSource beiliegt. Hier habe ich die Möglichkeit über ein Register die Startadresse des Videoframes im RAM anzugeben. Wie kann ich jetzt aber sicherstellen, das die Adressen nicht anderweitig (z.B. durch Code,Daten) belegt werden. Erste überlegung war mit malloc() Speicherplatz zu reservieren. Aber stellt malloc() sicher, das der allokierte Speicher direkt hintereinander liegt? habe da schonmal was anderes gehört (z.B. auf Windows oder Linux Systemen). Habe ich nur zuviel Angst? Wie macht ihr sowas? Für eure Antworten vielen Dank!
Mit malloc reservieren, oder statisch ein array deklarieren, wobei ich letzteres bevorzuge im embedded Bereich. Malloc reserviert für den Anwender immer zusammenhängende Bereiche. Ein Betriebssystem mit virtuellem Speicher wirst du ja kaum haben. Von daher probier einfach mal aus.
SeriousSam schrieb: > Anwender immer zusammenhängende Bereiche. Ein Betriebssystem mit > virtuellem Speicher wirst du ja kaum haben. Der Microblaze hat eine MMU und unterstüzt somit theoretisch schon Betriebsysteme wie Linux mit Virtuellem Speicher.
Hi theoretisch schon - praktisch benutze ich aber nur den xilkernel. Aber trotzdem danke für die Anmerkung. @Sam: die statische Variante würde mir auch besser gefallen, der Frame Grabber soll aber universell sprich für unterschiedliche Auflösungen konfigurierbar sein, aus diesem Grund wird erst zur Laufzeit das Video Timing, und die Bildgröße bestimmt/übergeben. Also entweder aussreichend Platz statisch deklarieren oder dann doch malloc... hm mal sehen. ich kann ja auch beides mal probieren. Schöne Feiertage und nen guten Rutsch
Hi Steku! Ich habe meine Diplomarbeit auch mit MicroBlaze gemacht. Ich mußte zwar gefühlte 1000 mal den dämlichen Wizard konsultieren, weil die ISE Werkzeuge noch etwas instabil sind, aber letztendlich hat es gut funktioniert. Ich habe das billige Spartan3A Devboard mit einem XC3S700A verwendet. Von MicroBlaze (Version 7) habe ich nur eine Minimalvariante verwendet (ohne MMU, platzoptimiert, keine Sonderfunktionen). Die Strukturierung hat mir dabei sehr gut gefallen. Man kann VHDL/Verilog Codeblöcke schreiben und gleich in das System einbinden und damit kommunizieren, Register auslesen und schreiben. Dein Einwand mit dem Überschreiben des Speicherbereiches ist durchaus berechtigt. Wenn man das Problem ignoriert, können Code & Daten Deines Programmes überschrieben werden. Ein dynamische Allokierung mittels malloc ist zwar möglich, aber dann mußt Du Deinem VideoGrabber immer die zurückgelieferte Adresse mitteilen. Allerdings ist sowieso das Ausführen von Code aus dem DDR2 Ram mit MicroBlaze extrem langsam, da der Zugriff sehr lange dauert. Ich meine sechs Takte oder so pro Instruktion. Und bei einem DMA Zugriff durch den VideoGrabber mußt Du noch länger warten. Es empfiehlt sich daher, statische RAM-Blöcke des FPGAs für Code & Daten zu reservieren. Falls nicht hinreichend Platz ist, dann würde ich (pro Funktion) unterscheiden zwischen häufig ausgeführtem (zeitkritischem) Code / genutzen Daten und seltener genutzten/zeitunkritischen Programmanteilen. Du kannst dann (falls Du die gnu toolchain zur MicroBlaze-Codeerstellung verwendest) mittels Linker-Script einzelne sections anlegen und auswählen, wo sie liegen sollen. Xilinx hat dafür auch ein graphisches Frontend, das hatte bei mir (ISE 9.3) aber nicht richtig funktioniert. Ich habe das Linker-Script dann komplett selbst geschrieben. Ich würde Dir empfehlen, auch eine eigene section für die DMA Daten Deines VideoGrabbers anzulegen. Das entspräche dann einer statischen Allokierung (eine Ebene tiefer) mit garantierter Adresse im Speicher (die gibst Du ja im Linker-Script an). In meinem Fall habe ich den DDR RAM für Fonts und als Framebuffer verwendet. Code & andere Daten habe ich in die BlockRAMs gequetscht. Achso: Bei mir war auch eine Peripheriekomponente, die direkt aus dem DDR RAM gelesen hat (Grafikkarte). Leider hat die Prioritätsvergabe des PLB (V4.6) nicht wirklich funktioniert. Eventuell solltest Du das genauer untersuchen, wenn Du allgemein unerklärliche Probleme bekommst. Viele Grüße W. Usel
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.