Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: FOR Schleife beschleunigen? Kategorie: Programmierung (von Detlef Bäthke - 20.04.2007 9:28)
Als Antwort auf Re: FOR Schleife beschleunigen? von André H. - 17.04.2007 1:00
Ich nutze:
C164CI-ControllerBoard, CC2-Application-Board, OSOPT V3.1
Hallo André,
vielen Dank für deine �berlegungen.
Ein fester Endwert bringt tatsächlich eine Beschleunigung der FOR Schleife.
Ich hatte erwartet, dass der Wert nur einmal berechnet wird.
Die IF Abfrage habe ich auch enfernt.
Nun gelten aber für Startadresse und Endadresse bestimmte Regeln.
Dies ist bei meiner Anwendung kein Problem und bringt einen spürbaren Geschwindigkeitszuwachs.
Ich konnte allerdings keine Unterschied zwischen FOR und WHILE Schleife feststellen.
An der FOR Schleife bin ich wegen der Endadresse 0x7FFF gescheitert (Integer Ã?berlauf).
Eine Longinteger Zählvariable hätte die FOR Schleife bestimmt langsamer gemacht.
eeoutarray (data[i], pagesize) funktioniert bei mir einwandfrei.
Pagewrite benutze ich natürlich. Allerdings bisher nur 32 Byte wegen dem 25C640.
Ich habe nun die Routine geändert, damit die 64 Byte beim 95256 genutzt werden können.
Damit ergeben sich nun folgende Zeiten:
Write: 40s -> 9s -> 5,5s
Verify: 25s -> 2s

Gruss Detlef

function write_range32 (byte data[], int startaddr, int endaddr) returns int
{
  int i;
  int k;
  int l;
  int len;
  int pagesize;
  ports.set( cs,1);
  ports.set( din,0);
  ports.set( clk,0);
  pagesize=32;
  if (endaddr > 0x2000)
  {
    pagesize = 64;
  }
  i = startaddr;
  len = endaddr - pagesize + 1;
  while (i <= len)
  {
      // write enable instruction
      wr_instruction(opcode_wren);
      k = rdsr(rdsr_wel);
      if (k == 0)
      {
        lasterr=0x390000 or i;
        return 0;
      }
      // start write sequence
      ports.set (cs,0);
      eeout(8, opcode_write);
      eeout(16, i);
      eeoutarray (data[i], pagesize);
      // complete write cycle
      ports.set (cs,1);
      // write cycle time = 5 ms
      for l = 0 ... 5
      {
        sleep 1;
        // read status register WIP
        k = rdsr(rdsr_wip);
        if (k == 0) and (l == 0)
        {
         // beim ersten Mal sollte WIP aktiv sein!
         lasterr=0x190000 or i;
         return 0;
        }
        if (k == 0)
        {
          break;
        }
      }
      if (k != 0)
      {
        lasterr=0x290000 or i;
        return 0;
      }
      if (i < 0x7FC0)
      {
        i = i + pagesize;
      }
      else
      {
       i = 0x7FFF;
      }
  }
  return -1;
}




    Antwort schreiben


Antworten: