Forum: FPGA, VHDL & Co. Code Problem in C Eclipse NIOS


von Geldesch B. (Firma: haa) (dravr)


Lesenswert?

Hi,
habe meinen C Code in Eclipse für den NIOS eingefügt. Es wurden Fehler 
angezeigt. Z.b wurde conio.h wohl nicht gefunden. Habe ich 
auskommentiert.
Nach stundenlangem suchen habe ich auch meine pow() funktion mit math.h 
auskommentiert und nach weiteren Stunden mein globales 2D array in die 
main gebracht und den funktionen eben seinen Zeiger übergeben.
Auch mein fopen habe ich gestrichen xD
Nun werden keine Fehler angezeigt.
Aber meine Programm geht 3 Funktionen durch und springt dann wieder zum 
Anfang. Und das ohne Schleife xD

Also ich nehme an man muss mit diesem BSP Editor einiges aktivieren um 
z.B. fopen verwenden zu können oder ?
Warum mein Code sich so merkwürdig verhält verstehe aber nicht. Ich 
werde einfach mal alles was global ist ebenfalls in die main verschieben 
..

Vielleicht hat jemand einen Tipp ?

Ich werde mich jetzt mal mit dem BSP Editor beschäftigen..

Danke :D

von Programmierer (Gast)


Lesenswert?

Geldesch B. schrieb:
> . Z.b wurde conio.h wohl nicht gefunde

Das ist ein Windows header. Läuft Windows auf deinem Nios?

Geldesch B. schrieb:
> Also ich nehme an man muss mit diesem BSP Editor einiges aktivieren um
> z.B. fopen verwenden zu können oder ?

Was für ein OS nutzt du denn, welches fopen bereitstellen soll?

von Dirk B. (dirkb2)


Lesenswert?

Geldesch B. schrieb:
> Nun werden keine Fehler angezeigt.

Werden Warnungen (bei höchstem aktivierten Warn Level) ausgegeben?

von Duke Scarring (Gast)


Lesenswert?

Geldesch B. schrieb:
> Also ich nehme an man muss mit diesem BSP Editor einiges aktivieren um
> z.B. fopen verwenden zu können oder ?
Welche Dateien willst Du denn öffnen, auf deinem FPGA?
Und wie soll der da rankommen?
Mir scheint hier noch ein fundamentales Verständnissproblem zu 
existieren.

Programmierer schrieb:
> Das ist ein Windows header. Läuft Windows auf deinem Nios?
Jungspund?
conio ist älter als Windows (aber nicht viel):
https://en.wikipedia.org/wiki/Conio.h

Duke

von Programmierer (Gast)


Lesenswert?

Duke Scarring schrieb:
> conio ist älter als Windows (aber nicht viel):

Ich finde es trotzdem i.O. es als "Windows-Header" zu bezeichnen, denn 
schließlich ist Windows das meistgenutzte System, dessen Compiler diesen 
Header mitliefern. Es verdeutlicht jedenfalls, dass das nicht viel mit 
RTOS zu tun hat.

von Geldesch B. (Firma: haa) (dravr)


Lesenswert?

>Welche Dateien willst Du denn öffnen, auf deinem FPGA?

Eine Textdatei.

>Und wie soll der da rankommen?
Die Textdatei soll einfach im Projektordner vom NIOS liegen und 
irgendwie mitgeladen werden.


>Mir scheint hier noch ein fundamentales Verständnissproblem zu
>existieren.
Ja deswegen muss ich so dumme Fragen stellen xD


>Das ist ein Windows header. Läuft Windows auf deinem Nios?

Nein. Es läuft ein main() Programm.

>Was für ein OS nutzt du denn, welches fopen bereitstellen soll?
Quasi gar keins auf dem NIOS... Also diese main-Schleife...


>Werden Warnungen (bei höchstem aktivierten Warn Level) ausgegeben?
Sehr wichtige Frage. Muss ich mir anschauen ! Vielleicht kann ich so 
weitere Fehler debuggen.


Danke :D
Ich habe meinen einzulesenden Text in ein Array getan xD
Der kann jetzt auch so gelesen werden :D Passt auch.
ABER:
Wie würdet ihr das denn machen ? Wenn ihr eine textdatei hättet und 
diese einlesen wollen würdet auf einem NIOS ?

von Geldesch B. (Firma: haa) (dravr)


Lesenswert?

