El AVR (la familia de microcontroladores que se usa tradicionalmente en las placas Arduino) es una arquitectura de Harvard , lo que significa que el código ejecutable y las variables están en dos memorias separadas, en este caso flash y SRAM. El código ejecutable nunca deja memoria flash.
Cuando llama a una función, la dirección de retorno generalmente se transfiere a la pila; la excepción es cuando la llamada a la función ocurre al final de la función de llamada. En este caso, se utilizará la dirección de retorno de la función que llamó a la función de llamada; ya está en la pila.
Si cualquier otro dato se coloca en la pila depende de la presión de registro en la función de llamada y en la función llamada. Los registros son el área de trabajo de la CPU, el AVR tiene 32 registros de 1 byte. Se puede acceder directamente a los registros mediante instrucciones de la CPU, mientras que los datos en SRAM primero deberán almacenarse en los registros. Solo si los argumentos o la variable local son demasiado grandes o demasiados para caber en los registros, se colocarán en la pila. Sin embargo, las estructuras siempre se almacenan en la pila.
Puede leer los detalles de cómo el compilador GCC utiliza la pila en la plataforma AVR aquí: https://gcc.gnu.org/wiki/avr-gcc#Frame_Layout
Lea las secciones "Diseño de marco" y "Convención de llamadas" .