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> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > Hallo Ernst, > > Deine gemessenen Takte sind zu hoch, allerdings verbrauchen Bytecodes Instruktionen > je nach Komplexität tatsächlich 30+ Taktzyklen. Das liegt an der Harvard Architektur > der Atmel Megas, die den Zugriff auf das Flash limitieren. Hat man im Zugriff auf das RAM > mehrere Adressmodi und kann indiziert über X,Y,Z zugreifen, so kennt der Flashzugriff > leider nur eine Zugriffsart. Deshalb braucht alleine der Fetch Bytecode, Lookup + Sprung > in die Bytecode Routine ca. 30 Taktzyklen. > > Wenn ich dazu komme, werde ich noch ausführlicher vorstellen, was ein "Var++" oder "Var=Var+1" > an Bytecodes benötigt. Veröffentliche doch mal das komplette Programm, wo Du die Taktzyklen > mißt. > > Die neue Beta hat auch in der Geschwindigkeit Optimierungen, ich schätze das die Version ca. > 5-10% schneller geworden ist. > > Der Atmel AVR32 hat Spezialbefehle für den Table Einsprung, dort wird die Bytecodeabarbeitung > vorraussichtlich ca. 8x-10x schneller werden. > > Gruss Peter > > > Unten ein kurzes Programm zum messen von Laufzeiten - Anweisungen, Programmteile > > Verwendet wird der 16-Bit Timer 1 > > Ergebnis: sehr enttäuschend! > > Var = Var + 1 (Byte) benötigt 291 Takte!!! > > ++Var 260 Takte !!! > > > > Sinus von einer single etwa 3000 - ist ok, aber die einfachsten Anweisungen brauchen extrem > > lange. Das increment einer Bytevariable immer noch 260 Tackte wofür ???? > > > > Portausgabe eines Bytes um die 400, mit DirAcc_Write direkt das Register beschreiben - denkste - > > dauert genauso lange. > > Entweder ich mache da einen ordentlichen Überlegungsfehler (wird der Tackt intern geteilt?) oder das > > Basic ist wirklich so langsam - vorallem bei einfachsten Befehlen? > > Übrigens PortWriteByte soll wesentlich schneller sein als PortWriteBit - etwa 400 zu etwa 550 > > macht man das "Ausmaskieren" des Bits händisch so kommt man sicher auf wesentlich mehr, da > > jeder einfachste Befehl unsummen an Tackten frißt. > > > > Dim Zeitfloat As Single > > Dim Timervar As Word > > > > > > AbsDelay(2 ) ' unbedingt notwendig!!! > > ' nur mit 2ms Pause konstante > > ' Werte sonst 30-64us > > > > Timer_T1Time(65000,1) ' Startpunkt der Messung mit 67,8ns > > > > 'hier die Prüf - Anweisungen oder ganze Programmteile > > 'bis max 4,4ms > > > > Msg_Laufzeit1() ' Aufruf der Sub > > */ > > Sub Msg_Laufzeit1 () ' Sub für Messung und Ausgabe > > Timervar = Timer_T1GetCNT() - 455 ' Korr-Wert wenn kein Befehle > > Msg_WriteText(" Nr1= ") > > Msg_WriteWord(Timervar ) ' Takte 67,8ns ... 14,..MHz > > Msg_WriteChar(32 ) > > Zeitfloat = Timervar * 0.0678 ' Wert in us > > Msg_WriteFloat(Zeitfloat ) > > Msg_WriteChar(32 ) > > End Sub > > > > > > > > > > > > > > > > AbsDelay(2 ) ' unbedingt notwendig!!! > > Timer_T1Time(65000,5) ' Startpunkt der Messung mit 8,68usTakt > > Msg_Laufzeit128T() ' Aufruf der Sub > > */ > > Sub Msg_Laufzeit128T () ' nur mit 2ms Pause konstante Werte !! > > Schleife = Schleife + 1 - 1 ' Zeitverbrauch damit wenige Takte abgezogen werden > > Timervar = Timer_T1GetCNT() - 1 ' Korrektur -1 > > Msg_WriteText(" N128= ") ' ******************bis zu 0,56sec ********************************* > > Msg_WriteWord(Timervar ) ' 128 Takte 8,68us ... > > Msg_WriteChar(32) > > Zeitfloat = Timervar * 0.00868 ' Wert in ms! > > Msg_WriteFloat(Zeitfloat ) > > Msg_WriteText("ms") > > Msg_WriteChar(32) > > 'Msg_WriteChar(13) ' CR Zeilenvorschub > > End Sub