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

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard
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)