Oder muss man dann ein kleine Filesystem implementieren in das man die 
textdatei reinlädt ?
Da steht was:
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/entwurf-daten-in-den-flash-speicher-des-esp-ablegen

von Gustl B. (-gb-)


Lesenswert?

Geldesch B. schrieb:
> Wie würdet ihr das denn machen ? Wenn ihr eine textdatei hättet und
> diese einlesen wollen würdet auf einem NIOS ?

Einlesen wovon? Wenn das in einem Speicher fest liegt, dann kannst du 
statisch sagen wo der Text ist. Da brauchst du auch keine Datei sondern 
nur einen Speicherbereich dessen Inhalt als Text interpretiert wird.
Und Text braucht man eigentlich auch nur wenn man etwas für Menschen 
lesbares ausgeben will.
Wenn es auf einem Wechselspeicher liegt der auch von einem PC bequem 
gelesen und beschrieben werden soll dann ist ein Dateisystem sinnvoll.

Edit:
Was willst du denn mit dem Text machen? Warum soll das überhaupt Text 
sein und wieso eine Datei?

: Bearbeitet durch User
von Programmierer (Gast)


Lesenswert?

Geldesch B. schrieb:
> irgendwie mitgeladen werden.

Wie stellst du dir "irgendwie" vor?

Geldesch B. schrieb:
> Nein. Es läuft ein main() Programm.

Das ist kein OS.

Geldesch B. schrieb:
> Quasi gar keins auf dem NIOS... Also diese main-Schleife...

Dann hast du:
Keine Konsole, daher kein conio.h
Keinen Treiber für Speicher und kein Dateisystem, daher kein fopen

Geldesch B. schrieb:
> Wie würdet ihr das denn machen ? Wenn ihr eine textdatei hättet und
> diese einlesen wollen würdet auf einem NIOS ?

Dann würde ich mir erst einmal anschauen was für ein Speicher zur 
Verfügung steht... externer Flash? Festplatte? SD-Karte? Nur der 
Prohrammspeicher selbst? Wie groß ist die Datenmenge? Im Endeffekt wird 
man es sehr ähnlich zu einem "normalen" Mikrocontroller machen...

Geldesch B. schrieb:
> Ja deswegen muss ich so dumme Fragen stellen xD

Wer hat dich auf ein FPGA losgelassen...

von Markus F. (mfro)


Lesenswert?

Das geht schon. Bloß nicht von alleine.

Der NIOS HAL bringt die NIOS Newlib mit (mit den stdio-Funktionen). Wenn 
man die benutzen will, muß man sie natürlich "irgendwo" (an ein 
Dateisystem) anschliessen. Entweder man baut sich was, oder man nimmt, 
was mitkommt: im einfachsten Fall das "read-only zip file system" 
(entsprechendes Kapitel im Handbuch lesen!). Von da aus weitersehen.

von Geldesch B. (Firma: haa) (dravr)


Lesenswert?

>Geldesch B. schrieb:
>> Quasi gar keins auf dem NIOS... Also diese main-Schleife...

>Dann hast du:
>Keine Konsole, daher kein conio.h
>Keinen Treiber für Speicher und kein Dateisystem, daher kein fopen

Ok jetzt komme ich der Sache schon näher


>Was willst du denn mit dem Text machen? Warum soll das überhaupt Text
>sein und wieso eine Datei?

Es handelt sich um OPCODE: bsp:
1
 à` a b¢ @@"A Ðòp
2
char * text= " à` a b¢ @@"A Ðòp";

Simmt man kann diesen ja auch einfach in ein char * -array legen.

--

>>irgendwie mitgeladen werden.

>Wie stellst du dir "irgendwie" vor?
Die Datei wird durch den Compiler zugänglich gemacht und in einen 
Speicherbereich des NIOS geladen xD
Aber ok ich sollte wohl erst verstehen wie der Compiler mit Dateien im 
Ordner umgeht.
---
Gut danke euch für die Antworten ! Es ist wichtig das ich verstehe wie 
der Compiler arbeitet, dann brauche ich mich auch nicht zu wundern wie 
er sich verhält !

von Programmierer (Gast)


Lesenswert?

Geldesch B. schrieb:
> Aber ok ich sollte wohl erst verstehen wie der Compiler mit Dateien im
> Ordner umgeht.

