Autor Tema: Ayuda con creación de librerias  (Leído 3779 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado 8bits

  • PIC10
  • *
  • Mensajes: 13
Ayuda con creación de librerias
« en: 01 de Septiembre de 2018, 23:39:20 »
Hola a todos, escribo esta entrada por que tengo un problema al que no le encuentro solución.
Estoy en un proyecto para crear mis propias librerías en XC8. Estoy utilizando MPLABx. Actualmente ya tengo algunas librerias que realice en el MPLABx pero las guardo en archivos con extension .c
Y cada la requiero la incluyo en algun proyecto. Sin embargo veo que en la documentación del MPLABx  (http://microchipdeveloper.com/mplabx:libraries) se explica como generar un proyecto de libreria para crear un conjunto de archivos precompilados (objetos). Quiero explorar esta opcion. Sin embargo al querer compilar me marca error en lineas de este tipo.

Código: [Seleccionar]
void closeSerial(){
    /*Close serial port*/
    RCSTAbits.SPEN = 0;
    RCSTAbits.CREN = 0;
    TXSTAbits.TXEN = 0;
    PIE1bits.RCIE = 1;
   
}

El ejemplo anterior es un fragmento de una funcion de mi libreria, y me marca con error las lineas al hacer referencia al los registros que escribo de la sigiente manera "REGISTRObits.bit", pero si pongo por ejemplo REGISTRO = valor no me marca error. No encuentro solucion al error que me permita seguir utilizando la notacion que quiero.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con creación de librerias
« Respuesta #1 en: 02 de Septiembre de 2018, 10:36:59 »
Personalmente, a no ser que el proyecto sea DEMASIADO grande, yo seguiria con los .h y .c
Ya que es incluir el lugar donde tenes las librerias y cargar el .h en el proyecto. ( No recuerdo si MPLAB X exige tambien cargarlo en source al .c).

Lo unico que te ahorras con la libreria pre-compilada es que se ahorre la compilacion. Por ejemplo XC tiene su libreria pre-compilada con las mejores optimizaciones, asi de esa forma comparten la libreria y esta "bien" optimizado sea cual sea el nivel de optimizacion que vos elegis.

De todas formas hice una prueba y funciono correctamente. Cree una libreria asi de simple:

puertos.h
Código: C
  1. #ifndef PUERTOS_H
  2. #define PUERTOS_H
  3.  
  4. #ifdef  __cplusplus
  5. extern "C" {
  6. #endif
  7.  
  8. void probando();
  9.  
  10.  
  11. #ifdef  __cplusplus
  12. }
  13. #endif
  14.  
  15. #endif  /* PUERTOS_H */

puertos.c
Código: C
  1. #include <xc.h>
  2.  
  3. void probando(){
  4.     TRISB = 0;
  5.     PORTBbits.RB5 ^= 1;
  6.     TRISAbits.TRISA0 = 0;
  7. }


Lo compile y me funciona correctamente. Luego inclui la libreria (que es un .lpp ) ubicada donde te dice la pagina de Microchip, e inclui el .h en un proyecto.
Quedandome:

main.c:
Código: C
  1. #include <xc.h>
  2. #include <stdint.h>
  3. #define _XTAL_FREQ 4000000
  4. #include "puertos.h"
  5.  
  6.  
  7. void main(void){
  8.      
  9.     while(1){
  10.     probando();    
  11.        
  12.     }
  13. }

Y todo funciona correctamente.

No se que errores te esta dando. Yo lo compile/simule para la misma version de PIC en ambos lados.

Desconectado 8bits

  • PIC10
  • *
  • Mensajes: 13
Re:Ayuda con creación de librerias
« Respuesta #2 en: 02 de Septiembre de 2018, 14:09:23 »
Personalmente, a no ser que el proyecto sea DEMASIADO grande, yo seguiria con los .h y .c
Ya que es incluir el lugar donde tenes las librerias y cargar el .h en el proyecto. ( No recuerdo si MPLAB X exige tambien cargarlo en source al .c).

Lo unico que te ahorras con la libreria pre-compilada es que se ahorre la compilacion. Por ejemplo XC tiene su libreria pre-compilada con las mejores optimizaciones, asi de esa forma comparten la libreria y esta "bien" optimizado sea cual sea el nivel de optimizacion que vos elegis.

De todas formas hice una prueba y funciono correctamente. Cree una libreria asi de simple:

puertos.h
Código: C
  1. #ifndef PUERTOS_H
  2. #define PUERTOS_H
  3.  
  4. #ifdef  __cplusplus
  5. extern "C" {
  6. #endif
  7.  
  8. void probando();
  9.  
  10.  
  11. #ifdef  __cplusplus
  12. }
  13. #endif
  14.  
  15. #endif  /* PUERTOS_H */

puertos.c
Código: C
  1. #include <xc.h>
  2.  
  3. void probando(){
  4.     TRISB = 0;
  5.     PORTBbits.RB5 ^= 1;
  6.     TRISAbits.TRISA0 = 0;
  7. }


Lo compile y me funciona correctamente. Luego inclui la libreria (que es un .lpp ) ubicada donde te dice la pagina de Microchip, e inclui el .h en un proyecto.
Quedandome:

main.c:
Código: C
  1. #include <xc.h>
  2. #include <stdint.h>
  3. #define _XTAL_FREQ 4000000
  4. #include "puertos.h"
  5.  
  6.  
  7. void main(void){
  8.      
  9.     while(1){
  10.     probando();    
  11.        
  12.     }
  13. }

Y todo funciona correctamente.

No se que errores te esta dando. Yo lo compile/simule para la misma version de PIC en ambos lados.


Hola KILLERJC, el error que a mi se me genera es al usar la opción de proyecto de librería precompilada. Mira principalmente esto lo estoy haciendo por que quiero hacer una libreria para PIC18F4550 que es con el que estoy trabajando. Lo que no me gusta hacer es que si hago un proyecto debo copiar mi libreria en ese proyecto, despues digamos hago otro proyecto y copio la libreria tambien. El problema viene que si realizo un cambio determinado en la libreria, debo volver a copiar la libreria actualizada en cada proyecto. Es decir no hay un control de versiones en donde digamos que los proyectos que tienen una copia de la libreria original tambien vean la actualizacion. Por eso estoy intentando usar GitHub con la implementacion que tiene MPLABx.

Si conoces alguna forma de hacer lo que quiero estaria genial. Es decir que las librerias en mis proyectos se actualizen si hago cambios en la libreria original. No importa si no es mediante librera precompilada.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con creación de librerias
« Respuesta #3 en: 02 de Septiembre de 2018, 16:16:55 »
Citar
Si conoces alguna forma de hacer lo que quiero estaria genial.

Es que justamente vos podes hacer eso con un .c y un .h aparte.
Cada IDE se maneja de forma especial... Pero masomenos siguen un mismo patron.. Voy a hablar de MPLAB X porque es lo que estas usando.

Vos podes tener tu libreria en otra carpeta,, supongamos que lo tenes en C:/librerias y tus proyectos en C:/proyectos/proyecto1.X/ y vos no queres copiar y pegar.

En MPLAB necesitas 2 cosas para poder usar los archivos .h y .c de la carpeta librerias. Voy a seguir con mi ejemplo de antes (usando el mismo nombre de archivos, es decir puertos.* es mi libreria).

Primero necesitas decirle al compilador desde donde sacas los archivos para el #include, eso lo haces desde las propiedades del proyecto ( click derecho sobre el proyecto, propiedades)
Al final hay uno que dice "XC8 Compiler" Y dentro de las opciones uno que se llama Include directories, si haces click, se te abre una ventana a la cual vas a poder agregarle la direccion "C:/librerias" a ese proyecto (fijate que hay un boton que dice Browse, que permite la seleccion)

Una ves agregado este valor, nos va a permitir hacer uso del #include, es decir si pongo #include "puertos.h" va a incorporar el .h de C:/librerias .
En el navegador de proyectos no es necesario agregar el .h, pero mejor hacerlo asi sabes que se usa.. Me refiero en la seccion de "Header Files"

Hasta aca logramos que reconozca los .h, el problema es que no va a encontrar ningun .c, en otros IDE como eclipse, en este punto ya terminarias, ya que buscaria en la carpeta de librerias el .c con el mismo nombre que el .h. Pero estamos en MPLAB X. Para que tambien compile el .c necesitamos agregarlo al proyecto, es decir bajo la seccion "Source Code" lo agregamos al archivo .c, a pesar que esta en otra carpeta. Podemos tambien crear una carpeta para diferenciarlo.

Quedandote asi:

Ver adjunto, que no me lo deja poner el foro

Y no necesitas copiar y pegar cualquiera de tus librerias, y tenes el codigo fuente en un solo lugar.

Citar
Es decir no hay un control de versiones en donde digamos que los proyectos que tienen una copia de la libreria original tambien vean la actualizacion. Por eso estoy intentando usar GitHub con la implementacion que tiene MPLABx.

Pero es otra cosa totalmente distinta un control de versiones a lo que me planteas.
Podes mantener un control de versiones, lo vas a tener que hacer por  SEPARADO, tus librerias por un lado y tu proyecto por el otro, obviamente necesitas de ambos para compilarlo.

Ya que si los mantenes juntos una version va a estar atada a la otra. Y pienso que vos queres que justamente actualizar 1 solo lugar te sirva para todos. Y es aca lo mas importante es la interfaz de tu libreria que se mantenga lo mas constante posible y que se totalmente independiente, ya que de cambiar algo en la misma, deberias cambiar el codigo de tus proyectos tambien, atandote a lo que ya tenes.

PD: Lo unico que no logre es que al poner #include me muestre tambien los archivos de c:/librerias , asi que vas a tener que escribirlo a mano y no ayudarte del auto-complete
« Última modificación: 02 de Septiembre de 2018, 16:21:35 por KILLERJC »