Forum: FPGA, VHDL & Co. Altium Designer und Dateizugriffe mittels C


von Chris K. (chrisch)


Lesenswert?

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
void main()
6
{
7
8
FILE *pfile =fopen("C:\\BEISPIEL.txt", "w");
9
10
char Image_name[10]="ABCDEFGH";
11
char c;
12
int i=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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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

von Sven P. (Gast)


Lesenswert?

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
> void main()
6
> {
7
> 
8
> FILE *pfile =fopen("C:\\BEISPIEL.txt", "w");
Mit '\' werden Escape-Sequenzen eingeleitet. Zum Beispiel:
1
char *String_mit_Anfuehrungszeichen = "Ein \"String\"";
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..?

von Chris K. (chrisch)


Lesenswert?

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 ?

von Sven P. (Gast)


Lesenswert?

Chris Kl wrote:

> Es gibt auch Compiler
> die es anders handhaben.
Nee, wie '\' funktioniert, ist glasklar im Standard verankert.

von Chris K. (chrisch)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Man sollte vor Dateioperationen abfragen,
ob man überhaupt einen gültigen Filepointer zurückbekommen hat:
1
  FILE *pfile;
2
3
  if((pfile = fopen("C:\\BEISPIEL.txt", "w")) == NULL) then { // Nullpointer = Fehler
4
     Fehlerbehandlung();
5
  }
6
  else {
7
     FilepointerVerwenden();
8
  }
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 ;-)

von Chris K. (chrisch)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> "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).

von Willi (Gast)


Lesenswert?

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.

von Chris K. (chrisch)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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

von Chris K. (chrisch)


Lesenswert?

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 :
1
int sdcard_write_sectors( sdcard_t * restrict sdcard, const uint8_t *data, unsigned int lba, unsigned int sectorcount )

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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?

von Chris K. (chrisch)


Angehängte Dateien:

Lesenswert?

So, die Prinzipskizze. Wenn was fehlt Bescheid sagen.

von Chris K. (chrisch)


Lesenswert?

Danke @ Lothar Miller, damit kann ich was anfangen.
Spaeter mehr.

von Chris K. (chrisch)


Lesenswert?

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
1
int main( void )
2
{
3
4
5
              //********** CREATE FILESYSTEM ON SD CARD
6
              
7
8
    printf( "+ Create destination filesystem: " );
9
    if (mkfs("/dev/BLOCKIO_1", "fatfs", 0, "SSAS", false) != 0)
10
    {
11
        FAILED( E_MKFS );
12
    }
13
    printf( "Ok\n" );
14
15
16
17
            //********** MOUNT FILESYSTEM SD CARD
18
19
    printf( "+ Mount source filesystem: " );
20
    err = mount("/dev/BLOCKIO_1", "/sdcard", "fatfs", 1,  MOUNT_FLAG_RDWR);
21
    if (err != 0)
22
    {
23
        FAILED( E_MOUNT );
24
    }
25
    printf( "Ok\n" );
26
27
28
29
       //******** CREATE FILE
30
   int fd=-1;
31
32
   fd = open("/sdcard/neww.txt", O_RDWR);
33
   printf("Filedescriptor: %d\n", fd);          --> returns -1
34
   
35
   // zweite Variante
36
  // fd = open("/sdcard/neww.txt", O_RDWR|O_CREAT);
37
  // printf("Filedescriptor: %d\n", fd);          --> returns 7
38
      
39
      
40
      
41
42
    printf("%d\n",errno);                       --> returns 2 oder 5
43
    //close(fd);
44
45
    FILE *pfile = fdopen(fd, "wb");
46
    char buffer[100];
47
    char a=10;
48
    int i;
49
50
    for (i=0;i=100;i++)
51
    {buffer[i]=a;
52
    if (i==100)
53
    {break;}}
54
55
  fwrite (buffer , 1 , sizeof(buffer) , pfile );
56
  fclose (pfile);
57
  
58
  
59
  }


Ja natuerliche pruefe ich spaeter noch brav den FILE Zeiger. Aber da 
komm ich gerade ja noch garnicht hin.

von Chris K. (chrisch)


Lesenswert?

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 ..

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.