2016-07-29 26 views
0

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?

+0

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

+0

Ich habe die Frage aktualisiert? Können Sie es bitte überprüfen und lassen Sie mich wissen, wenn Sie eine Antwort haben? –

+0

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

Antwort

1

Ich habe dieses Problem gelöst, hier ist was ich gefunden habe,

1- NVIC_RAM_VECTOR_ADDRESS war nicht die erste Adresse meines Ziel RAM, das `0x20000000'

2- Linkers Datei so aktualisiert werden soll sein sollte dass der Stapelzeiger nicht über die neue kopierte Vektortabelle schreiben soll. Verschieben Sie die RAM-Adresse also um die Anzahl der Bytes, die die Vektortabelle belegen soll.

3- (Die Hauptursache) innerhalb der Funktion NVIC_SetVector, i wurde als uint32_t deklariert und dann mit weniger als 255 Pre-Prozessor-Wert verglichen. So kompilieren durch mit uint8_t, durch Hinzufügen UL zum Vorrechner-Wert zu verwechseln verwirrt, löste es das ganze Problem.