Ich arbeite derzeit an einem Embedded-Linux-Gerät für die Datenprotokollierung. Das Linux-Gerät wird in einen CAN-Bus gesteckt und schreibt den Datenverkehr auf eine SD-Karte.vermeiden SD-Karte Korruption in ansi C
Von Zeit zu Zeit beschädigt die SD-Karte und ist schreibgeschützt montiert. Dieses Verhalten muss vermieden werden.
Das Dateisystem ist FAT (die SD-Karte sollte von Windows-Systemen lesbar bleiben).
Das Embedded-Gerät kann jederzeit Stromausfall, also brauche ich eine sichere Möglichkeit, auf die SD-Karte von meinem C-Programm zu schreiben.
Wie ich bin nicht wirklich in C, verlasse ich mich auf ein Programm namens „candump“, die im Grunde die canmessages druckt in diesem Format an stdout:
<0x006> [8] 77 00 00 00 00 00 00 00
Mein C-Programm eröffnet grundsätzlich die candump Programm liest aus stdout, fügt einen Zeitstempel und entfernt überflüssige Zeichen:
1345836055.520 6 7700000000000000
while(running)
{
if (filename != NULL)
{
fp_log = fopen(filename, "a");
if (!fp_log)
{
perror("fopen");
exit (EXIT_FAILURE);
}
}
fgets(line, sizeof(line)-1, fp);
/* reset the row_values so they are always correctly initialized */
row_identifier = 0;
if (strchr(line,'<') != NULL)
{
/* creating a buffer char to store values for casting char to int*/
buffer_ident[0] = line[4];
buffer_ident[1] = line[5];
/* cast buffer e.g. {'1','0','\0'} to int: 10 */
row_identifier = strtol(buffer_ident,NULL,10);
/* heartbeat of the CANBUS PLC */
if(row_identifier == 80)
{
/* return pong on identifier 81 to the PLC */
//system("cansend can0 -i 81 1 > /dev/null");
}
else
{
gettimeofday(&tv,NULL);
fprintf(fp_log,"%d.%03d ", tv.tv_sec, tv.tv_usec/1000);
fprintf(fp_log,"%d ",row_identifier);
/* rowlenght > 11 = data part is not empty */
row_lenght = strlen(line);
if (row_lenght>11)
{
int i=0;
for (i=11;i<row_lenght;i++)
/* remove spaces between the data to save space and copy data into new array */
if (isspace(line[i]) == 0)
fprintf(fp_log,"%c",line[i]);
fprintf(fp_log,"\n");
}
}
}
fclose(fp_log);
}
Das Code-snippet oben funktioniert gut, es ist nur, dass ich SD-Karte Korruption zu bekommen.
Lösung
landete ich mit Standard-Mount-Optionen mit ext3 als Dateisystem auf. Keine Probleme mehr
Sind Sie sicher, dass die Korruption nicht woanders geschieht? –
Dies ist das einzige Programm, das auf die SD-Karte zugreifen, so habe ich nicht in Betracht gezogen, dass die Korruption anderswo passieren könnte und um ehrlich zu sein, weiß ich nicht wo um die Korruption zu starten oder aufzuspüren – user1320852
/var/log/ist ein guter Ort, um zu graben beginnen, um die Wurzel der SD-Karte Probleme zu finden (einige eingebettete Systeme protokollieren keine Sachen standardmäßig/überhaupt) – drahnr