problems accessing to FS2 allocation

Hi all, i’ve written a small piece of code accessing to FS2 written data that was working fine until a big grow up of the size of code of my application.

I use these funcions to access to FS2:

typedef struct {
char tabella_nmeac[SENTNMEA]; //vettore di selezione sent. nmea
char tabella_pubxc[6]; //vettore di selezione sent. pubx
float almbat; //limite batteria in allarme
float lowbat; //limite batteria bassa
int sbpn; //periodo di stand-by con batteria OK
int sbplb; //periodo di stand-by (min )con batteria bassina
int sbpab; //periodo di stand-by (min )con batteria in allarme
char nomep[MAXNOME+1]; // nome della periferica
unsigned long int minimadist; // minima distanza dall’ultima trasmissione
char srvip[16]; // ip a cui collegarmi
int portasrv; // porta del server a cui collegarmi
enum _trackingmodes modof; // modo di funzionamento
unsigned char crcconfig; // crc del pacchetto di configurazione
} _configurazione;

#if FLASH_COMPILE

int CaricaDefault ( _configurazione *config );

//#define FS2_DISALLOW_PROGRAM_FLASH
//#define XMEM_RESERVE_SIZE 2048
#define FS2_USE_PROGRAM_FLASH 16
#define LX_2_USE fs_get_flash_lx() // se ne ho installata una sola di flash
//#define LX_2_USE fs_get_other_lx() // se ne ho installate due
//#define FS2_RAM_RESERVE
//#define LX_2_USE fs_get_ram_lx()

#define MY_LS_SHIFT 9
#define MY_FILE_NAME (1+LX_2_USE) // nome del file ( da 1 a 255 )

#use “fs2.lib”

