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 Egbert, > > > Die zeitkritischen Dinge des One-Wire Protokolls muss ich in ASM erstellen. > > Nur als Info: Du kannst auch den DS2482 (I²C-1-Wire Bridge) zusammen > mit dem Modul ds2482.c2 verwenden. > > > Seit mehreren Tagen durchforste ich das Forum hier und finde etliche Hinweise, jedoch > > habe ich das Gefühl, dass diese Hinweise immer in der Zeit des jeweiligen Standes des OS > > zu sehen sind. > > Parameterübergabe zu ASM-Routinen ist bei allen OS-Versionen gleich. > Hier hat sich allein schon aus Kompatibilitätsgründen nie etwas geändert. > Es waren nur in der Anfangszeit noch nicht alle Möglichkeiten bekannt. > > > Auf meiner Unit nutze ich osopt_v3-1b2.hex (aktuell letzte Version) und sys0002.hex ist > > auch geladen. > > Schau Dir die Module, die auf ASM-funktionen zugreifen, an, wie die > Parameterübergabe erfolgt. Für sys0001.hex und sys0002.hex ist der ASM-Code offen. > (siehe Assembler => Segment 3 Map) > > > > Ich bekomme immer eine Null als Rückgabewert im LCD angezeigt. > > Probiert habe ich auch schon mit anderen höheren Adressen, aber immer das gleiche: Null > > kommt zurück. > > ... > > function readFD02() returns int > > { > > inline vmcodes.VM_LOAD_ABSOLUTE_INT; > > inline 0xFD02; > > }; > > function writeFD02(int value) > > { > > inline vmcodes.VM_STORE_ABSOLUTE_INT; > > inline 0xFD02; > > }; > > Das Problem ist, daß Du normale Funktionen nutzt, und keine inline-Funktionen. > Also: <code>inline function() { }</code> > Denn der Unterschied ist in der Stackbehandlung. > Inline-Funktionen machen exakt nur das, was man innerhalb schreibt. > Normale Funktionen räumen u.a. den Stack auf. > Übergebene Parameter sind bei normalen Funktionen lokale Variablen. > Diese müssten für die Inline-Anweisung erst in den C-Stack geladen werden. > Bei Inline-Funktionen werden übergebene Parameter nur auf den C2-Stack geschoben. > > Wenn Du also folgendes schreibst, würde es funktionieren: > <code>inline function readFD02() returns int > { > inline vmcodes.VM_LOAD_ABSOLUTE_INT; > inline 0xFD02; > } > inline function writeFD02(int value) > { > inline vmcodes.VM_STORE_ABSOLUTE_INT; > inline 0xFD02; > } > </code> > > Mit Gebrauch als normale Funktion müsste writeFD02() so aussehen: > <code>inline function writeFD02(int value) > { > // Laden der lokalen Variable "value" in den C2-Stack > inline vmcodes.VM_LOAD_LOCAL_INT; > inline -6; > // Schreiben des Werts vom C2-Stack > inline vmcodes.VM_STORE_ABSOLUTE_INT; > inline 0xFD02; > } > </code> > Beim Arbeiten mit inline-Anweisung in normalen Funktionen muß man einiges beachten. > In system.setdate() kann man das gut sehen. > Aber inline-Anweisungen in normalen Funktionen nutzt man nur, wenn man > innerhalb der Funktion diese mit C2-Code mischen will. > > Grüße, > André > >