Forum: Mikrocontroller und Digitale Elektronik Falsche/Überflüssige ISR Vektoren


von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Hi,

ich kompiliere den gleichen Code für einen Atmega16 und einen Atmega644.
(Ersteres nur ohne Testausgaben, da der Speicher zu klein ist)

Ansosten belasse ich alles gleich und stelle nur das Device im cmake um.


Könnte ich Probleme bekomme, wenn ich in den "allgemeinen" Code nun den
1
ISR(WDT_vect) {}

einfüge?
Diesen kennt meines Wissens nur der 644.
Wird er einfach ignoriert? (Das würde mir passen)

Grüße

: Bearbeitet durch User
von Chris (Gast)


Lesenswert?

Da der mega16 dieses nicht kennt, dürfte der Precompiler meckern, das 
"WDT_vect" nicht definiert wurde.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

D a v i d K. schrieb:
> Wird er einfach ignoriert? (Das würde mir passen)

Nö, du bekommst einen Fehler wg. nicht vorhandenem Vektor im Mega16. 
Aber du kannst ja mit ifdef und endif den Code für den Mega644 auf 
bestimmte MC eingrenzen.
Hier ein Beispiel für Tiny25 vs. Tiny45/85:
1
; init stack
2
  ldi  temp, low(RAMEND)
3
  out  SPL, temp
4
; the Tiny25 doesn't come with SPH
5
#ifndef _TN25DEF_INC_
6
  ldi  temphi,high(RAMEND) 
7
  out  SPH, temphi
8
#endif

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


Lesenswert?

Chris schrieb:
> Da der mega16 dieses nicht kennt, dürfte der Precompiler meckern, das
> "WDT_vect" nicht definiert wurde.

1) Es gibt keinen "Precompiler". Es gibt einen Präprozessor, der 
Textersetzungen macht, aber den interessiert es überhaupt nicht, wenn 
man ihm einen Namen vorsetzt, den er nicht ersetzen muss (wie eben 
"WDT_vect" auf einem ATmega16).

2) ISR() ist ein Makro, der (kurz gesagt) eine neue Funktion deklariert 
und einleitet. Die kann letztlich einen x-beliebigen Namen haben. Der 
Compiler hat lediglich eine eingebaute Heuristik, die am Ende für 
irgendwelche auf _vect endende Namen eine Warnung "may be a misspelled 
signal handler" (oder so ähnlich) ausspuckt, um einen auf das mögliche 
Versehen hinzuweisen. Legale Interruptvektornamen heißen intern nämlich 
nicht FOO_vect, sondern __vector_<N>, auf das sie über 
Präprozessormakros abgebildet werden.

Bottom line: es wird eine Warnung geben und überflüssiger Code generiert 
werden.

Sinnvoller wäre allerdings sowas wie:
1
#ifdef WDT_vect // compiling for ATmega644
2
ISR(WDT_vect)
3
{
4
  // …
5
}
6
#endif

: Bearbeitet durch Moderator
von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Jörg W. schrieb:
Danke

>
1
> #ifdef WDT_vect // compiling for ATmega644
2
> ISR(WDT_vect)
3
> {
4
>   // …
5
> }
6
> #endif
7
>

Sinnvoll ja, aber ich wollte wissen, ob µC ohne diesen Vektor 
"aussteigen".
Und wenn ich es richtig verstanden habe, lautet die Antwort hier NEIN.
(Es wird nur Platz verschwendet?)

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


Lesenswert?

D a v i d K. schrieb:
> (Es wird nur Platz verschwendet?)

So ist es. Außerdem bekommst du eine Warnung, und falls du mit -Werror 
compilierst, bricht diese den Build ab.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

D a v i d K. schrieb:
> Sinnvoll ja, aber ich wollte wissen, ob µC ohne diesen Vektor
> "aussteigen".

Wenn ein µC keinen WDT hat, dann kann er auch keine entsprechende IRQ 
erhalten.  Außerdem sollte die Initialisierung des Chips im MCUSR o.ä. 
abhängig vom Chip stattfinden, weil des Layout, Adresse bzw. 
Vorhandensein dieses SFRs (wie bei allen anderen SFRs auch) prinzipiell 
vom µC abhängt.

> (Es wird nur Platz verschwendet?)

Mit -ffunction-sections -Wl,--gc-secions wird die Routine entfernt: 
Weil WDT_vect als Identifier interpretiert wird, falls es nicht als 
Makro zu __vector_N definiert ist, wird eine Funktion "WDT_vect" 
erzeugt, und diese wird nirgends referenziert — auch nicht von der 
Vectab.



Jörg W. schrieb:

Nitpick:

> 2) ISR() ist ein Makro, der (kurz gesagt) eine neue Funktion deklariert
> und einleitet. Die kann letztlich einen x-beliebigen Namen haben. Der
> Compiler hat lediglich eine eingebaute Heuristik, die am Ende für
> irgendwelche auf _vect endende Namen eine Warnung "may be a misspelled
> signal handler" (oder so ähnlich) ausspuckt, [...]

Geprüft wird auf Präfix "__vector"; es wir ja erst nach dem Präprozessor 
getestet.

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


Lesenswert?

Johann L. schrieb:
> Geprüft wird auf Präfix "__vector"; es wir ja erst nach dem Präprozessor
> getestet.

Ach so, ich dachte, es werden alle auf "_vect" endenden (und folglich 
nicht ersetzten) Funktionsnamen gewarnt. Stattdessen andersrum: alle mit 
"signal"-Attribut versehenen Funktionen, die nicht mit "__vector" 
anfangen. Hat Sinn.

Für David bleibt der Effekt der gleiche: er bekommt eine Warnung. ;-)

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.