int FormattaFS2 ( void ) {
/-=0=-
esegue la formattazione del sistema
-=0=-
/

hitwd();
if (!LX_2_USE) {
printf("FormattaFS2: La periferica diarchiviazione %d non esiste: ESCO
", (int)LX_2_USE);
return 0;
} else printf("FormattaFS2: uso la periferica LX# %d…
", (int)LX_2_USE);

if ( lx_format(LX_2_USE, 0)) {
printf( "FormattaFS2: Errore nella formattazione del filesystem per salvare i dati!
");
return 0;
}
printf("FormattaFS2: capacita’ LX# %d approssimativa: %ld
",
(int)LX_2_USE, fs_get_lx_size(LX_2_USE, 0, 0));
return 1;
}

int SalvaConfigurazione ( _configurazione *conf) {
//
// scrive nella flashrom la configurazione dell’apparato
//
// ritorna 1 in caso di successo, 0 altrimenti
//

File f1;

// inizio a controllare se ho settato tutte le direttive di ambiente
if (!LX_2_USE) {
printf("SalvaConfigurazione: La periferica diarchiviazione %d non esiste: ESCO
", (int)LX_2_USE);
return 0;
} else printf("SalvaConfigurazione: uso la periferica LX# %d…
", (int)LX_2_USE);

// bene! ora devo scrivere:
fs_set_lx(LX_2_USE, LX_2_USE);
if (fcreate(&f1, MY_FILE_NAME) && errno == EEXIST) {
printf("SalvaConfigurazione: Il file Esiste: cancello e scrivo nuovo.
");
fdelete(MY_FILE_NAME);
if ( fcreate(&f1, MY_FILE_NAME) ) {
printf( "SalvaConfigurazione: non sono riuscito a creare il nuovo file %d: errore: %d.
", (int)MY_FILE_NAME, errno);
return 0;
}
}
// scriviamo quello che dobbiamo scrivere:
if ( fwrite(&f1, (char *)conf, sizeof(_configurazione)) != sizeof(_configurazione)) {
printf( “SalvaConfigurazione: errore scrivendo il contenuto della configurazione:[”);
switch ( errno ) {
case EBADFD:
printf ("file descriptor non aperto o solo lettura
");
break;
case EINVAL:
printf( "lunghezza minore di zero].
");
break;
case 0:
printf( "Lunghezza scritta NULLA].
");
break;
case EIO:
printf( "Errore di INPUT/OUTPUT].
");
break;
case ENOSPC:
printf( "Superato il massimo spazio disponibile].
");
break;
default:
printf( "ERRORE NON RICONOSCIUTO]
");
}
fclose( &f1);
return 0;
}
fclose( &f1);
printf( "SalvaConfigurazione: operazione eseguita con successo.
");
return 1;
}

int LeggiConfigurazione( _configurazione *conf) {
//
// Legge la configurazione dell’apparato
//
// ritorna 1 in caso di successo
// 0 altrimenti
//

File f1;
unsigned char crct;

// inizio a controllare se ho settato tutte le direttive di ambiente
if (!LX_2_USE) {
printf("LeggiConfigurazione: La periferica diarchiviazione %d non esiste: ESCO
", (int)LX_2_USE);
return 0;
} else printf("LeggiConfigurazione: uso la periferica LX# %d…
", (int)LX_2_USE);

if (fopen_rd( &f1, MY_FILE_NAME )) {
if ( errno == ENOENT )
{
printf( "LeggiConfigurazione: il file non esiste!
");
}
printf( "LeggiConfigurazione: errore di lettura non gestito!
");
// mi organizzo e sistemo tutto!
return CaricaDefault( conf);
}

if ( fread(&f1, (char *) conf, sizeof( _configurazione)) != sizeof( _configurazione)) {
printf( "LeggiConfigurazione: errore leggendo la fonfigurazione salvata.
");
fclose( &f1);
return CaricaDefault( conf);
}
fclose( &f1);
// ora controllo il CRC
crct = conf->crcconfig;
conf->crcconfig = 0x00;
if ( crct != CalcolaCrcMem( (char *) conf, sizeof( _configurazione))) {
printf( "LeggiConfigurazione: errore nella parita’ della configurazione registrata.
");
return CaricaDefault( conf);
}
// ok tutto ok!!!
conf->crcconfig = crct;
printf( "LeggiConfigurazione: configurazione letta correttamente e dati caricati in memoria.
");
return 1;
}
#endif

int CaricaDefault ( _configurazione config ) {
/
-=0=-
funzione per precaricare il default della configurazione dell’apparato

ritorna sempre 1 ma serve per risparmiare righe di codice…
-=0=-*/

unsigned char conta;

for ( conta = 0 ; conta < SENTNMEA ; config->tabella_nmeac[conta++] = 0 );
// questa e’ la configurazione di base SEMPRE
config->tabella_nmeac[0] = 1;
config->tabella_nmeac[2] = 1;
config->tabella_nmeac[5] = 1;
config->tabella_nmeac[8] = 1;
for ( conta = 0 ; conta < 4 ; config->tabella_pubxc[conta++] = 0);
config->almbat = 8.00;
config->lowbat = 10.00;
config->sbpn = 60;
config->sbplb = 120;
config->sbpab = 360;
strcpy( config->nomep, “NoMeDeF”);
config->minimadist = 1000;
strcpy( config->srvip, “151.228.249.101”);
config->portasrv = 7780;
config->crcconfig = 0x00;
config->modof = TEMPO;

// ora mi calcolo il CRC utilizzando il sistema del cazzo:
conta = CalcolaCrcMem( (char *) config, sizeof(_configurazione));
printf( "CaricaDefault: ho calcolao il crc: %d
", conta);
config->crcconfig = conta;

#if FLASH_COMPILE
// ok ora posso registrare tutto:
FormattaFS2();
SalvaConfigurazione( config);
return 1;
#endif
}

and in my stdoutput i receive for the result of configuration read:
Controllo della configurazione: almbat: 8.000000, lowbat: 10.000000, sbpn: 0, sbplb: 16672, sbpab: 120
nomep: NoMeDeF, minimadist 1000, ip server: DynamiCUniversal Rabbit BIOS Version 9.50D�F&6, portaserver: 32446

but the IP that i write to configuration is: another… …

the config variable passed ad pointer is allocated statically with directive:
auto _configurazione config; in main

#memmap is to xmem

and the compiler on a core 3000 does not give any error!

Where i make the BIG mistake???:confused: :confused: :confused:

:confused:
I am using RCM3400. Got the same problem. I can not append, write. Always error code 28. After power cycle, the file is always lost.

Did you find solution to your problem?

Thanks in advance.