www.mikrocontroller.net

Forum: PC-Programmierung Zuweisung richtig lesen


Autor: Schwammkopf (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, hallo ein code aufgebrummt bekommen den ich an einigen stellen 
nicht nicht richtig enziffern kann :(.

Dieser code soll den DMA tranfer FPGA -> PCI-> DMA->..... regeln. Diese 
ganze hardware/Stecker ist auf einer karte (Ics554). Da irgendetwas am 
tranfer der daten nicht stimmt soll der code angeguckt werden.

Unteraderen funktionen gibt es eine fkt: savefile.
Zu der ich einige fragen habe.

hier ein kleiner ausschnitt.


void saveFile (ULONGLONG** rbuf, int quantity, int capture_mode){
                       .
                       .
div = (capture_mode == ICS554_CAPTURE)?1:4;
// was bedeutet in dieser Zuweisung ?1:4  ????

hab ein PDF von dieser funktion erstellt die gelb markierten abschnitte 
verstehe ichnoch nicht richtig. Wäre echt super wenn mir einer helfen 
könnte danke.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> div = (capture_mode == ICS554_CAPTURE)?1:4;
> // was bedeutet in dieser Zuweisung ?1:4  ????

Das ist eine Kurzschreibweise von

if (capture_mode == ICS554_CAPTURE)
  div = 1;
else
  div = 4;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schwammkopf schrieb:

> div = (capture_mode == ICS554_CAPTURE)?1:4;
> // was bedeutet in dieser Zuweisung ?1:4  ????

Das ist die C-Kurzform für
  if( capture_mode == ICS554_CAPTURE )
    div = 1;
  else
    div = 4;

Den ?: Operator findest du in jedem grindigen C-Buch

Autor: Schwammkopf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ging aber flott. Zwei Moderatoren nach einander was für ein luxus 
;-).

danke. Das mit dem c-buch weis ich ja auch nur man muß ja auch wissen 
nach was man sucht. ;-)

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das ist der Fragezeichenoperator und ersetzt eine if-Abfrage. Die von 
Dir gepostete Zeile würde mit if-Abfrage so aussehen:
if (capture_mode == ICS554_CAPTURE)
{
   div = 1;
}
else
{
   div = 4;
}

Was verstehst Du an den fprintf-Aufrufen nicht? Ein Shift um 16 nach 
rechts (>> 16) ist gleichbedeutend mit einer Division duruch 65536, ein 
Rechtsshift um 32 mit einer Divisin durch 2^32 und ein Rechtsshift um 48 
mit einer Division durch 2^48.

Gruß

Autor: Willi S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ist es! Das ist die Kurzform einer If-Abfrage! Ist nicht allzu sehr 
verbreitet, aber ich finde sie recht praktisch.

Autor: Schwammkopf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich bins wieder.

Hänge wieder an einem Problem. Es geht darum einen kontinuierlichen DMA 
Datentransfer zwischen der bereits genannten Hardwareanordnung um 
genauer zu sein den Transfer der Daten zwischen:
FPGA -> PCI-> DMA(Buffer)-> festplatte zu gewerleisten.

Der FPGA(ICS554) erzeugt mit hilfe eines Zählers, zahlen die 
anschließend
auf der Platte abgespeichert werden sollen.
Momentan funtioniert das so: (kurze Zusammenfassung)
//////////////////////////////////////////////////////////////////////// 
///
HANDLE            hDevice = INVALID_HANDLE_VALUE;
ULONGLONG*        rbuffer12[100];
ULONGLONG*        rbuffer34[100];


main()
{
  hDevice = open("/dev/ics554-1", O_RDWR);
.
.
.
BytesToRead = bufferLength12 * sizeof (ULONGLONG);
// BytesToRead = (int(4Byte) *  8Byte) = 32Byte
.
.
while(i!=lauf){
rbuffer12[i] = (ULONGLONG *) ics554AllocateDmaBuffer 
(hDevice,BytesToRead);
i++;
}
i =0;
.
while(!kbhit && i!=lauf) //  solange taste nicht gedrückt
 {
   temp = ICS554_FIFO1_SPACE;
  .
  .
   if (0 > read (hDevice, rbuffer12[i], BytesToRead))
   {perror("read12[i]");}
        .
        .
   temp = ICS554_FIFO2_SPACE;
  .
  .
   if (0 > read (hDevice, rbuffer34[i], BytesToRead))
   {perror("read34[i]");}

  }
  // saveFile speichert von DMAbuffer auf festplatte//
  saveFile ((ULONGLONG**) rbuffer12, bufferLength12, 
BoardControl1.mode);
  saveFile ((ULONGLONG**) rbuffer34, bufferLength34, 
BoardControl1.mode);
}
//////////////////////////////////////////////////////////////////////// 
///

wobei ich Schwierigkeiten habe ist, daten wie oben beschrieben ohne 
jegliche Verzögerung vom hDevice auf die Platte zu bringen.

Hab da was von Memory Mapping gelesen?? Dadurch kann man ja einen 
Bestimmten RAM Bereich reservieren um dann auf die Platte zu speichern.
Kennt einer das verfahren oder gibt es eventuell was anderes??

bin für jeden tipp dankbar.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schwammkopf schrieb:

> wobei ich Schwierigkeiten habe ist, daten wie oben beschrieben ohne
> jegliche Verzögerung vom hDevice auf die Platte zu bringen.

Dann wirst du nicht umhin kommen, das Schreiben auf die Platte mit in 
die Leseschleife zu packen.

> Hab da was von Memory Mapping gelesen?? Dadurch kann man ja einen
> Bestimmten RAM Bereich reservieren um dann auf die Platte zu speichern.

Die Grundsatzfrage lautet: Worin bestehen deine 'Schwierigkeiten'. Denn 
eines muss klar sein. Das Schreiben auf die Platte dauert seine Zeit. 
Und es ist ziemlich unerheblich, wie und wann du das machst. Der 
Zeitbedarf für das eigentliche Schreiben von 1Mb auf die Platte zu 
schreiben ist immer gleich groß. Man kann natürlich diese Zeit zb in 
mehrere Abschnitte aufteilen und mit dem DMA-Lesen ineinander verweben. 
Aber grundsätzlich ist meistens die Devise: soviele Daten wie möglich in 
einem Rutsch schreiben, damit der Verwaltungsoverhead möglichst klein 
wird.

Autor: Schwammkopf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja hab ich mir auch so vorgestellt, dass man während dem lesen 
gleichzeitig schreiben(platte) muß. Nur wie das anstellen muß ka.

So wie ich den Code verstehe, werden immer eine liste bzw. file mit in 
diesem fall:( 2048(ULONGLONG) x i(files) ) Werten auf einmal gelesen:

   if (0 > read (hDevice, rbuffer34[i], BytesToRead))
   {perror("read34[i]");}

und nach i durchläufen auf die platte geschrieben.

Was ich nicht weiß ist, wie kann  man das lesen und schreiben 
aufeinander synchronisieren?? ohne Datenverluste bzw. ohne das der 
lese-pointer den schreib-pointer überholt weil ja auf den RAM schneller 
geschrieben werden kann als auf??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schwammkopf schrieb:
> ja hab ich mir auch so vorgestellt, dass man während dem lesen
> gleichzeitig schreiben(platte) muß. Nur wie das anstellen muß ka.

Da gehe ich doch davon aus, dass die read Funktionen zwischenspeichern 
werden, was du nicht abholst.

Wo liegt dann das Problem, ausser dass dein ursprüngliches Programm 
schon eine Fehlkonstruktion war, denn wie du mit nur einem i darüber 
buchführen willst, wiviele Bytes aus 2 unterschiedlichen Kanälen 
ankommen, ist mir nicht ganz klar.

  while(!kbhit &&
         i != lauf ) //  solange taste nicht gedrückt
  {
    temp = ICS554_FIFO1_SPACE;
  .
  .
    readBytes = read( hDevice, rbuffer12, BytesToRead );
    if( readBytes < 0 )
      perror("read12[i]");
    else
      saveFile ((ULONGLONG**) rbuffer12, readBytes, BoardControl1.mode );

        .
        .
   temp = ICS554_FIFO2_SPACE;

   readBytes = read( hDevice, rbuffer34, BytesToRead );
   if( readBytes < 0 )
     perror("read34[i]");
   else
     saveFile ((ULONGLONG**) rbuffer34, readBytes, BoardControl1.mode );

  }

Autor: Schwammkopf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die schleife war eigentlich so gedacht, dass nach einer vordef. Anzahl 
von cycles, die Werte die aus dem File "hDevice" gelesen wurden, erst 
dann gespeichert werden sollen.


while(i < cycles && !kbhit)
{
 temp = ICS554_FIFO1_SPACE;
  .
  .
   if (0 > read (hDevice, rbuffer12[i], BytesToRead))
   {perror("read12[i]");}
   .
   .
   .i++;
}
// dann speichern auf platte.

saveFile(..,..,..); //

Mit i wähle ich nur den Speicherort(DMA-Buffer), wo die Werte vom 
hDevice hin müssen.  // da ULONGLONG*    rbuffer12[100];

Mein Problem ist dabei dieses: Es wurde ein Timer gestartet der eine 
Zahl Inkrementiert und diese mit hilfe des hDevice bzw, DMA auf die 
Platte gelangen sollen. Da die Werte inkrementiert werden soll ja 
eigentlich auch eine Folge von Zahlen im ,gespeicherten-file, auf der 
Platte wieder zufinden sein. Wenn ich allerdings. Die Speicherstelle 
wechsele, dann kriege ich einenen sprung in der Zahlenfollge.
z.B.

//rbuffer[i]
1
2
3
4 <- *
//rbuffer[i+1]
10 <- hier der sprung
11
12
14

warum passiert das?? Liegt das an dem saveFile(..,..,..);? also an der 
Art des speicherns // der code ist oben als PDF angehangen.
oder dauert der Schleifendurchlauf zu lange.
Angestrebt ist auf jedenfall ein kontinuirlicher Zahlenstrang also ein 
durchgehender Datentransfer von perepherie->DMA->RAM->Platte

RAM weil man so einen Puffer schaffen kann zwischen DMA->Platte.


ich hoffe diesmal war ich etwas genauer mit meinem Problem

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.