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 declaracionesif
, 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?
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. –
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. –