es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Modificación de dirección de retorno en el controlador de excepción de gcc.

Actualmente estoy escribiendo código bare-metal para, entre otros, armv6-m utilizando (arm-none-eabi-) gcc como compilador.

Al implementar los manejadores de excepciones, me encontré con attribute((interrupt(“”type””))) (manual), que indica a gcc que genere una función que preserva todos los registros (excepto los bancarios).

El problema es que esta función generada siempre devuelve (más o menos) la ejecución a donde se suponía que debía estar antes de la interrupción. Si bien es deseable para interrupciones regulares, esto es exactamente lo que no quiero cuando se trata de, por ejemplo, excepciones de instrucción indefinida, ya que entonces me ciclaría en dicha instrucción indefinida. Si bien puedo encontrar una macro que se supone que me devuelve la dirección de retorno, no puedo encontrar una para establecerla o modificarla. Esto parece ser algo obvio que debería estar incluido, por ejemplo, en el tipo “undef”, ya que volver al pc anterior garantiza, básicamente, volver a desencadenar la excepción.

TL; DR: ¿Hay alguna forma de modificar la dirección de retorno de un manejador de interrupciones o una función c general en gcc?

Y por favor, no me digas que simplemente escriba un contenedor de ensamblaje, sé que eso lo arreglaría y ya tengo algunos de esos, pero si este trabajo ya está hecho por gcc, preferiría no preocuparme por la corrupción de registro y la optimización yo mismo.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    TLDR: ¿Existe alguna manera de modificar la dirección de retorno de un manejador de interrupciones o una función general en C en gcc?

Comments are closed.