Datum: 27.03.2008 10:45
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:
sleep_msp( 8 ); /* Aufruf der Assemberroutine sleep_msp */ |
Zur Vollständigkeit hier noch die ASM Routine:
sleep_msp: DINT CLR &TACTL MOV #TASSEL0+MC1+TACLR,&TACTL MOV R12,&TACCR0 MOV #LPM3+GIE,SR 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
Datum: 27.03.2008 11:03
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
Datum: 27.03.2008 11:07
Hab ich nicht gelesen :-) Werde ich aber unverzüglich nachholen... Weitere Vorschläge??
Datum: 27.03.2008 11:19
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.
Datum: 27.03.2008 11:27
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!
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel