Hallo !
Es ist aergerlich; nun habe ich einen ganzen Tqg mit Fehlersuche
verbracht.
Folgendes .. Ich habe ein FPGA Projekt unter Altium Designer was einiges
an Programmierung erfordert. [Wi uebertragen Daten von Sensoren auf
Speicherkarten].
Es ist es noetig Dateien mittels C zu bearbeiten. Ich moechte mit den
Standardfunktionen fopen, flclose, fwrite, fread etc .. sowohl Dateien
lesen als auch schreiben. Unter Windows. Also nichts spannendes.
Kompilieren funktioniert problemlos, keine Fehlermeldung .. aber
Dateioperationen werden nicht durchgefuert. Es wird nichts gelesen,
nichts geschrieben, er benennt vorhandene Dateien nicht um, garnichts.
Der Compiler schliesst einfach ab.
Woran kann das liegen ?
Wir nutzen Altium Designer in der letzten Version mit seinem Nanoboard
NB2 unter Windows XP.
Das aergerliche ist, dass all mein code unter VC++ naemlich wunderbar
funktioniert, nur nicht unter Altium.
ein Beispiel:
1
#include"stdio.h"
2
#include"stdlib.h"
3
#include"string.h"
4
5
voidmain()
6
{
7
8
FILE*pfile=fopen("C:\\BEISPIEL.txt","w");
9
10
charImage_name[10]="ABCDEFGH";
11
charc;
12
inti=0;
13
14
for(i=0;i<15;i++){
15
c=Image_name[i];
16
fwrite(&c,sizeof(c),1,pfile);
17
}
18
fclose(pfile);
19
20
}
Warum zweimal Slash hinter dem C: ? ->der Compiler vermutet sonst eine
"illegal escape sequence".
Ich hab mir schon die tollsten Sachen ueberlegt .. muss ich vielleicht
vorher ein Dateisystem erzeugen, mounten .. aber das ist doch alles
Muell ...
Bin ratlos
Vielen Dank im Voraus!
> Warum zweimal Slash hinter dem C: ?
Ist das dein erstes C-Programm?
In einen C-String ist ein Backslash ein Escape-Zeichen, damit wird eine
Steuersequenz begonnen (z.B. \r\n). Um einen einfachen Backslash zu
erhalten, brauchst du daher das Escape-Zeichen: \ und anschliessend die
Information, was jetzt kommen soll: \
In der Summe ist das dann \\
Aber zurück zum Thema: kann dein FPGA überhaupt Dateioperationen auf
irgendeinem Datenträger ausführen?
Du hast i.A. nur auf PCs (und nur unter M$ Betriebssystemen ein Laufwerk
C:
Meine FPGAs laufen weder unter M$-DOS noch unter -Windows und haben
deswegen auch kein Laufwerk C:\
> Wir nutzen Altium Designer in der letzten Version mit seinem Nanoboard> NB2 unter Windows XP.
Auf dem Nanonboard läuft XP?
Lies dir doch bitte das entsprechende Kapitel im Handbuch nochmal durch.
Auf dem FPGA des Nanoboard wird bestenfalls ein
Prozessor/Mikrocontroller implementiert, den du dann mit C
programmierst. Ich gelaube nicht, dass es eine XP-Portierung dafür gibt.
> Ich hab mir schon die tollsten Sachen ueberlegt .. muss ich vielleicht> vorher ein Dateisystem erzeugen, mounten .. aber das ist doch alles> Muell ...
Richtig :-o
Chris Kl wrote:
> Das aergerliche ist, dass all mein code unter VC++ naemlich wunderbar> funktioniert, nur nicht unter Altium.
VC++ ---> Müll, nimm GCC oder so, das ist persönliche Einschätzung und
soll mal nicht Gegenstand der Diskussion sein. Also.
> ein Beispiel:>
1
>#include"stdio.h"
2
>#include"stdlib.h"
3
>#include"string.h"
4
>
5
>voidmain()
6
>{
7
>
8
>FILE*pfile=fopen("C:\\BEISPIEL.txt","w");
Mit '\' werden Escape-Sequenzen eingeleitet. Zum Beispiel:
Ohne das '\' vor dem '"' würde das Stringliteral zu früh aufhören. Da
Windows nun blöderweise genau den '\' als Pfadtrenner benutzt, könnte
sowas vorkommen:
1
char*Pfad="c:\nixdorf\blabla";
Nun ist '\n' allerdings ein Zeilenvorschub, der hier aber nicht gewollt
ist, deshalb muss man den '\' selbst auch maskieren, indem man ihn
verdoppelt.
Vorallendingen fang mal mögliche Fehler ab (pfile auf NULL testen, errno
auswerten). Bei Binärdaten muss man unter Windows auch statt Modus 'w'
den Modus 'wb' angeben.
> char Image_name[10]="ABCDEFGH";> char c;> int i=0;>> for (i=0; i<15;i++){> c=Image_name[i];> fwrite(&c, sizeof(c), 1, pfile);> }
Warum so kompliziert?
1
fprintf(pfile,"ABDEFGH");
1
>fclose(pfile);
2
>
3
>}
4
>
Wie gesagt ---> Fehler auswerten und nochmal fragen.
Interessant wäre auch zu wissen, von welcher Laufzeitumgebung wir gerade
reden: Soll das C-Programm auf dem FPGA (d.h., auf einem dort
synthetisierten Prozessor) laufen oder auf einem PC..?
Dann habe ich mich unklar ausgedrueckt: Das kann passieren wenn man 12 h
vor der Kiste hockt.
Ok, worum gehts :
Ich empfange Sensordaten ueber Analog/Digital-Eingänge von einer anderen
Platine, speichere diese vorerst in einem Buffer ab, pruefe
währenddessen ob die Daten bestimmten Kriterien entsprechen und wenn
dass der Fall ist, sollen sie per SPI-Bus Richtung SD-Karte geschickt
werden.
Nun muesste ich eben irgendwie Daten schreiben koennen. Ob nun auf Karte
oder Festplatte ist erstmal fast egal.
***
Nein, ist nicht mein erstes C Programm. Und auch nicht mein zweites. Ich
wollte nur auf 2x Backslash hinweisen und vielleicht einer Frage
zuvorkommen. Es gibt auch Compiler die es anders handhaben. Natuerlich
läuft aufm FPGA (in dem Fall Nios) kein BS, aber wenn man bischen
nachdenkt kommt man eventuell drauf dass aufm Rechner XP läuft und das
Nanoboard per USB dran (am Rechner..) hängt.
Ich hab auch ohne direkte Pfadangabe versucht Dateien zu schreiben (also
nur den Dateinamen angegeben), standardmässig sollte die Datei dann im
Projektverzeichnis landen.
Warum sollte ich keine Dateioperationen auf Datenträgern ausfuehren
koennen, es sind doch Standard C Funktionen?
Warum wird dann in allen Application Notes auf diese Funktionen
hingewiesen ? Im Tutorial und auf der Altium Seite gibts sogar Beispiele
mit diesen Funktionen. Leider bringen diese bei mir auch kein Ergebnis.
Ich hab keinen Ansatz derzeit.
***
Der Beispiel Code oben ist einfach nur getippt, damit klar wird was ich
machen will. Deswegen fang ich da keine Fehler ab. Und deswegen schreib
ich auch nur ne .txt Datei. und keine binäre.
Alles klar ?
Hm, warum spart sich das VC++ dann ?
Oder ruehrt das daher dass dort eine Pfadangabe auch direkt als solche
interpretiert wird, während normalerweise der Compiler einen String
erkennt?
jaja das VC++ Muell ist wurde schon gesagt, ich habs nebenher halt immer
noch laufen.
Danke fuer die Antworten bisher
Frage uebersehen : Programm läuft aufm Softcore (Nios). Daten landen
aufm Rechner.
Das steht aber im kernigen Ritschie drin ;-)
> Es gibt auch Compiler die es anders handhaben.
Nein, aber es gibt Betriebssysteme, die das anders handhaben.
> aber wenn man bischen nachdenkt> kommt man eventuell drauf dass aufm Rechner XP läuft
Ja, wenn ich ein wenig nachdenke komme ich auf so allerhand ;-)
Ok, morgen weitere Ergebnisse wenn ich wieder auf Arbeit bin.
Ich hab leider kein Nanoboard zuhause rumliegen :)
Also dann muss ich es wohl anders formulieren :
"Was muss ich tun wenn ich ein Array vollgestopft mit Daten vom FPGA auf
einen Datenträger schreiben moechte ?"
Was habe ich bisher getan : Platine gebaut die Daten vom Sensor ans
Nanoboard liefert, mit Editor entsprechende Schaltung fuer den FPGA
programmiert, C-Programm geschrieben, Daten eingelesen.
Quelltext in seiner unsagbar schoenen Arbeitsversion gibts auf Wunsch,
höhö.
Was ich bisher weiß :
vorhandene Datenträger : Festplatte, SD Karte
Dateisystem auf Datenträgern : existiert(NTFS,FAT) (beide sind
formatiert, partitioniert und auch teilweise beschrieben)
Prozessor: nios II, implementierter Softcore 32bit-RISC zur Zeit
TSK3000
Hardware : Nanoboard NB2, hängt per USB am Rechner.
Ich konnte keine Statements in Datenblättern oder online finden, welche
die Verwendung von Funktionen fuer Dateioperationen wie fopen etc.
untersagen/ausschliessen oder in Bedingung stellen.
Vielleicht bin ich ja auch komplett auf dem Holzweg und jeder gestandene
Embedded-systems Ingenieur lacht sich schlapp, weil hier ein Praktikant
im 5. Studienjahr mit C Funktionen Daten aufn Rechner schieben will. Ich
bin nunmal auch neu in Altium, so schnell wächst man da auch nicht rein.
Es ist ein Prozess und ich werde ihn durchlaufen und lernen.
Wie wuerdet ihr denn bei sowas vorgehen, welche Moeglichkeiten gibts ?
"Das steht aber im kernigen Ritschie drin ;-)" <- den hab ich nich
verstanden. Aber vielleicht bin ich auch zuviel E-Techniker und zuwenig
Informatiker.
> "Das steht aber im kernigen Ritschie drin ;-)"
Kernighan & Ritchie "Programmieren in C"
Das Standardwerk für C-Programmierer,
erhältlich in jeder gut geführten Buchhandlung und Bibliothek
> "Was muss ich tun wenn ich ein Array vollgestopft> mit Daten vom FPGA aufeinen Datenträger schreiben moechte ?"
Wo sind denn die Daten?
Sind die schon in einem Array auf dem XP-Rechner,
oder müssen die erst noch vom FPGA zum PC transportiert werden?
> die Verwendung von Funktionen fuer Dateioperationen wie fopen etc.> untersagen/ausschliessen oder in Bedingung stellen.
Du hast falsch gesucht: fopen() selber gibt dir die Information, ob du
mit dem zurückgegebenen Zeiger was machen kannst, oder ob das Öffnen der
Datei nicht funktioniert hat (wie gesagt über den NULL-Pointer).
Hallo,
ihr diskutiert über Sachen die hier völlig uninteressant sind.
Dieser Code wird nie auf Nanoboard laufen weil Du hier nie
das Nonoboard initialisiert hast. Ich würde mir mal die Beschreibung von
Altium durchlesen.
Du mußt ein FPGA Projekt anlegen. Dann mußt Du Dir Graphisch das
Nanoboard mit den gewünschten Verbindungen kreieren.
Dann kannst Du ein C- Modell erstellen und das dem Projekt hinzufügen.
Solltest Du aber über Altium copilieren.
Im Code mußt Du aber auch initialisieren damit der FPGA überhaupt weiß
was Du willst.
Wenn Du einen solchen Code schreibst mußt Du natürlich vorher einen
Prozessor übertrage der das verarbeiten kann. Sind mehrere in Altium
Bibliothek vorhanden.
Du siehst das hier zunächst mal themen um Backslash usw. Tralala sind.
Aber vorher viel lesen.
noch so n Willi hier.. man.
Hast du ueberhaupt alles gelesen bisher ?
FPGA Projekt - Schaltung bzw. OpenBus-Beschreibung - Embedded Project
(inklusive Software Platform und C-Quelltext) ist alles schon vorhanden.
Das Problem ist prinzipieller Natur, ich wollte ein paar Vorschlaege
hoeren wie man prinzipiell Daten vom FPGA auf einen Datentraeger
schreiben kann.
Und ich werde mit Sicherheit nicht
1
Graphisch das Nanoboard mit den gewünschten Verbindungen kreieren.
Ich bin froh dass das Nanoboard hier aufm Tisch steht.
Nicht nur graphisch.
Das mit dem Nullpointer hoert sich nach einer brauchbaren Richtung an.
Wenigstens was.
> Wenigstens was.
Du kannst eigentlich nicht mehr erwarten, weil du immer noch nicht
mklargestellt hast, bis wohin du die Daten schon transportiert hast :-/
> prinzipiell Daten vom FPGA auf einen Datentraeger schreiben
Man weiß eigentlich noch immer nicht so genau, wo der Datenträger
jetzt eigentlich angeschlossen ist... :-/
Zeichne doch mal ein Bildchen und poste das, dass man einen Überblick
über dein System hat.
Ich interpretiere das bisher Geschriebene so:
AD --> FPGA --> USB --> PC mit Festplatte/Laufwerk
ok ok ok geht noch nicht
Hallo !
Das ist eine gute Idee. Demnaechst wenn ich mehr Luft habe, mache ich
mal ein Blockschaltbild.
Vorher hab ich ein paar eher prinzipielle Fragen/Verstaendnisprobleme :
#define Frage 1: nehmen wir an ich uebertrage eine Datensequenz vom FPGA
(denn dort befinden sich die Daten: in einem Array) ueber SPI Bus auf
eine externe 512 MB SD-Card. Die SD Card ist bereits formartiert und
enthaelt eine Partition, wird auch von Windows als Massenspeicher
erkannt.
Es befinden schon 2 MB an kleinen Beispieldateien darauf.
Der SPI Controller ist ebenfalls initialisiert und konfiguriert.
Wenn ich da jetzt Daten einer bestimmten Sequenz vom Controller Richtung
Karte jage, meinetwegen die Daten einer JPEG-Datei,
was passiert mit den Daten wenn die auf der Karte ankommen ?
Erkennt das FAT-Dateisystem die Sequenz und macht mir eine Datei draus ?
Wenn es die Sequenz nicht erkennt, werden die Daten dennoch in
irgendeiner Form auf der Karte gespeichert ? Wenn ja wie ?
Dass Daten uebertragen werden, vermute ich zumindest, denn mein
(Software-)Logikanalysator zeigt mir an den SPI_Strippen, dass waehrend
der Uebertragung CS auf 0 ist, meine 8 bzw. 16 Datenbits erkenne ich
auch, SPI-CLOCK taktet alles brav ein etc. etc.
Aber was nun ? Auf der Karte tut sich nix.
#define Frage 2: Wenn ich auf die Karte schreibe, dann beschreibe ich
doch Sektoren ?
Woher weis ich zieviele Sektoren ich fuer meine 300kB Arraydaten
beschreiben muss. Werden die Daten an beschriebene Sektoren einfach
rangehangen oder wird die Karte wild durcheinander / sprich fragmentiert
beschrieben ?
#define Frage 3: Altium bietet mir freundlicherweise (fuer faule
Programmierer) schon
fertige Funkionen an; so z.B. eine zum direkten Schreiben von Sektoren :
Das 1.Argument ist mein SD-Treiber, das 2. mein Datenpuffer [wie gross
muss der eigentlich sein ??], das 3. der Startsektor, das 4.die Anzahl
der zu beschreibenden Sektoren.
Die kann ich doch sicher nutzen ??
Hier schliesst sich der Kreis zu #Frage 2..
Alternativ gibt es auch ganz simple "transmit-8bit" Befehle, die gehen
sicher auch aber.. sind doch sicher unpraktisch fuer mein 9600-Elemente
Array ?
Verzeiht all die bloeden Fragen, ich hoffe es findet sich dennoch jemand
mit ein wenig Zeit, der es erklaeren mag.
Danke vielmals.
> was passiert mit den Daten wenn die auf der Karte ankommen ?> Erkennt das FAT-Dateisystem die Sequenz und macht mir eine Datei draus ?
Nein, du selber bist dafür verantwortlich, dass du die SD-Karte so
beschreibst, dass zum Schluss immer noch ein FAT-Dateisystem drauf ist.
> Erkennt das FAT-Dateisystem die Sequenz und macht mir eine Datei draus ?
Die SD-Karte selber ist "nur" ein tumber Speicher. Wenn du die nicht mit
dem PC lesen willst, kannst du auch irgendwas drauf schreiben, dann mußt
du keine FAT anlegen und verwalten.
Wenn du aber eine Datei schreiben willst, dann mußt du selber die FAT
verwalten. Das macht nicht die Karte.
> Werden die Daten an beschriebene Sektoren einfach rangehangen oder> wird die Karte wild durcheinander / sprich fragmentiert beschrieben ?Du selber addressiert die Sektoren, also bestimmst du selber, was wo
landet.
> fertige Funkionen an; so z.B. eine zum direkten Schreiben von Sektoren
Wenn schon solche "halbfertigen" Funktionen da sind, gibt es dann nicht
gleich die "ganz fertigen", wo du einfach auf ein FAT Dateisystem
aufsetzen kannst? Was steht im Manual?
Hallo,
nachdem ich nun erfolgreich das Dateisystem auf der Sd-Karte erstellen
und mounten kann .. (die Frage bleibt weiterhin bestehen : MUSS ich das
denn ueberhaupt noch ? Die Karte hat doch schon FAT 16 )
.. habe ich nun ein Problem beim Erstellen einer Datei.
1. Variante: Datei existiert, zum Schreiben oeffnen:
1
fd=open("/sdcard/neww.txt",O_RDWR);
Der Filedeskriptor liefert mir -1 zurueck. Fehler.
Der errno - Fehlercode ist 2, ich habe mich trotz vieler
unterschiedlicher (und abenteuerlicher Tabellen) fuer die von Altium
entschieden, d.h. :
" ENOENT 2 /* No such file or directory */ "
2. Variante.
Ob die Datei existiert is wurscht, wenn nicht soll der Filedeskriptor
neu erstellt werden. Man beachte das zweite Flag.
1
fd=open("/sdcard/neww.txt",O_RDWR|O_CREAT);
Der Filedeskriptor liefert mir nun +7 zurueck. Was soll das denn
bedeuten ??
Und gleich die Frage rangehaengt : ein Rueckgabewert von 0 kennzeichnet
den erfolgreichen Vorgang (hier)?
Der errno Wert ist nun 5!!
Laut Tabelle : " EBADF 5 /* Bad file number */ "
Kann mich jemand aufklaeren.
Danke
Und falls ich es schaffe diese Datei anzulegen, dann kann ich doch mein
Array auch direkt darin abspeichern oder ?
Und ich muss nicht extra blockweise meine Daten per SPI ubertragen ?
Sprich ich kann auf einer "hoeheren Ebene", also auf der Ebene von
Dateioperationen arbeiten ?
Soviele Fragen ..