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
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:
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:
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?)
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.
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.
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. ;-)
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.