Hay 3 componentes para su uso de pila:
- direcciones de retorno Función de llamada
parámetros de llamada
- función
- variables automáticas (locales)
La clave minimizar el uso de la pila es minimizar el paso de parámetros y las variables automáticas. El consumo de espacio de la llamada a la función real en sí es bastante mínimo.
Parámetros
Una manera de abordar la cuestión parámetro es pasar una estructura (a través de puntero) en lugar de un gran número de parámetros.
foo(int a, int b, int c, int d)
{
...
bar(int a, int b);
}
hacer esto en su lugar:
struct my_params {
int a;
int b;
int c;
int d;
};
foo(struct my_params* p)
{
...
bar(p);
};
Esta estrategia es buena si se pasa por una gran cantidad de parámetros. Si los parámetros son todos diferentes, entonces podría no funcionarle bien. Usted terminaría con una estructura grande que se pasa y que contiene muchos parámetros diferentes.
variables automáticas (locales)
Esta tienden a ser el mayor consumidor de espacio de pila.
- Las matrices son el asesino. ¡No defina arrays en sus funciones locales!
- Minimice el número de variables locales.
- Utilice el tipo más pequeño necesario.
- Si la reentrada no es un problema, puede usar las variables estáticas del módulo.
Tenga en cuenta que si simplemente está moviendo todas sus variables locales del ámbito local al ámbito del módulo, NO ha guardado ningún espacio. Has cambiado el espacio de la pila por el espacio del segmento de datos.
Algunos RTOS admiten el almacenamiento local de subprocesos, que asigna almacenamiento "global" por subproceso. Esto podría permitirle tener múltiples variables globales independientes por tarea, pero esto hará que su código no sea tan directo.
+1 inline .... preguntándose si los compiladores modernos lo hacen automáticamente? – kenny