Forum: Mikrocontroller und Digitale Elektronik Interrupt in C?


von Oli (Gast)


Lesenswert?

Hallo
Ich habe folgenden Code aus einem Buch abgeschrieben, trotzdem kriege 
ich immer eine Fehlermeldung...
Sind irgendwelche Compilereinstellungen falsch? Oder stimmt was am Code 
nicht?
Danke


interrupt [UART_RX_vect] void UartRxIntHandler( void )
{

    unsigned char data;

    data = UDR;  // Lesen der Empfangsdaten
    RxBuf[RxProducer] = data;
    RxProducer++;
    RxProducer &= BUFFER_MASK;

    if(RxProducer == RxConsumer)
    {
     //Fehler!
    }

}

..\main.cpp (115) : Error[Pe077]: this declaration has no storage class 
or type specifier
..\main.cpp (115) : Error[Pe065]: expected a ";"

Ich benütze den IAR Embedded Workbench.

von Oli (Gast)


Lesenswert?

Also die Zeile 115 ist die Funktionsdeklaration:
115:  interrupt [UART_RX_vect] void UartRxIntHandler( void )

von Nik (Gast)


Lesenswert?

Hallo Oli

Ich kenne mich in C eigentlich überhaupt nicht aus,
aber den zweiten Fehler kannst du sicher eliminieren, indem du
nach "if(RxProducer == RxConsumer)" noch ein ";" einfügst,
wie bei (fast) allen anderen Zeilen(ausser Kommentare)

Der erste Fehler hat wahrscheinlich seine Ursprünge in der
selben Zeile, denn was ist RxConsumer?

MFG

NIK

von Oli (Gast)


Lesenswert?

Habe ein ";" eingefügt -> Fehler bleibt bestehen.. :(

von Nik (Gast)


Lesenswert?

Welches ist denn die Zeile 115 ?, Die datei ist ja bei weitem nicht so 
lang. Oder ist das nur ein Teil des Codes ?

Ausserdem steht bei den Fehlern ja jeweils am Anfang main.cpp

ist das eine Includedatei oder die Datei selbst ?
Wenn es eine Includedatei wäre, müsste der Fehler ja darin enthalten 
sein...

Nik

von Nik (Gast)


Lesenswert?

äh blöd, du hast ja geschrieben welches Zeile 115 ist.
Das ";" kommt desshalb auch am Ende dieser Zeile hin.(Denke ich)

Der andere Fehler liegt ja in der selben Zeile.
Dem Compiler ist anscheinend etwas nicht genau beschrieben.
Wie gesagt ich eigentlich überhaupt keine C Kentnisse,
desshalb kann ich auch nur vermuten.


MFG
Nik

von Matthias (Gast)


Lesenswert?

Hi

wenn es sich um den AVRGCC handelt solltest du mal in die Doku des 
selben kucken und auch mal ins Tutorial auf dieser Seite. ISR's werden 
hier etwa so

INTERRUPT(SIG_OVERFLOW0)

eingeleitet. Und in

if(RxProducer == RxConsumer)

fehlt sicher kein ;

Matthias

von Daniel Aue (Gast)


Lesenswert?

hi !

Ich glaube mal gehört zu haben dass beim IAR Interrupts durch #PRAGMA 
Anweisungen definiert werden (nicht wie beim gcc) möglicherweise ist der 
Code aus dem Buch für eine ältere Version von IAR.
Schau mal in der Doku zum Compiler, da müsstest du eigentlich finden wie 
mans macht...

LG

von Oli (Gast)


Lesenswert?

@Daniel Aue:Hab ich auch schon versucht...
#pragma function=interrupt
void UartRxIntHandler( void ){
...
}
#pragma function=default

Hat leider auch nichts genützt.
Ja, im Buch wird eine ältere Version des IAR Compilers benutzt.

von John Doe (Gast)


Lesenswert?

Dann schau doch einfach in die Anleitung.
Oder hast Du den Compiler mit Emule & Co. gezogen?

von Oli (Gast)


Lesenswert?

@John: Falls es dich beruhigt: NEIN, ich habe den IAR Embedded Workbench 
rechtmässig erworben. Ich bin sogar Besitzer einer runden Scheibe, wo 
dieses Programm darauf gespeichert ist. Cool, oder?    ;-)

Thema:
Ich hab jetzt herausgefunden, wie ich es machen muss:

#pragma vector=UART_RX_vect
__interrupt void UartRxIntHandler( void )


Danke für euer Hilfe
Oli

von John Doe (Gast)


Lesenswert?

Ich wollte Dir nicht auf den Schlips treten, ehrlich.
Aber das war doch so eine klassische Handbuchfrage.
Zumindest bei unseren Compilern hier steht so etwas immer da drin.

von Oli (Gast)


Lesenswert?

>Aber das war doch so eine klassische Handbuchfrage.

Da hast Du schon recht. Hab das "#pragma vector"-Zeugs auch schon vor 
der Frage gesehen, ich dachte mir einfach immer 'ach, das muss doch so 
gehen, wenn es schon im Buch steht...'.
Naja...
Danke jedenfalls nochmals für die Hilfe, bin halt zu dumm um 
"Handbuchfragen" selber zu lösen.
mfg
Oli

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.