Forum: Mikrocontroller und Digitale Elektronik dsPic - gleiche ISR für alternativen Interrupt


von microchip jr. (Gast)


Lesenswert?

Hallo Pic-Kenner,
beim dsPIC30Fxx kann man mittels dem ALTIVT = 1 die Alternative 
Vektortabelle verwenden.
Wie sag ich nun dem C30 Compiler, dass jede 
NICHT-DEFINIERTEN-ALTERNATIVEN-ISRs den Vektor der STANDARD-ISR 
verwenden soll?

1
//Alternave ISR
2
void __attribute__((interrupt, no_auto_psv)) _AltCNInterrupt (void)
3
{
4
   foo(); // ok
5
}
6
//Standard ISR
7
void __attribute__((interrupt, no_auto_psv)) _CNInterrupt (void)
8
{
9
   bar(); // auch ok
10
}
1
//Alternave ISR
2
void __attribute__((interrupt, no_auto_psv)) _ADCInterrupt (void)
3
{
4
  bla1(); // ok
5
  bla2(); // ok
6
  ...
7
}
8
//Standard ISR
9
void __attribute__((interrupt, no_auto_psv)) _AltADCInterrupt (void)
10
{
11
  // Hier soll auch bla1(), ... ausgeführt werden.
12
}

PS: Compiler Handbuch sagt zwar dass man die Altern. ISR auch 
beschreiben soll, wie das geht allerdings nicht.

von Klaus (Gast)


Lesenswert?

microchip jr. schrieb:
> // Hier soll auch bla1(), ... ausgeführt werden.

Einfach bla1(); hinschreiben ?

MfG Klaus

von microchip jr. (Gast)


Lesenswert?

bla() steht für einzelne Instruktionen und nicht für einen 
Funktionsaufruf...

von microchip jr. (Gast)


Lesenswert?

Kann mir keiner helfen? Das kommt doch bestimmt öfter vor?

von Klaus (Gast)


Lesenswert?

microchip jr. schrieb:
> PS: Compiler Handbuch sagt zwar dass man die Altern. ISR auch
> beschreiben soll, wie das geht allerdings nicht.

Wenn das so ist, wo hast du dann das her:

void __attribute__((interrupt, no_auto_psv)) _AltADCInterrupt (void)

Das sieht für mich doch so aus, wie der "Alternate ADC Interrupt".

microchip jr. schrieb:
> bla() steht für einzelne Instruktionen und nicht für einen
> Funktionsaufruf...

Das ist dann aber im C-Umfeld sehr missverständlich formuliert.

Was macht man in C, wenn man den gleichen Code mehrfach verwenden will? 
Man packt ihn in eine Funktion und ruft ihn mehrfach auf. So hatte ich 
das gemeint.

MfG Klaus

von micro jr. (Gast)


Lesenswert?

Klaus, Danke für deine Antwort, vielleicht hab ich mich aber nicht 
richtig ausgedrückt. Hier noch ein Versuch:
Ich möchte dass die InterruptVEKTOREN
1
_AltADCInterrupt (void)
und
1
_ADCInterrupt (void)

eine identische Sprungadresse aufweisen. Dabei möchte ich zwecks 
Overhead nicht alle ISRs in eine Funktion packen (Wenn ALTIVT = 1 werden 
nämlich alle Vektoren von der Alternativen Tabelle verwendet).

von Klaus (Gast)


Lesenswert?

micro jr. schrieb:
> Klaus, Danke für deine Antwort, vielleicht hab ich mich aber nicht
> richtig ausgedrückt.

Doch, hast du. Ich habe schon geahnt, daß du Funktionen vermeiden 
willst. Ich weiß leider nicht, wie man dem Compiler beibringt zweimal 
die gleiche Adresse zu verwenden. Im Manual scheinst du ja nichts 
gefunden zu haben. Da mußt du mal die Funktion des _AltADCInterrupt bzw 
des _ADCInterrupt Macros genau untersuchen.

Bevor ich aber nicht sicher wüßte, daß mir der Funktionsaufruf Probleme 
macht, würde ich das lassen.

MfG Klaus

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.