Forum: Mikrocontroller und Digitale Elektronik IAR Compiler; MSP430 Assemblerroutine; Übergabeparameter


von Klaus B. (nuccleon)


Lesenswert?

Hallo Leute,

ich programmiere den MSP430F123 und verwende dabei den IAR C/C++ 
Compiler. Mein Code besteht aus einem *.s43 Assemblerfile, für 
zeitkritische Routinen, und einem *.c File.

Aus meinem C-Code heraus rufe ich div. Assemblerroutinen, z.B. 
sleep_msp, auf.

Der Aufruf sieht folgendermaßen auf:
1
   sleep_msp( 8 ); /* Aufruf der Assemberroutine sleep_msp */

Zur Vollständigkeit hier noch die ASM Routine:
1
sleep_msp:
2
   DINT
3
   CLR     &TACTL
4
   MOV     #TASSEL0+MC1+TACLR,&TACTL
5
   MOV     R12,&TACCR0
6
   MOV     #LPM3+GIE,SR
7
   JMP     RET

Nun meine eigentliche Frage ;-)
Der C-Compiler verfrachtet die Übergabeparameter (hier 8) immer an 
Register R12 (aufsteigend).

Wie bringe ich den Compiler dazu, Übergabeparameter an eine von mir 
favorisierte Stelle, z.B. R13, zu legen?

Geht das überhaupt?

Der Hintergrund meiner Frage.
Die verwendeten Assemblerroutinen sind zum Teil vorgegeben und verwenden 
nicht immer R12 als Arbeitsregister. D.h. ich muss vor dem Aufruf der 
Routine den Übergabeparameter explizit (z.B. mit Inline Assembler) ins 
entsprechende Register mappen, was meinen Code nicht unbedingt 
verständlicher macht.

Gruß Klaus

von Michael (Gast)


Lesenswert?

Hallo,

ich bin mir eigentlich ziemlich sicher, dass das leider nicht geht! In 
diesem Zusammenhang kann ich ansonsten nur die Application Note von TI 
empfehlen: "Mixing Assembler and C". Aber so wie es sich bei dir anhört, 
hast du die mit Sicherheit schon gelesen ;-)

Viele Grüße
Michael

von Klaus B. (nuccleon)


Lesenswert?

Hab ich nicht gelesen :-)
Werde ich aber unverzüglich nachholen...

Weitere Vorschläge??

von Christian R. (supachris)


Lesenswert?

Die Register für die Übergabe-Parameter sind vom Kompiler abhängig. Das 
kann man leider nicht ändern. Steht alles im "Mixing C and Assembler" 
Manual. Müsstest du mal schauen, dass du entweder die Routinen anpasst, 
oder die Routinen nach C portierst. Für die oben gepostete Routine macht 
ASM keinen Sinn, das kann man in C genauso schreiben, der Kompiler macht 
das selbe draus. Gerade beim MSP430 ist ASM nur noch in den seltensten 
Fällen von Nöten. Ich habs beim GCC immer mal gemerkt, wenn ich das 
Listing angeschaut hab, dass die Optimierung sehr gut ist, was besseres 
wäre mir auch nicht eingefallen.

von Klaus B. (nuccleon)


Lesenswert?

Nach C Portieren ist ein schlechter Plan - Viele viele vorhandene 
Routinen
Routinen anpassen ist auch ein schlechter Plan - Routinen werden auch 
für andere, bereits vorhandene Programme verwendet und ich möchte 
konsistent bleiben.

Bleibt mir nur übrig, die Übergabeparameter in die entsprechenden 
Register zu mappen.

Naja, trotzdem danke für eure Vorschläge!

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.