2012-03-26 2 views
0

Ich habe diese Frage auf dem SCB-Forum, aber habe keine Antwort Ich versuche, einige Projekte von uVision IDE zu SCB zu portieren. Die Probleme begannen mit der Implementierung der Vektortabelle. Für examle habe ich einfache C++ CodeSourcery CodeBench ARM Cortex-M-Vektor Tabelle Implementierung

#define STACK_TOP 0x20000800 
typedef void (*handler_ptr)(); 

void ResetHandler() { while (1); } 
void NMIHandler() { while (1); } 
void HardFaultHandler() { while (1); } 

__attribute__ ((section("vectors"))) handler_ptr const vector_table[] = { 
    (handler_ptr) STACK_TOP, 
    ResetHandler, 
    NMIHandler, 
    HardFaultHandler, 
}; 

Dieser Code kompiliert nicht, weil SCB-Bibliothek für "int main (void)" Erklärung suchen. Ok, ich kann diese Funktion hinzufügen, aber dann ignoriert SCB meine Implementierung der Vektortabelle und verwendet eigene (wenn ich Funktion, die Adresse in VT aufrufen, sehe ich SCB Dummy-Handler).

Wie kann ich SCB VT-Implementierung von mir neu schreiben? Bitte bieten Sie nicht die Verwendung von speziellen SC3-Funktionsnamen an (es ist nicht gut, sie mit 2 IDEs zu unterstützen) oder verschieben Sie die Vektortabelle an einen anderen Speicherort.

__attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void) 

von Luminary Micros "startup_gcc.c - Startup-Code für die Verwendung mit GNU-Tools" hat keine Auswirkung zu

Danke.

Antwort

1

Wenn es um Low-Level-C-Erweiterungen für eingebettete Unterstützung geht, ist es unwahrscheinlich, dass Sie mit einem einzigen Ansatz für beide Compiler durchkommen. Selbst die offizielle CMSIS-Distribution von ARM hat für jeden unterstützten Compiler noch eigene Startups.

Was jedoch besser funktionieren könnte als die explizite Tabellendeklaration ist es nicht enthalten. Deklarieren Sie einfach die Handler, die Sie implementieren möchten; Die CMSIS-Startups markieren ihre eigenen Stubs normalerweise als WEAK-Funktionen, so dass Ihre Priorität hat. Sie müssen jedoch sicherstellen, dass Sie die Standardnamen für Handler verwenden, wie vom Linker erwartet (z. B. Reset_Handler, , WWDG_IRQHandler usw.). Weitere Informationen finden Sie unter CMSIS docs und Quelldateien.

NB: Eine Sache, auf die Sie achten sollten, ist, dass Sie den extern "C" Marker hinzufügen, wenn Sie als C++ kompilieren - andernfalls wird der Linker Ihre Handler nicht sehen.

+0

Igor, danke. Du hast recht. Die beste Lösung ist eine separate Header-Datei für jeden Compiler. Ich finde den richtigen Sektionsnamen in der Linker-Datei - ".cs3.interrupt_vector", aber Linker platziere meine Vektor-Deklaration nachdem SCB generiert wurde. –

+0

Ich habe es geschafft, ein C++ - Projekt mit der gleichen "vectors.c/h" -Datei für Keil ARM 6.6 und GCC 6 für den Cortex M7 zu erstellen. Da der Keil-Compiler (der über uVision aufgerufen wird - benötigt einen dedizierten Rant) - vordefinierte Abschnitte (z. B. RESET) hat, habe ich das GCC-Linker-Skript so geändert, dass es übereinstimmt. Der schwierigere Teil besteht darin, den Stapel so einzurichten, dass er derselbe ist. Nicht so gut sortiert. – Flip