Forum: Mikrocontroller und Digitale Elektronik was ist das für eine Definition? Assembler


von Thomas (Gast)


Lesenswert?

Hallo,

ich habe hier im Quelltext eine Definition die ich nicht verstehe und 
die oft verwendet wird.

#define REMOVE_ENTER_1 {_asm("ADD.W #1,SP"); _asm("POPC FB");}

Weiß jemand was der Code bedeutet?

gruß
Thomas

von eProfi (Gast)


Lesenswert?

Wie immer: bitte mehr Informationen (welcher Processor / Compiler ...)
mehr Quelltext (zumindest eine komplette Funktion, in der REMOVE_ENTER_1 
verwendet wird).

Es ist halt eine Abkürzung, welche -wenn im Quelltext verwendet-  zwei 
Assemblerbefehle einfügt.
Diese manipulieren (bereinigen?) den Stack:
1. den Stackpionter incrementieren (vermutlich das selbe wie POP dummy)
2. den nächsten Stack-Inhalt nach FB speichern, was auch immer das sein 
mag).

von jimbo (Gast)


Lesenswert?

Hallo Thomas,

das ist aber kein AVR Programm oder?!? Weil die Inline Assembler Befehle
(also das hinter _asm(...)) sind keine AVR Assembler Befehle.


Auf jeden Fall macht das #define folgendes:
Überall im Programmcode wo "REMOVE_ENTER_1" steht, setzt der Compiler
_asm("ADD.W #1,SP"); _asm("POPC FB"); ein.

Der erste Befehl bewirkt, dass die Konstante "1" als Wort (16bit) in die 
Varialble SP geschrieben wird. Wobei SP vermutlich der Stackpointer ist.
Im Klartext SP+=1;

POPC holt vermutlich den Inhalt vom neuen Stackpointerplatz und schreibt 
ihn in die Variable FB. (Keine Ahnung was FB für ne Variable ist). Ich 
hab vermutlich geschrieben, weil ich den Befehl POPC nicht kenne sondern 
nur POP.

von jimbo (Gast)


Lesenswert?

oh,  eProfi war schneller ;)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Es ist M16C.
Tasking-Compiler?
Hier wird die Bankumschaltung manipuliert.

Mit  _asm("ADD.W #1,SP");
wird der Stackpointer um eins höher gesetzt

Mit  _asm("POPC FB");
wird der Wert vom Stack in die Bankumschaltung übertragen

Nur sollte jetzt vorher noch was auf den Stack geschrieben werden???
Poste doch mal so eine Funktion, die das Makro verwendet.


Hier taucht POPC FB auch im Zusammenhang mit Interrupts auf:
http://www.tasking.com/support/M16C/solved_known_problems_v3.1r1.htm

von Thomas (Gast)


Lesenswert?

Danke für eure Antworten,

Danke für eure Antworten, das erklärt ja schon ein bisschen.
ja ich arbeite mit einem M16C28 und programmiere in HEW.

Ich arbeite mit ZigBee und das sind Funktionen aus dem ZigBee- Stack, 
die ich benutzen kann. Was die wirklich machen und was FB genau für eine 
Variable ist kann man nicht einsehen, da der Stack ist ja nicht 
öffentlich ist

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wie gesagt:
FB ist die Bankumschaltung, nicht einfach nur irgendeine Variable.

Siehe dazu im Software Manual unter "Frame base register FB"
:
The frame base register (FB) consists of 16 bits, and is used for 
FB-based relative addressing
:
http://documentation.renesas.com/eng/products/mpumcu/rej09b0137_m16csm.pdf

von Thomas (Gast)


Lesenswert?

Danke dir Lothar,

hätt ich natürlich auch finden können, hab das Manual ja auch.  ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.