in AVR die Interrupt-Vektortabelle (IVT) beginnt bei der Adresse 0 in ROM, wenn wir unseren Code beginnt bei der Adresse 0 von .ORG 0 machen, werden wir die IVT Inhalte überschreiben und dann zurückgesetzt und die anderen Interrupts werden nicht richtig funktionieren?IVT Inhalt overwiting um es zu schreiben ist Adresse
1
A
Antwort
2
Das ist richtig. Wenn Sie keine Interrupts aktiviert haben, ist das kein Problem, nur eine schlechte Übung. Die übliche Methode ist, das Programm höher im Flash zu starten und die Anweisung bei 0 (die Position des Rücksetzvektors) zu Ihrem Code springen zu lassen. Auf diese Weise können Sie später Interrupt-Vektoren hinzufügen, wenn Sie möchten.
, wenn ich den Code unter der Adresse 0 alle der Interrupt mit Ausnahme der Reset-Taste funktionierte nicht geschrieben, die den Reset-Vorgang richtig tat und alle I/O-Register gelöscht, wie kam es trotz der Tatsache arbeiten, dass der Reset bei der Adresse 0 zeigt nicht mehr auf den Reset-Vektor? –
Jeder Vektor befindet sich an einem Ort, der von der nur 4 Byte langen Hardware festgelegt wird. Das ist nur genug Platz für einen JMP-Befehl. Der Reset-Vektor zeigt normalerweise nur auf den Anfang Ihres Codes. Da Ihr Code bei 0 beginnt, war die Anweisung jmp nicht erforderlich. Jeder andere Vektor ist ein Punkt am Anfang des Codes und nicht unbedingt am Anfang eines Befehls. (Befehle können verschiedene Längen haben, nicht nur 4 Bytes.) Der Vektor wird höchstwahrscheinlich Unsinn für eine Anweisung enthalten, ebenso wie jede nachfolgende "Anweisung", die darauf folgt. – UncleO
@AliMak: Der Hardware-Reset bewirkt, dass alle Register auf ihre Standardwerte gesetzt werden, einschließlich des Programmzählers auf Null. AVRs Vektortabelle ist keine echte Vektortabelle (die nur Adressen enthalten würde), sondern fest verdrahtete Adressen, zu denen bei Interrupt/Exception gesprungen werden kann. Um eine echte Vektortabelle zu "emulieren", wird der Bereich normalerweise mit JMP-Anweisungen gefüllt. Auf Prozessoren mit einem echten IVT wie Cortex-M würde dies nicht funktionieren; im Falle von Cortex-M enthält die Adresse 0000h einen anfänglichen Stack-Pointer-Wert und Adresse 0004h die Adresse, an der die Ausführung beginnen soll - es sind keine Anweisungen. – Clifford