2010-04-26 15 views
7

CCG estados de documentación en 6.30 Declaring Attributes of Functions:Usando el atributo "desnudo" para las funciones de GCC

naked

utilizar este atributo en el brazo, puertos AVR, ip2k, RX y SPU para indicar que el especificado la función no necesita secuencias de prólogo/epílogo generadas por el compilador. Depende del programador proporcionar estas secuencias. Las únicas declaraciones que se pueden incluir de forma segura en las funciones desnudas son las declaraciones asm que no tienen operandos. Deben evitarse todas las demás afirmaciones, incluidas las declaraciones de variables locales, las declaraciones if, etc. Las funciones desnudas se deben usar para implementar el cuerpo de una función de ensamblaje, al tiempo que se permite al compilador crear la declaración de función necesaria para el ensamblador.

¿Puedo llamar con seguridad a las funciones usando la sintaxis C desde funciones desnudas, o solo usando asm?

Respuesta

4

Si lo único que hace en la función de desnudo es llamar a otra función, puede usar una sola instrucción de código de máquina JMP.

La función a la que salta tendrá un prólogo válido y deberá devolverlo directamente a la persona que llama de la función desnuda ya que JMP no empuja una dirección de retorno en la pila.

+1

Hice mi pregunta, porque en el origen de FreeRTOS para AVR he visto el siguiente void vPortYield (void) __attribute__ ((naked)); void vPortYield (void) { \t portSAVE_CONTEXT(); \t vTaskSwitchContext(); \t portRESTORE_CONTEXT(); \t asm volátil ("ret"); } portSAVE_CONTEXT() y portRESTORE_CONTEXT() son macros con asm pero vTaskSwitchContext es una función. –

+2

Esta respuesta es incorrecta. Puedes hacer cualquier cosa en una función desnuda que harías en cualquier otro lugar siempre y cuando implementes el ABI; esto significa que debes saber, comprender y ser capaz de predecir con fiabilidad el ABI que se está utilizando. Además, la documentación es incorrecta, porque puede acceder de forma segura a las variables globales desde la instrucción asm sin efectos secundarios adversos, pero debe poner "memoria" en los trozos, si lo hace. –

0

Las únicas declaraciones que se pueden incluir de forma segura en las funciones desnudas son las sentencias asm que no tienen operandos. Deben evitarse todas las demás afirmaciones, incluidas las declaraciones de variables locales, las declaraciones if, etc.

Basado en la descripción que ya dio, supongo que incluso las llamadas a funciones no son adecuadas para la palabra clave "desnuda".

5

Puede llamar de forma segura a funciones desde una función desnuda, siempre que las funciones llamadas tengan un prólogo y un epílogo completos.

Tenga en cuenta que es un poco absurdo afirmar que puede 'usar' de forma segura el lenguaje ensamblador en una función desnuda. Usted es totalmente responsable de todo lo que haga utilizando el lenguaje ensamblador, como lo es para cualquier llamada que realice a funciones 'seguras'.

Para asegurarse de que su función llamada genérica no es estática o está en línea, debe estar en una unidad de compilación independiente.

funciones "desnudas" no incluyen ningún prólogo o epílogo: están desnudos. En particular, no incluyen operaciones en la pila para variables locales, para guardar o restaurar registros, o para regresar a una función de llamada.

Eso no significa que no exista ninguna pila: la pila se inicializa en la inicialización del programa, no en ninguna inicialización de función. Como existe una pila, los denominados prólogos de función y epílogos funcionan correctamente. Una llamada de función puede presionar con seguridad su dirección de retorno, cualquier registro utilizado y espacio para cualquier variable local. Al regresar (usando la dirección de retorno), los registros se restauran y se libera el espacio de la pila.

Las funciones estáticas o inline pueden no tener un prólogo y un epílogo completos. Pueden y pueden depender de la función de llamada para administrar la pila y restaurar registros corruptos.

Esto lleva al siguiente punto: necesita el prólogo y el epílogo solo para encapsular las operaciones de la función llamada.Si la función llamada también es segura (sin variables locales explícitas o implícitas, no hay cambios en los registros de estado), puede ser estática y/o en línea de forma segura. Al igual que con asm, sería su responsabilidad asegurarse de que esto sea cierto.

Cuestiones relacionadas