Hallo Mikrocontrollerfreunde, ich brauche mal eure Hilfe. Ich habe das DE2-Development-Board von Altera mit einem Cyclone II EP2C35 und Config.-Device EPCS16 drauf. Darin habe ich ein Nios II Prozessor System implementiert und dafür eine C-Anwendung geschrieben. Das läuft als Testvariante (.sof-Datei über Byteblaster auf Board laden und anschließend Software mit der Nios IDE starten) wunderbar. Nun habe ich mir auch eine volle Lizenz besorgt, um die Anwendung auch nach Abschalten der Betriebsspannung auf dem Board zu behalten. Allerdings ist mir noch völlig unklar, wie man den Prozessor und die Anwendung auf einmal auf das Board läd, so dass das Programm gleich nach anlegen der Versorgungsspannung losläuft. Welche Datei enthält die Software für dauerhaftes Draufladen? Wo muss die Software hingeschrieben werden? In den On-Chip-ROM? In das Confg.-Device? Eines von beidem wäre wichtig, da ich bei Erfolg selbst eine Cyclone II-Platine bauen will, die außer den beiden Chips (EP2C8 und EPCS4) und ein paar Schaltern, LEDs, Steckern nichts enthalten soll (kein Flash-ROM oder zusätzlichen RAM). Ich habe bisher erfolglos versucht, das Problem mit dem Flash Programmer der NIOS IDE zu lösen. Damit schreibt man angeblich das Programm in das Config.- Device. Dazu habe ich im Nios-System einen EPCS-Controller eingefügt. Hoffe, das war richtig. Schien mir aber logisch, damit der Prozessor auf das Config.-Device zugreifen kann. Jedenfalls bringt der Flash Programmer immer folgende Meldungen: +++++++++++++++++++++++++Fehlermeldung++++++++++++++++++++++++++++++ **** Build of configuration Debug for project nimmde2 **** make -s all includes Linking nimmde2.elf... /cygdrive/c/Programme/TI/Altera/Nios II Design Suite/nios2eds/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2- elf/3.4.1/../../../../nios2-elf/lib/mno-hw-mul//libsmallc.a(writer.o)(.t ext+0x20): In function `_write_r': /build/nios2eds-gnutools-win32-7.2/bin/nios2-gnutools/src/newlib/newlib/ libc/reent/writer.c:58: warning: warning: write is not implemented and will always fail /cygdrive/c/Programme/TI/Altera/Nios II Design Suite/nios2eds/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2- elf/3.4.1/../../../../nios2-elf/bin/ld: region epcs_controller is full (nimmde2.elf section .text). Region needs to be 12432 bytes larger. /cygdrive/c/Programme/TI/Altera/Nios II Design Suite/nios2eds/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2- elf/3.4.1/../../../../nios2-elf/bin/ld: section .rodata [00121800 -> 00121b4b] overlaps section .text [00121800 -> 0012508f] collect2: ld returned 1 exit status make: *** [nimmde2.elf] Error 1 Build completed in 8.0 seconds ++++++++++++++++++++++++Ende Fehlermeldung+++++++++++++++++++++++++++ auch wenn das Board aus ist. Kann mir nicht vorstellen, das der EPCS16 zu klein für das Programm sein soll. Ist die Vorgehensweise prinzipiell richtig? Was gibt es noch für Möglichkeiten? Angeblich kann man auch den On-Chip-Rom mit einer .hex-File initialisieren. Klingt auch nicht schlecht aber wie mache ich aus meinem Programm so eine .hex-File und wie integriere ich die in die .pof des Systems? Ich bin sehr dankbar für jeden Hinweis. Eine Schritt-für-Schritt-Anleitung wäre natürlich super oder ein Link dazu ... Schon jetzt vielen Dank für eure Hilfe. Grüße von Sebastian
Eine HEX Datei wird automatisch generiert, wenn Du Build anklikst. Diese Datei ist meistens im Verzeichnis, wo auch die .ptf .sof Dateien sind und heist sie dann auch onchip.hex oder ähnlich. Im SOPC-Builde gehst Du auf onchip_inst, machst EDIT und klickst das Kästchen an, wo steht, dass dieser Speicher mit einer bestimmten Hex-Datei initialisiert werden soll... So viel dazu, wenn Dein Programm in den onchip-Speicher passt. Ansonsten speicherst Du Dein Program im EPCS (oder anderen Flash) und kannst auch daraus Deine Anwendung starten. Beim NIOS musst Du dann angeben, wohin die Reset-Vektoren zeigen. Alles in Einem ist es trivial. Wenn Dein Programm aber nicht in den EPCS passt, hast Du ein Problem ;-) Dann schreib doch einen bootloader, der die Daten von UART, SD/MMC-Karte oder Flash liest. Hoffe konnte Dir ein bisschen helfen, Kest
Danke für deine schnelle Antwort. Das klingt alles schon ganz gut. Aber ... Der SOPC-Builder erzeugt eine rom.hex-Datei im NIOS-Verzeichnis. Die enthält ja aber nicht das Programm, das ich mit der NIOS IDE geschrieben habe. In meinem Softwareprojektverzeichnis befindet sich keine .hex-Datei. Wie erzeuge ich aus meinem Programm eine .hex-Datei? Wie und mit welcher Software schreibe ich mein Programm (in welcher Datei-Form?) in den EPCS??? (Schritt für Schritt). Komme noch nicht wirklich weiter.
Wenn Du in der NIOS IDE dem Nios sagst, wohin er das Programm ablegen soll (System Library Propertys) und da onchip_mem anwählst (Program memory, ...), dann generiert er diese HEX Datei auch im gleichen Verzeichnis. Um ans EPCS ranzukommen (über JTAG) musst Du erst EPCS instaniieren. Dann kommst Du auch mit Flash-Tool (über IDE) da ran. Dies ist aber etwas komplizierter... Allerdings, wird dabei auch POF Datei erstellt, die lädst Du dann über Active Serial rein (so wie immer, nehme ich an). Dann ist automatisch alles drin. Kest
Ich bins mal wieder. Vielen Dank für deine bisherigen Hinweise. Allerdings lösen die mein Problem noch nicht. Ich kann jetzt schon die C-Anwendung in Form einer rom.hex-File mit in die NIOS-POF einbinden. Die Fehlermeldung mit dem zu kleinen EPCS kam daher, dass ich die Anwendung in den System-Properties (NIOS-IDE) in den EPCS-Controller schreiben wollte, was anscheinen so nicht funktioniert. Jetzt habe ich herausgefudne, dass das mit dem Flash-Programmer funktioniert, indem man in den Properties das Programm in den RAM legt und den Reset-Vektor auf den EPCS-Controller zeigen lässt. Das hab ich auch schon hinbekommen, ABER: Auf meinem Zielsystem habe ich nur OnChip-RAM oder/und ROM. Da passt mein Programm aber auch in Form einer .hex-File oder wie oben mit Flash-Programmer beschrieben, nicht rein. Gibt es eine Möglichkeit, das C-Programm dirkt in den EPCS4 zu schreiben und es von dort auszuführen, ohne dass es im RAM/ROM des NIOS liegt? Ich gehe mal davon aus, dass in den EPCS4 mehr reinpasst als in den On-Chip-RAM/ROM. Bisher kann ich (auf dem EP2C35 mit ext. SRAM) experimentell das Programm im RAM platzieren und den Reset-Vektor auf den EPCS zeigen lassen. Dann schreibt er es auch in den EPCS und startet es auch von dort. Aber hier habe ich wie gesagt extern genug RAM, um darin das Programm abzulegen. Das ist auf meinem Zielsystem nicht der Fall. Kann ich das Programm also direkt in den EPCS4 schreiben und von dort starten (ohne, dass es in meinem RAM liegt, da der zu klein ist)???
Sebastian Haschke wrote: > Gibt es eine Möglichkeit, das > C-Programm dirkt in den EPCS4 zu schreiben und es von dort auszuführen, > ohne dass es im RAM/ROM des NIOS liegt? Ich gehe mal davon aus, dass in > den EPCS4 mehr reinpasst als in den On-Chip-RAM/ROM. Dazu muss man das EPCS mittels eines eigenen IP linear in den Avalon Addressraum reinmappen. Mit ALTERA Bordmitteln geht das nicht. Jedoch bist du nicht der Erste mit der Idee. In der 'Post your own IP' section im niosforum hat schon jemand ein 'EPCS Virtual Memory' veroeffentlicht. Ich habe es jedoch selbst noch nicht ausprobiert. Du findest das Forum unter http://www.niosforum.com/ Cheers, Roger
@Sebastian Haschke (ti-bastler): okay, ich glaube, ich verstehe jetzt, was Du meinst. Ich würde so vorgehen: 1.) EPCS-Controller im SOPC einbinden Damit kannst Du aus und in den EPCS lesen/schreiben. 2.) Aus NIOS aus, mit NIOS -> Tools -> Flashprogrammer kannst Du dann belibige Dateien, in den EPCS an eine bestimmte Adresse schreiben. Somit kannst Du dann dein Program dahin verfrachten (in welcher Form das Programm liegt, weis ich jetzt aus dem Kopf nicht, aber irgendwas mit .HEX oder wie auch immer) 3.) Dann solltest Du die Dokus von Altera lesen (EPCS Cotntroller, Bootloader und so weiter und so fort). Dann schreibst Du so einen Bootloader, der Dein Programm aus dem EPCS in dein RAM lädt und dann startet. Ich habe sowas nur teilweise gemacht, wird aber nicht schwer sein -- halt Fleißarbeit. Mit dem Bootloader kannst Du dann belibige Programme aus dem EPCS laden und ausführen. Grüße, Kest p.s.: > Auf meinem Zielsystem habe ich nur OnChip-RAM oder/und ROM. Da passt > mein Programm aber auch in Form einer .hex-File oder wie oben mit > Flash-Programmer beschrieben, nicht rein. das habe ich nicht verstanden :-o Was heißt "auch in Form einer .hex Datei"?
Danke für eure Antworten. Über den 'EPCS Virtual Memory' werde ich mich mal informieren. Ich habe nicht genügend Platz um das Programm in den On-Chip-Memory (egal ob RAM oder ROM im FPGA) zu laden weil es 15 kByte groß ist und in den EP2C8 nur 9 kByte On-Chip-Memory reinpassen. Gibt es eine Möglichkeit, das Programm direkt aus dem EPCS Config. Device zu laden (so wie aus einem EEPROM)? Wenn ich das mit dem 68k von Motorola vergleiche, habe ich da ja mein Programm direkt in den EEPROM geschrieben und es direkt von dort mittels Resetvektor ausgefürt. Genau so was brauche ich (allerdings mit dem EPCS als Speicher). Ich gehe immer noch davon aus, dass in den EPCS mehr reinpasst als in den FPGA selbst. Nur wie? Das mit dem Bootloader klingt sehr kompliziert und scheint mein Problem auch nicht zu lösen, da der das Programm auch nur in den RAM kopiert und dann ausführt. In meinen RAM passt das Programm aber leider nicht rein. Hat noch jemand eine Idee?
MAn kann das Program direkt aus dem Flash ausführen, egal ob EPCS oder andere. Dies habe ich schon oben gesagt, aber scheinbar hast Du es nicht ausprobiert? Wenn Du EPCS Controller im SOPC integrierst, dann kannst Du auch bei NIOS IDE (Propertys) auswählen, wo dein Stack liegt, wo Dein Read-Only Speicher und wo der Programspeicher liegen soll. Da wählst Du halst statt onchip, Epcs aus und fertig! Melde Dich, wenn es klappt. Grüße, Kest
Hallo Kest, das habe ich so schon vor meiner ersten Fragestellung ausprobiert und dabei die oben stehende Fehlermeldung bezüglich zu wenig Platz im EPCS erhalten. Funktioniert so also nicht.
Ich hab gerade im Cyclone Handbuch gelesen, dass man eine Kompression der POF-File einstellen kann. Die Dekompression macht der Cyclone dann beim Laden selbst, in seinen RAM, von dem ich zu wenig habe :-(. Würde das bei 12 kByte, die an Programmspeicher im EPCS fehlen, was bringen oder verschiebe ich damit den Platzmangel nur wieder? Denn wohin soll er es entpacken, wenn nicht genug RAM drin ist ...
ich fürchte, das kannst Du dann vergessen. WEnn es nicht genug Speicher auf dem Board gibt, dann ist es eben so. Die Kompression kannst Du zunächst mal für FPGA-Konfiguration einstellen, vielleicht reicht es schon aus, dass DEin Program noch reinpasst. Was ist das überhaupt für Programm, was Du da reinflashen möchtest? Hast Du viele Printf's? Hast Du "small C-Library" angeklickt? Vielleicht gibt es anders wo Einsparmöglichkeiten. Grüße, Kest
Kest wrote: > MAn kann das Program direkt aus dem Flash ausführen, egal ob EPCS oder > andere. Mit dem standard EPCS Controller geht das eben nicht. Der EPCS Controller hat nur Platz fuer einen Bootloader in einem M4K, welcher standardmaessig die Software vom EPCS in ein RAM kopiert. Cheers, Roger
Sebastian Haschke wrote: > Ich hab gerade im Cyclone Handbuch gelesen, dass man eine Kompression > der POF-File einstellen kann. Die Dekompression macht der Cyclone dann > beim Laden selbst, in seinen RAM, von dem ich zu wenig habe :-(. Würde > das bei 12 kByte, die an Programmspeicher im EPCS fehlen, was bringen > oder verschiebe ich damit den Platzmangel nur wieder? Denn wohin soll er > es entpacken, wenn nicht genug RAM drin ist ... Komprimiert wird nur der Bitstream. Unkomprimiert braucht der beim EP2C8 etwa die haelfte deines EPCS4. Also haettest du worst case knapp 256KB fuer deinen code uebrig. Cheers, Roger
Hallo Roger, die 256kB wären bei Komprimierung im EPCS frei für meinen Code. Ich kann sie mit dem Standard-EPCS aber nicht dafür nutzen, richtig? Also kann ich in meinem Fall nur soviel Code reinschreiben, wie in den On-Chip-Memory passt, oder? Mal noch ne andere Frage: Sieht man im SOPC-Builder VOR dem Compilieren/Generieren des Nios-Systems irgendwo, wie viel On-Chip-Memory da rein passt?
Sebastian Haschke wrote: > die 256kB wären bei Komprimierung im EPCS frei für meinen Code. Ich kann > sie mit dem Standard-EPCS aber nicht dafür nutzen, richtig? Also kann > ich in meinem Fall nur soviel Code reinschreiben, wie in den > On-Chip-Memory passt, oder? Genau. Wie gesagt um dein Problem zu loesen schau dich nach IPs wie dem 'EPCS Virtual Memory' um, die Idee ist nicht neu. > Mal noch ne andere Frage: > Sieht man im SOPC-Builder VOR dem Compilieren/Generieren des > Nios-Systems irgendwo, wie viel On-Chip-Memory da rein passt? Nein. Cheers, Roger
Auf http://www.fpga.nl finde ich keinen Link zu IP-Cores. Woher bekomme ich das Teil? Oder gibt es das schon im SOPC-Builder? Da hab ich noch ein "Active Serial Memory Interface" gefunden. Allerdings steht da im Datenblatt auch nur, dass es das Prgramm beim Booten in den RAM kopiert. Stimmt das oder könnte das weiter helfen?
Sebastian Haschke wrote: > Auf > > http://www.fpga.nl > > finde ich keinen Link zu IP-Cores. Woher bekomme ich das Teil? bei http://www.niosforum.com registrieren und dann in die Post-your-own-IP section. > Oder gibt > es das schon im SOPC-Builder? Da hab ich noch ein "Active Serial Memory > Interface" gefunden. Allerdings steht da im Datenblatt auch nur, dass es > das Prgramm beim Booten in den RAM kopiert. Stimmt das oder könnte das > weiter helfen? Das ASMI ist der Vorgaenger des EPCS Controllers. Bringt dir nichts. Cheers, Roger
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.