Überhaupt nicht. Der Compiler hat damit sowieso nichts zu tun. Es hat 
etwas damit zu tun, was für Speicher du angebunden hast, was für Treiber 
und Bibliotheken und ggf. was für ein OS du verwendest. Den Compiler 
interessiert es nicht ob "fopen" einen Linux-Syscall absetzt oder z.B. 
eine FAT32-Bibliothek wie FatFs nutzt um auf eine SD-Karte zuzugreifen. 
Du legst fest, welcher Speicher angebunden ist und wie die Software 
das macht. Der Compiler übersetzt nur C-Code in Assemblercode; der weiß 
nichts von Speicher, Dateisystemen, Treibern, OS...

Geldesch B. schrieb:
> Es handelt sich um OPCODE: bsp: à` a b¢ @@"A Ðòp
> char * text= " à` a b¢ @@"A Ðòp";

Codiere das doch besser hexadezimal:
1
const char text [] = { 0x20, 0x12, 0x34, ... };

So kurze Datenmengen kann man problemlos in den Code selber packen. Das 
landet dann direkt im Programmspeicher (RAM?), braucht keine Treiber 
oder OS.

Geldesch B. schrieb:
> Die Datei wird durch den Compiler zugänglich gemacht und in einen
> Speicherbereich des NIOS geladen xD

Und was für ein Speicherbereich soll das sein? Welches Dateisystem liegt 
da? Welche Software-Komponente implementiert das Dateisystem?

von Dirk B. (dirkb2)


Lesenswert?

Man kann auch Dateien über den Linker so mit ins Programm einbinden, 
dass man über eine Adresse (Zeiger) darauf zugreifen kann.

Dann braucht man diese nicht erst in Hexcode oder ähnliches wandeln.

Bei ein paar Byte spielt das aber keine Rolle.

von Geldesch B. (Firma: haa) (dravr)


Lesenswert?

>Entweder man baut sich was, oder man nimmt,
>was mitkommt: im einfachsten Fall das "read-only zip file system"

Interessant Danke. Dadurch habe ich das wiedererkannt:


>>"Altera provides a read-only zip file system for use with the hardware 
abstraction layer (HAL). The read-only zip file system provides access to a simple 
file system stored in flash memory. This file system is suitable for embedded 
software use. The drivers take advantage of the HAL generic device driver 
framework for file subsystems. Therefore, you can access the zip file subsystem 
using the ANSI C standard library I/O functions, such as fopen() and fread()."


>So kurze Datenmengen kann man problemlos in den Code selber packen. Das landet 
dann direkt im Programmspeicher (RAM?), braucht keine Treiber oder OS.

Ja genau danke :D
Allerdings werde ich die Hexa-Notation nicht verwenden, da der Inhalt 
austauschbar sein soll und außerdem sind das wirklich manchmal viele 
Zeichen. Also wenn ich jetzt einen anderen OPCODE testen möchte, wäre es 
zeitaufwändig das erst selber umzuwandeln.
Mit Zeichenverarbeitung in C werde ich das dann einfach lösen. Ja der 
Arbeitsspeicher wird dann wohl benutzt.

>Und was für ein Speicherbereich soll das sein? Welches Dateisystem liegt da? 
Welche Software-Komponente implementiert das Dateisystem?

Das Board Support Package hätte das ja organsieren können. Also 
irgendwas in der Art ist ja wirklich möglich.

>Der Compiler übersetzt nur C-Code in Assemblercode; der weiß nichts von Speicher, 
Dateisystemen, Treibern, OS...

Ok macht Sinn :D Ein Board support package könnte dann dabei helfen 
bestimmte Funktionen bereitzustellen:
C-Code -> Board-Support-Package-> Hardware

von Geldesch B. (Firma: haa) (dravr)


Lesenswert?

Ich habe übrigens meine globalen Variablen und Zeiger in die main 
Funktion gebracht und die Zeiger an die Funktionen weitergeben.
Nun wird der Code fast korrekt ausgeführt !

Es sieht etwas langsamer aus auf der Konsole des NIOS und außerdem fehlt 
ein Zeichen .
Ich habe den Code auch mal 1:1 ( außer alt_printf ) auf meinem PC laufen 
lassen. Da ist er schneller und das Zeichen ist vorhanden xD

Mal schauen . Kann auch daran liegen, dass die Übertragung nicht "so 
gut" ist zur Konsole...

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.