Forum: Compiler & IDEs zwei ISRs mit selben Code


von Matthias L. (Gast)


Lesenswert?

Hallo,

wie kann ich dem GCC erklären, dass zwei ISRs auf denselben Programmteil 
zeigen sollen?

also sinngemäß sowas:
1
ISR( INT6_vect, INT5_vect )
2
{
3
  ...
4
5
}


Vielen Dank schonmal

von Guru (Gast)


Lesenswert?

Die beiden Interrupts ganz normal schreiben und darin die selbe Funktion 
aufrufen. Die Funktion kannst Du als inline deklarieren.

von 42 (Gast)


Lesenswert?

indem du in der Vektortabelle die Adresse deiner Interruptroutine für 
beide Interrupts einträgst. Wie das in C geht, weiss ich nicht.

von Stefan E. (sternst)


Lesenswert?

1
ISR( INT6_vect )
2
{
3
  ...
4
}
5
6
ISR_ALIAS( INT5_vect, INT6_vect );

von ich (Gast)


Lesenswert?

Wenn es um AVRs geht, so:
1
ISR(INT5_vect)
2
{
3
   ...
4
}
5
6
ISR_ALIAS(INT6_vect, INT5_vect);

von ich (Gast)


Lesenswert?

Mist, zu langsam...
Richtig richtig wäre außerdem:
1
ISR(INT5_vect)
2
{
3
   ...
4
}
5
ISR(INT6_vect, ISR_ALIASOF(INT5_vect))
Das oben ist deprecated.

von Ernestus P. (malzeit) Benutzerseite


Lesenswert?

Matthias Lipinsky schrieb:
> ISR( INT6_vect, INT5_vect )
> {
>   ...
>
> }

Ohne es getestet zu haben, versuchs mal so
1
ISR( INT6_vect)
2
ISR( INT5_vect )
3
{
4
  ...
5
}

von Matthias L. (Gast)


Lesenswert?

>ISR_ALIAS(INT6_vect, INT5_vect);

Danke für den Hinweis:

Ich habs jetzt so gemacht:
1
ISR_ALIAS( INT5_vect, INT6_vect );
2
ISR      ( INT6_vect )
3
{
4
  ...

Das erzeugt zwar einen witzigen Jump auf die folgende Addresse, aber 
soll mal nicht stören:
1
@000000B2: __vector_6
2
114:      ISR_ALIAS( INT5_vect, INT6_vect );
3
+000000B2:   940C00B4    JMP       0x000000B4     Jump
4
@000000B4: __vector_7
5
116:      {
6
...


Vielen Dank.

von Guru (Gast)


Lesenswert?

>Das erzeugt (...) einen witzigen Jump auf die folgende Addresse

Mmh. Dann wäre die Variante mit der inline Funktion vielleicht doch eine 
Alternative.

von Stefan E. (sternst)


Lesenswert?

Guru schrieb:
>>Das erzeugt (...) einen witzigen Jump auf die folgende Addresse
>
> Mmh. Dann wäre die Variante mit der inline Funktion vielleicht doch eine
> Alternative.

Den kompletten ISR-Code doppelt haben, nur um 2 Takte zu sparen?

von Guru (Gast)


Lesenswert?

>Den kompletten ISR-Code doppelt haben, nur um 2 Takte zu sparen?
Warum nicht, falls es auf die zwei Takte für den Jump ankommt.
Aber verdoppeln bräuchte man mit inline den Code ja auch nicht.

von Stefan E. (sternst)


Lesenswert?

Guru schrieb:
> Aber verdoppeln bräuchte man mit inline den Code ja auch nicht.

Nein? Zeig mal wie das gehen soll.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Matthias Lipinsky schrieb:

> Das erzeugt zwar einen witzigen Jump auf die folgende Addresse, aber
> soll mal nicht stören:
> [avrasm]
> @000000B2: __vector_6
> 114:      ISR_ALIAS( INT5_vect, INT6_vect );
> +000000B2:   940C00B4    JMP       0x000000B4     Jump
> @000000B4: __vector_7

Wenn der dich stört, dann solltest du beim Linken die Option

-Wl,--defsym=__vector_6=__vector_7

angeben.  Das ist zwar komplett unportabel, sollte dir aber den JMP
sparen. :-)

von Guru (Gast)


Lesenswert?

>>Guru schrieb:
>> Aber verdoppeln bräuchte man mit inline den Code ja auch nicht.

>Stefan Ernst schrieb:
>Nein? Zeig mal wie das gehen soll.

Nein. Zeig ich nicht. ;-) Nee, hast recht, falls Du das sagen wolltest: 
mit Inline wäre der Code natürlich doppelt.

Aber dann bleibt:
>Den kompletten ISR-Code doppelt haben, nur um 2 Takte zu sparen?
Warum nicht, falls es auf die zwei Takte für den Jump ankommt.

von Peter D. (peda)


Lesenswert?

Matthias Lipinsky schrieb:
> Ich habs jetzt so gemacht:ISR_ALIAS( INT5_vect, INT6_vect );
> ISR      ( INT6_vect )
> {
>   ...

Mach besser so:

Beitrag "Re: zwei ISRs mit selben Code"

Dann ist der Sprung gleich richtig.


Peter

P.S.:
Da fehlt ein ;
1
ISR(INT5_vect)
2
{
3
   ...
4
}
5
ISR(INT6_vect, ISR_ALIASOF(INT5_vect));

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.