einzustellen Ich habe eine "default" resetVectors.c Datei für meine SAMD21 ARM M0 +. Es hat etwas, das wie folgt aussieht:Ist es möglich, ISR Handler zur Laufzeit auf M0 +
__attribute__ ((section(".vectors")))
const DeviceVectors exception_table = {
...
};
darin definiert, wo verschiedene Handler stubs. Zu Testzwecken möchte ich einen der unbenutzten peripheren IRQs verwenden.
Standardmäßig werden die nicht verwendeten auf NULL-Adressen festgelegt. Ich habe mir selbst gezeigt, dass ich diese Datei modifizieren kann und zur Kompilierzeit meine unbenutzte IRQ (21) ändere, um einen Handler zu feuern. ABER, ist es möglich, dies außerhalb der Kompilierzeit zu tun? Also habe ich versucht, diese
ich beobachtet, dass die Tabelle bei Offset 0 zu basieren scheint:
DeviceVectors *table = 0x0000000;
table->pvReserved21 = PV21Handler;
Aber das hängt nur das Brett. Gibt es eine dynamische Möglichkeit, den Handler zur Laufzeit zuzuordnen?
Nein, höchstwahrscheinlich können Sie nicht, da die Vektortabelle normalerweise in einem nicht beschreibbaren Speicher sitzt (siehe Abschnitt '.vectors '' ist im Linker-Skript definiert. Aber natürlich können Sie eine Handler-Tabelle der zweiten Ebene erstellen, die veränderbar sein kann. –
einige Chips lassen Sie tauschen, was auf Adresse null zugeordnet ist, um zur Laufzeit zu rammen, müssten Sie dann Ihre Tabelle kopieren über, dann können Sie es ändern, aber es ist sehr Chip-spezifisch, wenn überhaupt möglich, mit der Flash-Hand Überprüfen Sie einen ram-basierten Handler, wie Eugene darauf hingewiesen hat, ist Ihre beste Wette. Dies ist kein allgemeiner Anwendungsfall für Mikrocontroller (um Vektoren im laufenden Betrieb zu ändern) ... –
Ja, ich teste einige Geräte und simuliere das Abfeuern vom Interrupt. –