Re: Parameter-Übergabe CC2 ASM Kategorie: Progr. Assembler, TaskingTools, OS (von André H. - 29.01.2023 13:40) | ||
Als Antwort auf Parameter-Übergabe CC2 ASM von Egbert - 24.01.2023 20:06 | ||
| ||
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: inline function() { } 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: 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; } Mit Gebrauch als normale Funktion müsste writeFD02() so aussehen: 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; } 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é Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: Parameter-Übergabe CC2 ASM (von Egbert - 3.02.2023 14:10) |