[MontelLUG] Impossibilità di utilizzare variabili statiche o globali

Samuele samuele.zanin a tiscali.it
Dom 10 Apr 2016 12:18:44 CEST


Il mio viscerale odio per il C è noto, purtroppo ogni tanto mi tocca 
averci a che fare.

L'altro giorno, stavo tentando di fare una funzione di log su file di 
dati. Un'unica funzione, con due parametri, il tipo di operazione 
(apertura, chiusura, scrittura) ed un array di char con i dati da loggare.

Inizialmente il descrittore del file era dichiarato come variabile 
statica. All'apertura del file, si pianta tutto.
Descrittore dichiarato come variabile locale funziona.
Mi turo il naso e lo dichiaro come variabile globale: blocco del 
programma (d'altronde da quanto leggo, statiche e globali vengono 
trattate allo stesso modo).
Mi rituro il naso e porconando, dichiaro il descrittore come variabile 
locale nel main e la passo come parametro in tutte le funzioni dove mi 
server. Funziona (Csytemd!!!).
Qualsiasi altro tipo di variabile globale che tento di dichiarare da lo 
stesso comportamento (ho già un'altra serie di variabili globali già in 
uso). Lo sò che non si devono usare, ma sono variabili tipo il buffer 
della seriale, gli oggetti di gpio ecc.

Qualche spiegazione razionale del fenomeno?

Dopo un paio d'ore mi accorgo che comunque il programma si pianta 
(interviene il watchdog).
Di solito questo succede quando la memoria va a puttane.
Peccato che senza la funzione di log, tutto vada bene.
Ipotizzo che sia la dimensione del file troppo grande, quindi al 
raggiungimento delle 3000 righe di log, chiudo e apro un nuovo file. 
Adesso il programma si pianta molto prima, quindi mi vien da dire che il 
problema sia nella funzione di apertura del file (fileopen).

Ho provato in velocità qualche programma di analisi statica del codice, 
ma non sono riuscito a farli andare.
Da un punto di vista della logica del programma, non ho problemi, tutto 
è corretto, ma capire cosa fa il compilatore C £"$%£"$%£$%$"£!!! non è 
alla mia portata.

Il programma è sviluppato su piattaforma mbed, ho 32 KB di ram, gli 
altri 32 sono dedicati alla ethernet.

https://developer.mbed.org/handbook/Memory-Model

Qualsiasi consiglio è ben accetto.




Maggiori informazioni sulla lista montellug