Falsche/Überflüssige ISR Vektoren

OP Persönliche Seite #5955412
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
(Firma: matzetronics) #5955415
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
Moderator Persönliche Seite #5955423
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
Persönliche Seite #5956835
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.
Moderator Persönliche Seite #5956852
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. ;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.