domingo, 6 de mayo de 2012

Técnicas de optimización en sistemas integrados.

Un sistema integrado a menudo se ejecuta en los procesadores con capacidad de procesamiento limitada, por lo tanto es necesario que utilicemos algunas técnicas de optimización ya que como he hablado de otras entradas, tiene recursos limitados, y en esta, hablaré de algunos puntos que debemos considerar para hacer mejor un código para computo integrado.


Minimizar las variables locales.

Si tenemos muchas variables locales en una función que no tiene mucha importancia, el compilador será capas de acoplarlos con los registros, por lo que, podemos evitar que se haga ese puntero en la pila, entonces tendríamos de ganancia que el compilador no tendrá sobrecarga en tener que crear y restaurar los punteros de la pila que se crea, entonces, podemos decir que nos favorece.


Declarar variables locales entre más "interno" mejor.

No declarar todas las variables al principio de una función o en una función externa, nostros podremos tener un mejor rendimiento si las variables se declaran cuando las vamos a utilizar, por ejemplo esto quiere decir que si tenemos una función y dentro de esa función tenemos un if, y en esa condición, necesitamos una variable, declararla ahí dentro y no cuando iniciamos la función.


Saber utilizar las variables

Por ejemplo, muchas veces se utilizan erroneamente un char para realizar operaciones, esto en un sistema integrado desperdicia recursos, si decimos que vamos a sumar dos variables tipo char, necesitamos convertir estos a int y volverlos a convertir a char, por lo que debemos de tomar en cuenta el impacto que va a perjudicar al momento de alinear los bytes y como los va a ordenar, esto ahorra espacio, ya que muchos de los microoprocesadores alinean solamente 16 bytes como límite.

char suma_mala (char a, char b) {
         char c;
         c = a + b;
         return c;
}


int suma_buena(int a, int b) {
        return (a + b);
}



Ajustar el tamaño de cualquier estructura en potencia de 2.

Cuando estamos utilizando arreglos, el compilador realiza una multiplicación por el tamaño de la estructura para realizar una indexación de arreglos, por lo que si el tamaño es una potencia de 2, una operación de multiplicación que le cueste en recursos a un sistema, se sustituye por una operación barata, por lo tanto, mantener los tamaños de estructuras en una potencia de dos mejorará el rendimiento de indexación de una matriz.


Reducir el número de parámetros.

Cada que llamamos a una función con un gran número de parámetros puede ser muy costoso debido a que tenemos que "empujar" todos esos parámetros de la pila a la llamada. Es por eso que debemos evitar pasar por ejemplo, estructuras completas como parámetros, podemos pasar en vez de eso, punteros o referencias.


No definir un return si no se utiliza.

Cundo nosotros llamamos a una función, este no se sabe si el valor que va a regresar se va a utilizar, entonces siempre va a regresar ese valor, por lo que puede ser que pongamos valor alguno y omitirlo si no estamos utilizandolo posteriormente.


Inicialización de variables.

Les pongo un ejemplo.

void desastre() {
           int c;
           c = 5;
}


void mejoro() {
         int c = 5;
}

En donde podemos ver que se inicializa directamente en la versión mejorada, en lugar de declarar y luego asignar.

Espero que esto nos ayude en mejorar sus códigos y que muchas veces por eso tenemos errores al momento de pasarlos a nuestro pic o arduino, por ejemplo en mi proyecto de pic, después me dí cuenta que no funcionaba porque realizaba muchisimos errores de este tipo, debemos de recordar que es diferente la manera de trabajar con computo integrado, aquí les dejo una liga de esta página, en donde vienen algunas otras técnicas.

1 comentario: