2008-12-27 7 views
12

¿Es posible desactivar la optimización de una función específica? Un amigo mío tiene el problema de que la optimización de gcc hace que algunos (desconocidos para mí) μ-controller-code no funcionen. Sabemos qué funciones es, pero no tenemos ninguna pista del código en sí, así que la forma más fácil y segura sería simplemente apagarla para toda la función.Desconectando la optimización para una función específica en gcc 4.2.2

Lamentablemente http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html muestra que hay un atributo de función de optimización/pragma, pero requiere gcc 4.4, que no tenemos.

gracias de antemano

+2

¿Por qué no reparar el código en lugar de tratar de evitar la advertencia? –

+0

GCC 4.3.2 es la última versión actual de GA versión, por lo que no es sorprendente que no tenga GCC 4.4. La información que proporciona es interesante, gracias. –

Respuesta

12

Si el pragma no funciona para usted, intente dividir la función en su propio archivo, y luego compilar ese archivo sin el indicador de optimización establecido.

3

no puedo decir con certeza pero por lo que yo sepa, no existe tal posibilidad. Sin embargo, la optimización nunca debe alterar la semántica de un código bien definido. Lo único que podría suceder aquí es que una variable se inserte o que el orden de lectura/escritura se modifique.

El primero, y probablemente ambos problemas pueden resolverse declarando la (s) variable (s) involucrada (s) como volatile, mostrando al compilador que no deben hacerse suposiciones sobre su contenido, basadas únicamente en el flujo del programa.

+0

Consideré este, sería bueno tenerlo como un atributo de función o algo similar. Gracias –

7

Puede poner la función en un archivo separado y compilar ese archivo sin optimización, pero la mejor solución sería averiguar qué está mal con el código y solucionarlo.

Uno de los errores más comunes que aparece cuando la optimización está habilitada con gcc es con un alias estricto. Asegúrese de que todas las advertencias estén habilitadas y vea si recibe alguna advertencia que pueda ayudarlo a descubrir cuál es el problema. Si no puede resolverlo, intente reducir el problema a un programa pequeño y completo y publicarlo aquí.

4

Dejando de poner la función en su propio archivo, no creo que haya ninguna manera de desactivar la optimización de una función por nivel de función usando versiones anteriores de GCC. Pero en lugar de desactivar la optimización para esta función, puede intentar desactivar ciertos tipos de optimizaciones en todo el programa. Si bien ha identificado un error en esta función en particular, esto probablemente apunta a la existencia de otros errores no descubiertos.

Como otros señalaron, es probable que el culpable sean las optimizaciones con respecto a 'strict aliasing'. Si bien a largo plazo probablemente debas arreglar el código en cuestión, en el corto plazo podrías jugar agregando '-fno-strict-aliasing' a tu línea de comando. En -O2 y superior, el compilador realiza ciertas suposiciones sobre las interacciones entre punteros. Agregar esta opción le dice que no haga estas suposiciones.

Si esto falla, y si por alguna razón el código no puede ser reparado, puede intentar deshabilitar el otro optimization options.

5

Las respuestas hasta ahora han descuidado las palabras clave en la pregunta original, que son "código de microcontrolador" Es muy común cuando se escribe dicho código para desactivar optimizaciones - optimizadores agresivos "optimizarán" declaraciones enteras cuya efecto secundario es conducir el controlador. Este es un mundo diferente de la aplicación codificación. Para una aplicación en el espacio habitual de programación, vine aquí buscando para la misma información con el fin de evitar tener una rutina para la suma de Kahan (ver wikipedia) optimizado en la nada.Así que no supongamos que un cambio en el nivel de optimización generando un comportamiento diferente del programa es automáticamente un signo de código incorrecto. Algunas cuestiones se pueden descartar mediante el uso inteligente de la palabra clave volátil y, en algunos casos, , se debe generar el lenguaje ensamblador real e inspeccionarlo. (Creo que esto aún se puede hacer con el modificador -S a gcc). Recordemos que C pretende ser una especie de ensamblador portátil, no un tipo de COBOL.

Dave

3

Sé que esta es una publicación anterior. La página de GCC que OP ofrece en realidad dice: Para evitar que estas llamadas se optimicen, coloque asm (""); en la función. Supongo que esta es una solución fácil. Bien, espero que pueda ayudar a otras personas como yo.

2

Para las personas que todavía usan la versión anterior de gcc: La versión más nueva de gcc resuelve este problema. Lo he usado con éxito en gcc-4.5.1. Goodluck.

+1

Por favor, dígale cómo hacerlo con esa versión. – user2284570

Cuestiones relacionadas