Hitec-C : Risolvere l’errore fixup overflow storing

A volte i compilatori non sempre vengono in aiuto, come in questo caso in cui l’Hitec-C mi ha fatto penare non poco anche per la scarsità di documentazione al riguardo. Durante la compilazione di un lungo programma per picmicro mi si presentava di continuo questo errore odioso:

Fixup Overflow Storing

In un primo momento sospettavo si trattasse di un superamento del limite di memoria imposto dalla versione LITE dell’ Hitec-C, ma in realtà non poteva trattarsi di una cosa del genere in quanto avevo soltanto aggiunto poche istruzioni a fronte di un consumo di memoria, prima dell’aggiunta, che mi consentiva di inserire ancora parecchia altra “roba” (80%).

Cercando un po’ in giro, dopo tanti patimenti, ho trovato questa illuminante discussione sul forum dell’ htsoft:

http://forum.htsoft.com/all/showflat.php/Cat/0/Number/114682/an/0/page/7

In pratica si evince che lo spazio, in termini di memoria programma, occupato da una funzione, deve risiedere tutto all’interno dello stesso banco di memoria.

E’ vero che con l’Hitec-C, e comunque con tutti i linguaggi di programmazione di alto livello, non dobbiamo preoccuparci dei banchi di memoria in cui allocare variabili e funzioni in quanto il compilatore effettua la miglior scelta in automatico, ma è altrettanto vero che una singola funzione, se troppo grande, non può essere suddivisa in due o più banchi: un’intera funzione deve risiedere in un solo banco.

Qualora le dimensioni di una funzione superano lo spazio di un banco, ecco che si presenta l’errore Fixup Overflow Storing (che suona più o meno come: correggere l’immagazzinamento in “sovrappiù”).

L’errore si risolve, quindi, spezzettando la funzione “enorme” in più pezzi in maniera tale che ogni singola funzione possa essere alloggiata in un banco.

Teniamo conto che la funzione main sia quella “enorme” e che contenga un certo quantitativo elevato di istruzioni:

void main(void)
   {
   istruzione1;
   istruzione2;
   istruzione3;
   ...
   istruzioneN;
   }

Sarà il vostro buon senso a farvi capire qual è la funzione che causa l’errore: è quella che contiene più istruzioni di tutte

Possiamo dividerla in questo modo:

void main(void)
   {
   funzione1();
   funzione2();
   funzioneN();
   }
 
void funzione1(void)
   {
   istruzione1;
   istruzione2;
   istruzione3;
   }
 
void funzione2(void)
   {
   istruzione4;
   istruzione5;
   istruzione6;
   }
 
void funzioneN(void)
   {
   istruzione7;
   istruzione8;
   ....
   istruzioneN;
   }

Ovviamente non è necessario spezzettare la funzione “grossa” in diecimila funzioni: magari  a volte basta anche rimanere alcune istruzioni in maniera normale e altre farle richiamare da un’altra funzione ecc.

Insomma fate in modo che il codice sia sempre leggibile e raggruppate le istruzioni in maniera che il nuovo arrangiamento abbia comunque un senso logico.

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)