2012-08-28 5 views
5

Ich verwende Raison7/Codesourcery (a.k.a Sourcery CodeBench Lite) mit einer STM32F4-Platine, die eine Bare-Metal-HMI-Plattform entwickelt.GCC arm-none-eabi (Codesourcery) und C++ Ausnahmen

Ich werde C++ - Ausnahmen in diesem System verwenden, aber jede Ausnahme, die ich werfe, endet mit einem "Terminate rekursiv" -Fehler, der in stderr geschrieben wurde.

Code, um das Problem zu reproduzieren: (main.cpp)

int main(void) 
{ 
    try { 
     throw 1; 
    } 
    catch (...) { 
     printf("caught"); 
    } 
} 

Ich habe bereits versucht, Raisonance und andere Quellen für eine Auflösung und haben jede verwertbare Hilfe nicht erhalten.

Mögliches Problem/Lösung 1:

Ich habe in anderen Foren gefragt und sie erwähnt, dass ich statische Konstruktionen in meinem Startbaugruppendatei aufrufen müssen die Abwicklungstabellen initialisiert werden (zumindest das ist, was ich sie denken, reden), aber ich habe keine Ahnung, wie ich das machen soll.

Mögliches Problem/Lösung 2

Ich habe entdeckt, auch einen Fehler in binutils/Gas, das hier die Quelle meiner Probleme sein kann (http://sourceware.org/bugzilla/show_bug.cgi?id=13449). Ich habe versucht, meine eigene Version der Toolchain mit diesem Patch zu bauen, aber das wird zu einem eigenen Projekt und ist noch nicht gelungen.

Die Frage

Muss ich etwas in Code tun Verwendung von C++ Ausnahmen zu machen, oder ist dies wahrscheinlich ein Fehler im Toolkette? Wenn ersteres, bitte erläutern.

+0

Sehr wenig eingebetteten Werkzeugketten Unterstützung Ausnahmen richtig, wenn über an. Meiner Meinung nach ist die Verwendung von Ausnahmen in eingebetteter Software eine schlechte Idee. –

+2

@IgorSkochinsky Ich wusste, dass jemand das sagen würde. Die Dokumentation von Codesourcery legt eindeutig die Unterstützung für C++ - Ausnahmen fest. Ich kenne meine Anforderungen und weiß, dass die Verwendung von Ausnahmen die richtige Entscheidung für mein Projekt ist, aber das ist für die vorliegende Frage irrelevant. – Verax

+0

@verax welche libc sind Sie gegen verlinkt? Ich frage mich, ob Sie ein Missverhältnis haben? – marko

Antwort

2

Nach einiger Überzeugung, die nicht notwendig gewesen sein sollte, kam Raisonance schließlich mit einer Änderung an ihrem Standardlinkerskript durch, das das Problem reparierte. Es kann nicht legal sein für mich die gesamte Linker-Skript zu schreiben, aber hier ist das Wissen, dass man

hinzufügen Zu dem .text Abschnitt

*(.eh_frame) 

diese Abschnitte hinzufügen wissen muss (Name YourMemory nach zu den Speicherblöcken, die Sie in Ihrem Linker-Skript eingerichtet haben.Meins war Flash-)

.ARM.extab : 
{ 
    *(.ARM.extab* .gnu.linkonce.armextab.*) 
} >YourMemory 

.ARM : 
{ 
    __exidx_start = .; 
    *(.ARM.exidx*) 
    __exidx_end = .; 
} >YourMemory 

Stellen Sie sicher, diese Linie tritt im bss Abschnitt

*(.bss*) 

Während auf dieser Suche bin ich auf den folgenden nützlichen Ressourcen lief