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

Wichtig: Bevor Du wegen einem Problem mit der CC2 postest, stelle sicher, daß Du
die neueste OS-Version, die neuseste Compiler-DLL und die neuesten Modulversionen benutzt!
Beachte, daß sich auf der CD zur CC2-Unit/Station auch jetzt noch die ältesten Dateien befinden!
Es gelten folgende Anleitung und Regeln: Regeln CC2Net.de-Forum
Zurück zum Artikel  (Blaue Felder sind Pflichtfelder)


Name:   UserID: 
 E-Mail:
Kategorie
Betreff
Homepage:
Link-Titel:
Link-URL:
Cookie für Name, UserID, E-Mail, Homepage-URL setzen
(Erspart die Neueingabe bei Beiträgen und Antworten)
(Zum Löschen des Cookies hier klicken)
Ich nutze:
C-Control II Unit
C164CI-Controllerboard
C-Control II Station
CCRP5 mit CC2-Unit (Conrad Roboter)
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
eigenes Board
original OS     OSOPT_V2     OSOPT V3.0 OSOPT V3.1

Kommentar:
Einfügen von HTML im Kommentar:

Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a>
Bild einfügen: <img src="BILDURL">
Text formatieren: <b>fetter Text</b>  <i>kursiver Text</i> <u>unterstrichener Text</u>
Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b>
C2 Quellcode formatieren: <code>Quellcode</code>
ASM Quellcode formatieren: <asm>Quellcode</asm>
(Innerhalb eines Quellcodeabschnitts ist kein html möglich.)
Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst !  

> Hallo Detlef, > > > <code>for i=startaddr ... startaddr+len-1 > > { > > if (i % 32)==0 and i > > { > > // Code entfernt > > } > > eeout(8,data[i]); // Assembler Funktion > > }</code> > > Zwischen den 8 Clock-Pulsen liegt immer eine Pause von ca. 700us. > > Es gibt keine weiteren Threads. > > Was ist für diese Zeit verantwortlich? > > Alles vor und nach dem ausführen Deiner ASM-Routine. > Also das <code>startaddr+len+1</code>, der "Mechanismus" der For-Schleife selbst, > die If-Abfrage, Das Schieben der Daten auf den Stack für <code>eeout()</code> und > zu guter letzt noch die alle Aktionen vor und nach dem Ausführen der eigentlichen > ASM-Routine. (Registerwerte speichern und wiederherstellen etc.) > > > Wie kann man diese Pause verringern? > > Indem Du einiges optimierst. > Aber es sind keine Pausen, sondern der Controller arbeitet in dieser Zeit schon. > > Bei Single-Threading gäbe es als erste Optimierung das Setzen der Prio auf 255. > Das bringt aber lediglich etwa 1% Geschwindigkeitszuwachs. > > Als nächstes könntest Du die For-Schleife optimieren, indem Du den Endwert > nicht bei jedem Schleifendurchlauf neu berechnest: > <code> > len=startaddr+len; > for i=startaddr ... <len > {} > </code> > Bei 32768 Durchläufen sollte das etwa 4Sekunden ausmachen, sprich schneller sein. > > Wenn Du die If-Bedingung wegläßt, wären das hier etwa 7 Sekunden Gewinn. > > Wenn Du bei eeout() den Parameter "8", welcher scheinbar für 8Bit steht, wegläßt, > und diesen in der ASM-Routine einbindest, wären das wiederum etwa 600ms > bei 32768 Durchläufen. > > > Als Übergangslösung habe ich die Schleifendurchläufe reduziert. > > > > <code>i = startaddr; > > while (i <= (endaddr - 31)) > > { > > // Code enfernt > > eeoutarray (data[i], 32); // Assembler Funktion > > if (i < 0x7FE0) > > { > > i = i + 32; > > } > > else > > { > > i = 0x7FFF; > > } > > }</code> > > Aber hier verschwendest Du wieder Zeit, da eine While-Schleife mit zusätzlicher > Addition für <code>i=i + x</code> ca. 50% länger braucht, als die vergleichbare For-Schleife. > > Wenn, dann solltest Du schon auf diese weise die Durchläufe reduzieren: > <code> > len=startaddr+len; > for i=startaddr ... <len step 32 > { > // Code enfernt > eeoutarray (data, i,32); // Assembler Funktion > } > </code> > Übrigenst wird es Dir nichts bringen, wenn Du <code>data[i]</code> Deiner ASM-Funktion übergibst, > um 32 Byte von Data zu schreiben. > Du muß dann eher 3 Parameter übergeben, wenn die Funktion eeoutarray() auch flexibel > sein soll: Array als Referenz, Index und Anzahl zu schreibender Bytes. > > > > Bei den Eeprom 95256 (32768 Bytes) verkürzt sich dadurch > > die Programmierzeit von 40s auf 9s. > > Das ist klar. Du Arbeitest dann außerhalb des Betriebssystems. > Allerdings komme ich bei Deiner ursprünglichen For-Schleife lediglich > auf knapp unter ca. 28sec, da ich nur eine Dummy-Funktion nutzen konnte, > da ich Deine ASM-Routine nicht kenne. > Aber aus Deinen Angaben schließe ich dann, daß ein ASM-Aufruf zum Schreiben > eines Bytes der ursprünglichen Schleife etwa 0,4ms beträgt. > > An Deiner Stelle würde ich auf jeden Fall blockweise auf das EEProm schreiben. > Das Prüfen, ob das EEprom mit dem schreiben fertig ist, würde ich auf jeden Fall > nicht nach dem Senden der Daten, sondern immer davor durchführen. > Ich denke nämlich, daß Du das scheinbar so machst. > Oder prüfst Du dies vielleich nicht? > Ich kenne das 95256 nicht, jedoch schau mal, ob dieses einen Pagewrite unterstützt. > Dadurch läßt sich u.U. auch einiges an Zeit sparen, da man nicht für jedes Byte neu > adressieren muß, sondern nur einmal pro Page. > > > MfG André H.
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB