2012-08-28 20 views
5

Estoy usando Raisonance's Ride7/Codesourcery (a.k.a Sourcery CodeBench Lite) con una placa STM32F4 que desarrolla una plataforma HMI bare metal.GCC arm-none-eabi (Codesourcery) y C++ Excepciones

Haré uso de las excepciones de C++ en este sistema, pero cualquier excepción que arroje termina con un error "Terminar llamada recursivamente" escrito en stderr.

código para reproducir el problema: (main.cpp)

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

He intentado ya Raisonance y otras fuentes para una resolución y no han recibido ningún tipo de ayuda procesable.

potencial problema/solución 1:

le he pedido en otros foros y mencionan necesito llamar construcciones estáticas en mi archivo de ensamblaje de inicio para inicializar las tablas de desenredo (al menos eso es lo que creo que están hablando), pero no tengo idea de cómo hacer esto.

problema/solución de 2

Potencial También he descubierto un bug en binutils/gas que puede ser la fuente de mis problemas aquí (http://sourceware.org/bugzilla/show_bug.cgi?id=13449). He estado tratando de construir mi propia versión de la cadena de herramientas con este parche, pero eso se está convirtiendo en un proyecto en sí mismo, y aún no lo han logrado.

La pregunta

¿Necesito hacer algo en el código para hacer uso de excepciones de C++, o es probable que un error en la cadena de herramientas? Si el primero, por favor elabora.

+0

muy pocas excepciones de apoyo cadenas de herramientas integrados adecuadamente, en todo caso. En mi opinión, usar excepciones en el software integrado es una mala idea. –

+2

@IgorSkochinsky Sabía que alguien iba a decir eso. La documentación de Codesourcery establece claramente el soporte para las excepciones de C++. Conozco mis requisitos y sé que usar excepciones es la decisión correcta para mi proyecto, pero eso es irrelevante para la pregunta en cuestión. – Verax

+0

@verax ¿con qué libc está vinculado? Me pregunto si tienes un desajuste? – marko

Respuesta

2

Después de una persuasión que no debería haber sido necesaria, Raisonance finalmente llegó con una modificación a su script de enlazador predeterminado que solucionó el problema. Puede que no sea legal para mí para publicar todo el guión enlazador, pero aquí está el conocimiento que se necesita conocer

añadir esto a la sección .text

*(.eh_frame) 

Añadir estas secciones (nombre YourMemory de acuerdo a los bloques de memoria que ha configurado en su secuencia de comandos del enlazador.El mío era flash)

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

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

Asegúrese de esta línea se presenta en la sección BSS

*(.bss*) 

Si bien en esta búsqueda, me encontré con los siguientes recursos útiles