3 Replies Latest reply on Oct 1, 2013 1:02 AM by gayathri.vasudevan

    Streamer bitrate different from actual transfer rate

    kaiyu.lin

      Hi!

         

      I've build an application in C# wich takes data from a Spartan6 FPGA and put them into a txt file.

         

      I am testing the slave fifo interface (32 bit).

         

      While the Streamer shows a bitrate of 180MB/s, the actual transfer rate is around 8MB/s.

         

      This is the C# code of Streamer that show the bitrate:

         

       public unsafe void XferData(byte[][] cBufs, byte[][] xBufs, byte[][] oLaps, ISO_PKT_INFO[][] pktsInfo)

         

              {

         

                  int k = 0;

         

                  int len = 0;

         


         

                  Successes = 0;

         

                  Failures = 0;

         


         

                  XferBytes = 0;

         

                  t1 = DateTime.Now;

         


         

                  for (; bRunning; )

         

                  {

         

                      // WaitForXfer

         

                      fixed (byte* tmpOvlap = oLaps[k])

         

                      {

         

                          OVERLAPPED* ovLapStatus = (OVERLAPPED*)tmpOvlap;

         

                          if (!EndPoint.WaitForXfer(ovLapStatus->hEvent, 500))

         

                          {

         

                              EndPoint.Abort();

         

                              PInvoke.WaitForSingleObject(ovLapStatus->hEvent, 500);

         

                          }

         

                      }

         


         

                      if (EndPoint.Attributes == 1)

         

                      {

         

                          CyIsocEndPoint isoc = EndPoint as CyIsocEndPoint;

         

                          // FinishDataXfer

         

                          if (isoc.FinishDataXfer(ref cBufs[k], ref xBufs[k], ref len, ref oLaps[k], ref pktsInfo[k]))

         

                          {

         

                              ISO_PKT_INFO[] pkts = pktsInfo[k];

         


         

                              for (int j = 0; j < PPX; j++)

         

                              {

         

                                  if (pkts[j].Status == 0)

         

                                  {

         

                                      XferBytes += pkts[j].Length;

         

                                      Successes++;

         

                                  }

         

                                  else

         

                                      Failures++;

         


         

                                  pkts[j].Length = 0;

         

                              }

         


         

                          }

         

                          else

         

                              Failures++;

         

                      }

         

                      else

         

                      {

         

                          // FinishDataXfer

         

                          if (EndPoint.FinishDataXfer(ref cBufs[k], ref xBufs[k], ref len, ref oLaps[k]))

         

                          {

         

                              XferBytes += len;

         

                              Successes++;

         

                          }

         

                          else

         

                              Failures++;

         

                      }

         


         

                      k++;

         

                      if (k == QueueSz)  // Only update displayed stats once each time through the queue

         

                      {

         

                          k = 0;

         

                          t2 = DateTime.Now;

         

                          elapsed = t2 - t1;

         


         

                          xferRate = (long)(XferBytes / elapsed.TotalMilliseconds);

         

                          xferRate = xferRate / (int)100 * (int)100;

         


         

                          // Call StatusUpdate() in the main thread

         

                          this.Invoke(updateUI);

         


         

                          // For small QueueSz or PPX, the loop is too tight for UI thread to ever get service.   

         

                          // Without this, app hangs in those scenarios.

         

                          Thread.Sleep(1);

         

                      }

         

                      // Re-submit this buffer into the queue

         

                      len = BufSz;

         

                      EndPoint.BeginDataXfer(ref cBufs[k], ref xBufs[k], ref len, ref oLaps[k]);

         

                  } // End infinite loop

         

              }

         

       

         

      And this is the code that I use to write into file:

         

       

         

              public unsafe void WriteToFileThread()

         

              {

         


         

                  int bytes = 16384;

         

                  byte[] buffer = new byte[bytes];

         

                  bool bXferCompleted = false;

         

                  bool IsPkt = false;

         


         

                  CyBulkEndPoint bulkEpt = EndPoint as CyBulkEndPoint;

         

                  if (bulkEpt != null)

         

                      bXferCompleted = bulkEpt.XferData(ref buffer, ref bytes, IsPkt);

         

                  try

         

                  {

         

                      while(true)

         

                      WriteXferData(buffer, bytes, bXferCompleted);

         

                  }

         

                  catch (NullReferenceException e)

         

                  {

         

                      e.GetBaseException();

         

                      this.Invoke(handleException);

         

                  }

         

              }

         

       

         

      What is the problem?

         

       

         

      Thank you!