में एसडी कार्ड भ्रष्टाचार से बचें मैं वर्तमान में डेटा लॉगिंग के लिए एक एम्बेडेड लिनक्स डिवाइस पर काम कर रहा हूं। लिनक्स डिवाइस को कैनबस में प्लग किया गया है और एक एसडी कार्ड में यातायात लिखता है।ansi सी
समय-समय पर एसडी कार्ड दूषित होता है और केवल पढ़ने के लिए माउंट किया जाता है। इस व्यवहार से बचा जाना चाहिए।
फ़ाइल सिस्टम एफएटी है (एसडी कार्ड विंडोज सिस्टम द्वारा पठनीय रहना चाहिए)।
एम्बेडेड डिवाइस किसी भी समय विफल हो सकता है, इसलिए मुझे अपने सी प्रोग्राम से एसडी कार्ड को लिखने का एक सुरक्षित तरीका चाहिए।
मैं वास्तव में सी में नहीं कर रहा हूँ के रूप में, मैं "candump" जो मूल रूप से canmessages प्रिंट इस प्रारूप में stdout करने के लिए नाम के एक कार्यक्रम पर भरोसा करते हैं:
<0x006> [8] 77 00 00 00 00 00 00 00
मेरे सी कार्यक्रम मूल रूप से candump कार्यक्रम को खोलता है, से पढ़ता stdout, एक टाइमस्टैम्प कहते हैं और अनावश्यक वर्ण निकालता है:
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);
}
कोड स्निपेट के ऊपर, ठीक काम करता है इसकी सिर्फ इतना है कि मैं पाने के एसडी कार्ड भ्रष्टाचार।
समाधान
मैं मानक माउंट विकल्पों के साथ फाइल सिस्टम के रूप ext3 का उपयोग कर समाप्त हो गया। कोई समस्या नहीं
क्या आप सुनिश्चित हैं कि भ्रष्टाचार कहीं और नहीं होता है? –
यह एकमात्र कार्यक्रम है जो एसडी कार्ड तक पहुंच रहा है, इसलिए मैंने यह नहीं माना है कि भ्रष्टाचार कहीं और हो सकता है। और ईमानदार होने के लिए मुझे नहीं पता भ्रष्टाचार को शुरू करने या ट्रैक करने के लिए – user1320852
/var/log/एसडी कार्ड के मुद्दों की जड़ को खोजने के लिए खुदाई शुरू करने के लिए एक अच्छी जगह है (कुछ एम्बेडेड सिस्टम डिफ़ॉल्ट रूप से सामान लॉग नहीं करते हैं) – drahnr