Für dieses Forum muß Javascript im Browser aktiviert werden!
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 Rolf, > > > Hallo Andrè, > Jetzt merk ich's erst. :-) > Das heißt André nicht Andrè ! > > > Mein Onkel verkauft auch als Fachhändler Solaranlagen... ich weis aber nicht mal, welche Steuerungen > > er verwendet. Irgend was fertiges.... > > Tja, ich handle nicht, sondern baue hauptsächlich Anlagen(, die ich natülich auch verkaufe *grins*). > In den meisten Anlagen reicht eine 0815-Regelung völlig. > Das gängiste und günstigste wird hier wohl TA (=Techische Alternative, Österr. Firma) sein. > > > Das Asm vorteile hat, ist klar. Es wäre nur nicht zweckmässig "schneller zu warten". > > Das hatte ich ja schon ausgeführt. Sonst ist das mit dem asm-Code ja ok. > > ASM lass ich vorerst einmal weg. Das wird etwas für Version 3.0. :-) > > > > > > > Ein sleep-wert von 1 reicht gerade um eine einzige > > > > int-Addition in einem Fremden Thread auszuführen. Das ist für fremde Treads zu wenig und kostet > > > > nur enorme Treadwechselzeiten. > > > > Mir kommt da ein Verdacht... vieleicht kannst Du mich da auch aufklären... > > Wenn die VM "nur" abhängig vom "Runlevel" eine bestimte Menge an festgelegten Operationen ausführt, > > kann ich in Prinzip eine Int-addition garnicht mit einer long-addition vergleichen da immer beide Testschleifen > > gleich oft durchlaufen werden. Richtig? > Wieder einmal ein klares Jain. :-) > a=0.5 // Für was gibt es float *rofl* > > Die Priorität besagt nichts anderes als die max. Anzahl der VM-OPs pro Durchlauf. > Dies ist also nicht zeitabhängig, sondern es wird einfach nur gezählt. > Standard-Prio ist 32. D.h. es werden 32 VM-OPs ausgeführt bevor die Rechenzeit dem nächstem > Thread abgegeben wird. > Die Maximale Prio ist 255, die minimale ist 1 (das ist aber keinem zu empfehlen *g*) > Die Prio 0 besagt, daß der Thread steht. > Die Anweisung "halt" setzt die Prio lediglich auf 0. > Die Anweisung "reset" hingegen setzt den Thread zurück (incl. normales Capture-flag!). > Die Prio des zurückgesetzten Thread hat dann 0 oder 32. > (Threads mit dem Namen "main" haben zum Start immer Prio 32) > > Wenn Du jetzt zwei Additionen mit int und long hast, benötigen beide > gleich viele VM-OPs: > int x; > long y; > x=x+4254; > y=y+4254; > Jede Zeile benötigt 4 VM-OPs > Werte auf den Stack laden: 2 VM-OPs > Addition und Ergenis auf den Stack laden : 1 VM-OP > Ergebnis in x bzw. y speichern: 1 VM-OP > Das einzige, was verschieden ist, ist die Ausführungszeit. Bei long wird etwas länger benötigt. > Um dies jedoch mit dem Systemtimer zu messen, muß man diese Addition > z.b. 1000mal durchlaufen lassen und dann die vergangene Zeit durch 1000 teilen. > Nach diese Methode habe ich schon einige Anweisungen/Funktionen getestet, > wie lange diese wirklich brauchen. > Je genauer man den Wert haben will, desto öffters muß man die Schleife durchlaufen lassen. > Aber vorsicht !! > Man muß zuerst Messen, wie lange die Testschleife selbst benötigt und entsprechend > ein Offset abziehen: > > Bsp: > timer=system.timer(); > for i= 0 ... 999 > { > // ... > } > timer=system.timer()-timer; > > Und um nochmal auf das sleep 1; zurückzukommen: > sleep 1 heißt nicht, daß nur 1 ms gewartet wird. Es kann auch erheblich länger sein. > (z.B. 100 Threads mit Prio 255 (kommt nie vor): > Diese müssen zuerst durchlaufen werden, bevor hinter dem sleep weitergemacht wird. :-) > 99*255 VM-Ops = 2525 VM-Ops. Da vergeht schon etwas Zeit. *g* ) > > > Das bedeutet aber, das mein Bfast im prinzip derzeit nicht zu gebrauchen ist weil letzlich nur die Gesamtzahl > > an Schleifen eine Aussage zur Leistung enthält. Die Angaben zu den einzelnen Schleifen ist eigentlich nur dann > > unterschiedlich, wenn die Schleifen unterschiedliche Mengen an VM-Operationen enthalten. Richtig? > > Korrekt. > > > Ich denke mal, wir werden da beide noch so die eine oder andere Überraschung erleben den die VM > > des CC2 verhält sich offensichtlich nicht so, wie man es von einer CPU vermuten würde. > > Z.B. sind die Zeiten für Int-additionen fast gleich wie bei Long-additionen... das würde ich bei einer > > 16Bit-CPU so erst mal nicht vermuten. > Der Zeitunterschied zwischen int und long Operatiornen ist wahrlich sehr gering. > Floats benötigen jedoch deutlich mehr Rechenzeit. > > > Das war ja im Prinzip auch meine Idee. Nur wollte ich es als c2-Code und sozusagen > > als Prototyp für die Konvertierung nach asm umsetzen und erst in einem 2.ten Schritt > > und nach einer Testphase dann von Dir nach asm konvertieren lassen. > > Die Konvertierung von C2 in ASM ist nicht gerade leicht. > Hier ist es fast immer besser glecih in ASM zu scheiben. > Gut, man kann den C2-Code benutzen, damit man einen "Ablaufplan" hat. > > > > Ja... > > if i2c.cstart(eepromaddr) break; > > ^ da... wenn die Proportionalschrift mir da nicht den Satz zerbröselt... > Hier wird nichts "rebröselt". Dafür werden automatisch erstellt. > Außerdem, für was habe ich eine Vorschau im Forum ? :-) > Übrigens, nächste Frage: Mal sehen, ob Du es findest. *g* > Wo ist das Release beim neuem Capture ? :-) > > > Das wäre schön... wäre vor allem klasse, wenn das Teil als Aufforderung genommen wird, es > > zu erweitern... für das wo ich es brauche, reicht mir das erst mal.. ich denke, das sich um > > die Möglichkeiten der VM eine Menge Gerüchte halten da kaum jemand wirklich die Abläufe > > versteht. Learning by doing... oder so... > > Naja, wenn man erstmal anfängt in ASM zu programmieren, bekommt man so einiges mit. > Man muß nämliuch zwangsläufig das Listing des Betriebsystem etwas studieren. > > > function writeabyte(byte eepromaddr,int addr,byte data) > > { > > capture i2c.flag; > > //evtl. HW-watchdog oder Timer starten.... > > wait i2c.start(160 or (eepromaddr shl 1)); > > i2c.write(addr shr 8); > > i2c.write(addr); > > i2c.write(data); > > i2c.stop(); > > //hier dann noch mal eine Lesefunktion ähnlicher Bauart und vergleich ob Daten identisch sind. > > release; > > } > Hier gibt es jedoch ein kleines Problem: > Um da wieder rauszukommen hilft nur folgendes: > Entweder ein Neustart des Programms oder ein Zurücksetzen des betreffenden Threads > mit der Anweisung "reset" . > > > Wäre das evtl. auch mit Deinen Asm-Funktionen zu regeln? > > Also wait i2c.cstart(160 or (eepromaddr shl 1)); ? > > Du meinst das I²C-Capture. Natürlich. cstart() (=Captured-Start) gibt genauso > wie start() das ACK zurück. > > MfG André H.