Optimizar llamado de funciones en C

Hola, Estoy programando un PIC16F877 con el compilador CCS PCW V3.242 y por ejemplo tengo una funcion como la siguiente por ejemplo:

void funcion_1()
{
......
funcion_2();
funcion_3();
}

void main
{
while (true)
{
funcion_1();
}
}

al compilar me dice que no alcanza la memoria del pic, pero si escribo el codigo de la siguiente forma solo ocupa el 40% de la rom incluyendo todo el resto del codigo de programa

void funcion_1()
{
......
si=1;
}

void main
{
while (true)
{
funcion_1();
if(si) {si=0;funcion_2();funcion_3();}

}
}

alguien sabe que pude ser, en realidad es solo por curiosidad y aprender para tenerlo en cuenta en otras oportunidades,ya que el programa esta funcionando.

Muchas Gracias por su tiempo

Saludos
 
que mas power?

considero que la respuesta a tu pregunta esta en lo siguiente, muy de seguro que el compilador toma la funcion como "inline", eso para el primer caso, de ser asi, el compilador intenta escribir todas las funciones dentro del ciclo while() al momento de compilar el programa, por lo que muy seguro, a parte de definirlas, las reescribe dentro del codigo principal, luego, para el segundo caso, como existe un condicional, muy seguramente el compilador considera que no es una funcion inline, es decir, que al momento de usar las funciones, no las reescribe todas dentro del ciclo while() si no que por el contrario, las llama donde estan guardadas, y por ende no gasta mas memoria... creo que por ahi va la respuesta del por que... o al menos es lo mejor que se me ocurre, si a alguien se le ocurre otra idea que la comente aqui y de paso aprendemos... por ahora, mi consejo es el siguiente, antes de definir la funcion, escribe #separate, aunque eso puede provocar una perdida de memoria en el stack, y mas bien entonces es por eso que se queda sin memoria... pues el stack de los pic por lo general es de hasta 8 de profundida si mal no estoy, o algo asi, es decir, aguanta 8 llamadas a un call en asembler anidados y regresa como si nada, en todo caso, lo mas probable es que sirva, leete un poco el manual del compilador y nos comentas, a ver que conclusion podemos sacar de alli, cuidate...
 
Hola Leo, muchas gracias por responder.Estuve leyendo el manual y tenes razon, El compilador cuando la funcion no tiene la directiva #INLINE decide cuando es mejor implentarla como inline con el objeto de aumentar la velocidad y reservar espacio en el STACK que como bien dices tiene 8 posiciones. Segun el manual hay que tener cuidado al usar la direcitiva #SEPARATE, ya que esta implenta la funcion en forma separada ahorrando ROM pero no tiene en cuenta si se sobrepasa el octavo nivel del stack con la consiguiente perdida del contador de programa.

Saludos
 
Atrás
Arriba