2017-12-08 2 views
1

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?

+1

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. –

+1

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) ... –

+0

Ja, ich teste einige Geräte und simuliere das Abfeuern vom Interrupt. –

Antwort

5

In Cortex-M ist es möglich, die Adresse der Vektortabelle zur Laufzeit einzustellen. Um also einen bestimmten Vektor zu setzen, müssen Sie die Vektortabelle im RAM finden.

Die einfachste Methode in diesem Fall ist, die Vektortabelle, auf die exception_table zeigt, in den RAM zu kopieren, den spezifischen Vektor in der RAM-Kopie zu ändern und die Vektortabelle in die RAM-Kopie zu ändern.

Beachten Sie jedoch, dass der Vector Table Offset Register optional auf Cortex-M0 + ist und nicht auf allen Geräten implementiert werden kann. Es ist jedoch implementiert auf SAMD21 (siehe 7.1.1 der datasheet summary.

-1

Sie können die Vektortabelle in den RAM platzieren oder wenn Sie es nicht möchten, können Sie es an den neuen Speicherort im FLASH-Speicher kopieren ändern Der ISR-Vektor Dann können Sie die Adresse der Vektortabelle selbst ändern

Verwandte Themen