TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micronet3 en 05 de Agosto de 2009, 08:47:24
-
hola, para el control de los pines de entrada y salida he visto que algunos utilizan las siguientes directivas
#USE FAST_IO(puerto);
Este método rápido de hacer I/O ocasiona que el compilador realice
I/O sin programar el registro de dirección
#USE FIXED_IO(puerto);
El método fijo de hacer I/O causará que el compilador genere código
para hacer que un pin de I/O sea entrada o salida cada vez que se utiliza. Esto ahorra
el byte de RAM usado en I/O normal.
#USE STANDAR_IO(puerto);
El método standar de hacer I/O causará que el compilador genere
código para hacer que un pin de I/O sea entrada o salida cada vez que se utiliza.
E leido el manual pero no me esclarece del todo cual es la ventaja de cada uno, o mejor dicho en que situaciones es mejor utilizar uno de ellos, o como selecciono el adecuado para un programa especifico?.
-
#USE STANDAR_IO:
Al colocar esta directiva en el programa el compilador cambiara el registro TRIS correspondiente antes de realizar alguna operacion con los puertos GPIO. Este metodo es para principiantes, pues desliga al programador el tener que conocer de la configuración de todos los puertos y lo unico que tiene que hacer es ejecutar la acción que desea. El inconveniente de este metodo es que el compilador ejecuta la instrucción set_tris cada vez que hay que ejecutar una operación de salida o entrada sin importar el estado anterior del puerto, lo que resulta en un código no optimizado en general mas largo de lo necesario.
#USE FAST_IO:
Esta directiva especifica que el compilador no ejecuta ningun cambio de dirección en los puertos y da por entendido que la persona que programa asigna y se asegura el valor que corresponde a los registros TRIS antes de realizar una operación IO. Esta asignacion de las direcciones debe hacerse ejecutando la instrucción set_tris_A(), set_tris_B(), etc antes de realizar alguna acción con el puerto en cuestión.
Este modo de programar requiere un conocimiento completo de la ejecución del programa y de todas las posibilidades que pueden sucederse, lo cual puede llegar a ser un problema para alguien que recién comienza. La clara ventaja de este metodo es que no hay más direccionamiento de puertos que los necesarios (Si el programador ha escrito el código con criterio) y por lo tanto se ahorra mas memoria y se reduce el tiempo de ejecución comparado con el modo STANDAR_IO.
#USE FIXED_IO:
Este metodo permite especificar la direcciones de los puertos mediante una directiva de preprocesador, por lo que estas serán fijas a lo largo de todo el programa. Aunque puede utilizarse la instrucción set_tris para cambiar la función de los pines, el compilador ejecuta automaticamente el redireccionamiento de los puertos justo antes de la operaciones de salida o entrada (basandose en los valores especificados en la directiva) haciendo que cualquier modificación durante el resto del código quede anulada.
Este método permite ahorrar algo de RAM respecto al metodo STANDAR_IO, pero de todas formas el direccionamiento de los puertos no es el mas optimizado pues se sigue haciendo automaticamente antes de cada operación de IO.
Espero haber sido claro. Saludos.
-
Sobre el mismo tema en el manual dice :When linking multiple compilation units be aware this directive only applies to the current compilation unit.
Traducido con google: Al vincular múltiples unidades de compilación ser conscientes de esta directiva sólo se aplica a la unidad de compilación actual.
Significa esto que si yo tengo una libreria para manejar por ejemplo un GLCD y no defino un metodo de I/O en la libreria, el compilador utiliza el standar I/O que es el que se utiliza por defecto ?
Aunque yo en mi .h haya definido utilizar fastI/O
-
Sobre el mismo tema en el manual dice :When linking multiple compilation units be aware this directive only applies to the current compilation unit.
Traducido con google: Al vincular múltiples unidades de compilación ser conscientes de esta directiva sólo se aplica a la unidad de compilación actual.
Significa esto que si yo tengo una libreria para manejar por ejemplo un GLCD y no defino un metodo de I/O en la libreria, el compilador utiliza el standar I/O que es el que se utiliza por defecto ?
Aunque yo en mi .h haya definido utilizar fastI/O
No, no sucede eso, sino que toma la configuración del archivo principal, o sea la librería trabaja con fast_io. Es sencillo verificarlo realizando un programita y viendo el asm generado clickeando en C/ASM List
Saludos!