Kürzlich habe ich versucht, mbed-OS auf Tiva-C Launchpad TM4C123 zu portieren, ich habe ein Problem mit der Datei mbed, die cmsis_nvic.c und cmsis_nvic ist. hmbed-OS Portierung auf TivaC TM4123, Trouble mit dynamischer Interruptbehandlung
Dieses Modul soll den Interrupt-Handler des OS-Timers dynamisch einer adressierbaren Funktion zuordnen (oder so weit ich es verstehe).
Was geschehen ist, die Software zu "Hard Fault-Handler" springt nach der folgenden Zeile Ausführung
vectors[i] = old_vectors[i];
Dateien Hier ist was ich
#include "cmsis_nvic.h"
#define NVIC_RAM_VECTOR_ADDRESS (0x02000000) // Vectors positioned at start of RAM
#define NVIC_FLASH_VECTOR_ADDRESS (0x0) // Initial vector position in flash
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
uint32_t *vectors = (uint32_t*)SCB->VTOR;
uint32_t i;
// Copy and switch to dynamic vectors if the first time called
if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) {
uint32_t *old_vectors = vectors;
vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
for (i=0; i<NVIC_NUM_VECTORS; i++) {
vectors[i] = old_vectors[i];
}
SCB->VTOR = (uint32_t)NVIC_RAM_VECTOR_ADDRESS;
}
vectors[IRQn + 16] = vector;
}
uint32_t NVIC_GetVector(IRQn_Type IRQn) {
uint32_t *vectors = (uint32_t*)SCB->VTOR;
return vectors[IRQn + 16];
}
verwenden Und hier ist cmsis_nvic.h
#ifndef MBED_CMSIS_NVIC_H
#define MBED_CMSIS_NVIC_H
#define NVIC_NUM_VECTORS (154) // CORE + MCU Peripherals
#define NVIC_USER_IRQ_OFFSET 16
#include "cmsis.h"
#ifdef __cplusplus
extern "C" {
#endif
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector);
uint32_t NVIC_GetVector(IRQn_Type IRQn);
#ifdef __cplusplus
}
#endif
#endif
und ich rufe
NVIC_SetVector (IRQn_Type IRQn, uint32_t vector)
aus Datei us_ticker.c ähnliche
NVIC_SetVector (TIMER0A_IRQn, (uint32_t) us_ticker_irq_handler);
(mein Compiler ARM GCC, ich CDT verwende für den Bau, und GDB openocd für das Debuggen und integriert alle diese Tools auf Eclipse)
Kann mir jemand bitte lassen Sie wissen, was hier falsch läuft ? oder zumindest wo soll ich debuggen oder lesen, um mir zu helfen, dieses Problem zu lösen ???
UPDATE
I Teil des Problems herausgefunden, wobei der Vektor zur ersten Adresse des Ziel SRAM zeigt nicht die
#define NVIC_RAM_VECTOR_ADDRESS (0x20000000)
statt
sein sollten#define NVIC_RAM_VECTOR_ADDRESS (0x02000000)
Beim Aufruf von NVIC_SetVector wird nun die Funktion ausgeführt. Aber dann, wenn der Interrupt aktiviert wird, springt Software immer noch auf Hard Fault, ich vermute (nur raten oder könnte Teil der Lösung sein), dass die Definitionen in der Header-Datei nicht korrekt konfiguriert sind. Kann mir jemand erklären, was sie bedeuten? und wie berechnet man die Anzahl der Vektoradressen? und was ist der USER OFFSET?
Was ist der Wert von 'i'? Das heißt, wenn> 0, dann wurden einige in Ordnung gesetzt. Wenn nicht, verwende gdb, um die Werte zu drucken. Sie sind fest '16' - ist das' NVIC_USER_IRQ_OFFSET'? Wenn ja, benutze es. Könnten Sie über das Ende hinaus laufen (z.B. 'i'> =' NVIC_NUM_VECTORS'). Kannst du 'Vektoren' mit gdb pokern? Ist VTOR beim Start gültig? (d. h. ist einer der zwei korrekten Werte: 0/0x2000000). Holt es "alte_Vektoren" oder speichert "Vektoren" das Problem (d. H. "X = alte_vektoren [i]; Vektoren [i] = x;" und sehe, welche Zeilenfehler)? Ich hoffe, du machst '-O0' zum Debuggen. Brauchen Sie 'volatile' auf einer der Zeigervariablen? –
Ich habe die Frage aktualisiert? Können Sie es bitte überprüfen und lassen Sie mich wissen, wenn Sie eine Antwort haben? –
Was ist 'TIMER0A_IRQn' definiert? Ist es die Vektornummer oder die Unterbrechungsnummer (Vektorzahl minus 16), wie der Code erwartet? Siehe auch Tabelle 2-9 im Datenblatt; Sie haben einen _lot_ mehr als 66 periphere IRQs ... – Notlikethat