Frammentare codice C in XC8

4 Anni 8 Mesi fa #1 da Elia
Frammentare codice C in XC8 è stato creato da Elia
Buongiorno a tutti, ho scritto un lungo programma per PIC18 su MPLABX XC8 e non posso postarlo poichè fa parte di un progetto lavorativo.
Ho scritto anche delle librerie personali.

La mia domanda è la seguente: Le librerie che ho scritto (file .h e .c) le ho incluse nel progetto per mezzo della direttiva #include e poi ho anche specificato in Properties-->XC8 Compiler-->Include directories le cartelle dove sono contenuti i file .c e .h delle mie librerie. Ho compilato e tutto è andato a buon fine.

Però, nel mio codice, utilizzo anche alcune funzioni che richiamo infinite volte all'interno del while(1). La mia idea era di scrivere ogni funzione in un file .c e poi includerla per mezzo della direttiva #include. Questo per rendere più leggibile il file main. Allora ho fatto click destro su Source Files-->New-->C Source File. Ho inserito il codice della funzione nel nuovo file. Ho incluso poi la funzione con #include "file.c". Poi ho compilato e tutto è andato storto.
Sostanzialmente non compila dandomi errore poiché il compilatore non trova le definizioni di tutte le variabili e le costanti che ho usato nella funzione. Addirittura mi dice che non conosce la frequenza del quarzo (uso alcuni __delay_ms() ), nonostante l'abbia definita nel file main.c.
Ho provato con le seguenti soluzioni:
1- Creato un file .h con le definizioni (#define)
2- Nel file.h ho scritto la frequenza del quarzo
2- Ho incluso solo il file .h e non il .c (nel file .c includo il file .h) .

Allora funzionava.

Però mi chiedo: Ma se la funzione prima funzionava (scusate il gioco di parole), perchè adesso che l'ho semplicemente inserita in un file separato dentro la cartella di progetto, non va più? Non c'è un modo più semplice? Alla fine voglio solo frammentare il codice del file main in più file per rendere tutto più leggibile.

Grazie e scusate per la lunghezza. Spero di essere almeno stato chiaro.
Elia

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Elia
  • Junior Member
  • Junior Member
Di più
4 Anni 8 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Frammentare codice C in XC8
Salve Elia,

quando includi il file .c devi fare attenzione che non sia anche al lato sinistro del progetto, altrimenti è come se lo avessi incluso due volte. Personalmente preferisco includere i file .h e .c tramite include, cosi conosco l'ordine di inclusione.

Quando crei un file .c separato puoi accedere solo a variabili locali nel file stesso.
Se definisci in un file una variabile globale e la vuoi accedere in un altro file, devi dichiarare nuovamente la variabile definita altrove. Però in questa nuova dichiarazione devi scrivere extern, cosi il compilatore sa che la deve "cercare altrove"

L'ordine con cui includi i file nel main deve essere anche corretto.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
4 Anni 8 Mesi fa #3 da Elia
Risposta da Elia al topic Frammentare codice C in XC8
Ciao Mauro,

non so se ho capito bene. Io ho creato due file, uno .c e uno .h. Li ho messi nella cartella di progetto, ma non li ho aggiunti al progetto da MPlabX (cioè non ho fatto questa procedura: tasto destro su source-->Add existing item). Ho semplicemente creato due files blocco note cambiando estensione da .txt a .c e .h all'interno della cartella di progetto.

Nei file uso delle variabili globali che però sono definite dentro il file main.c, così come i vari #define pin .

Ho fatto gli #include necessari, mettendoli dopo le direttive #include "xc.h" e la definizione della frequenza del quarzo.
Ho compilato e ho questo errore:

:0:: error: (499) undefined symbol:


Non so che fare :dry:

Grazie.
Elia

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Elia
  • Junior Member
  • Junior Member
Di più
4 Anni 8 Mesi fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Frammentare codice C in XC8
Salve Elia,

nel fine main devi avere gli #include tua_libreria.h e tua_libreria.c

nei file non puoi usare i #define definiti nel main, visto che sono definiti dopo i tuoi include.

Crea un altro file .h e metti le definizioni dei tuoi pin.
per esempio hardware.h

Tale file deve essere incluso prima di ogni file che farà uso dei sui define.

quando il compilatore non trova una variabile, probabilmente l'hai definita in un file che segue il suo primo utilizzo.

Variabili globali se definite altrove devono essere ridefinite nel file di utilizzo tramite extern.

Potresti anche creare piccole funzioni di accesso alle variabili globali e definire il tutto in un file .h e .c (come una libreria) che includi prima di altri file che accedono a tali funzioni.

è questione di visibilità da parte del compilatore (non di scope).

...il compilatore legge i file in successione e i nomi di funzioni e variabili devono essere definiti prima del loro utilizzo.


Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
4 Anni 8 Mesi fa #5 da Elia
Risposta da Elia al topic Frammentare codice C in XC8
Ciao Mauro,
ho seguito le tue indicazioni e sono riuscito a fare quello che volevo fare (sembra una frase di un famoso film di Totò).

Ma non ho capito perchè funziona. Come mai se creo un file .h e .c nella cartella di progetto e poi li includo nel main funziona tutto, mentre se creo li stessi file .h e .c ma da MPLABX (tasto destro e create new file) e li includo, allora non funziona niente?

Grazie e scusa.
Ormai voglio capire

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Elia
  • Junior Member
  • Junior Member
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login