MSP430: Interrupts und __bis_status_register_on_exit

Gast #4178735
Lesenswert?

Hallo,

ich versuche gerade alten, ursprünlich mit IAR kompilierten Code mit 
msp430-gcc zu bauen. Dabei muss ich unter anderem die Interrupt-Routinen 
anders deklarieren. So sieht die neue Lösung aus:
1
ISR(ADC12_VECTOR, ADC12Int)             
2
{                                       
3
        __low_power_mode_off_on_exit();
4
        ADC12IFG = 0;
5
}

Dabei ist __low_power_mode_off_on_exit ein Makro:
1
#define __low_power_mode_off_on_exit() __bis_status_register_on_exit(LPM4_bits);

Leider beschwert sich der msp-g++:
1
Dev.c: In function void ADC12Int():
2
Dev.c:487:2: error: __bis_status_register_on_exit invalid outside of function with interrupt attribute

Hat jemand eine Idee, weshalb das so auftritt?

Viele Grüße

Marvin
Gast #4178741
Lesenswert?

Kleines addendum, nach dem Präprozessor:
1
# 486 "Dev.c"
2
static void Adc12Int()
3
{
4
 __bis_status_register_on_exit(((0x0080)+(0x0040)+(0x0020)+(0x0010)));;
5
 ADC12IFG = 0;
6
}

Offenbar wird das interrupt-attribut tatsächlich ignoriert.
Gast #4179543
Lesenswert?

Also, zuerst mal verstehen
http://mspgcc.sourceforge.net/manual/x918.html

dann Fehler beheben

MS schrieb:
> #define __low_power_mode_off_on_exit()
> __bis_status_register_on_exit(LPM4_bits);

low power off geht mit *__bic...* und nicht mit *__bis...*

und wie funktionierts

Vor Eintritt in die ISR wird das PSW auf dem Stack gesichert. Mit der 
__bic... Funktion wird das PSW auf dem Stack modifiziert. Mit dem Reti 
wird das PSW mit dem Wert vom Stack restauriert.
Wird __bic... ausserhalb der ISR aufgerufen, modifiziert man das PSW 
direkt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren