2012-09-17 11 views
5

में एसडी कार्ड भ्रष्टाचार से बचें मैं वर्तमान में डेटा लॉगिंग के लिए एक एम्बेडेड लिनक्स डिवाइस पर काम कर रहा हूं। लिनक्स डिवाइस को कैनबस में प्लग किया गया है और एक एसडी कार्ड में यातायात लिखता है।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 का उपयोग कर समाप्त हो गया। कोई समस्या नहीं

+0

क्या आप सुनिश्चित हैं कि भ्रष्टाचार कहीं और नहीं होता है? –

+0

यह एकमात्र कार्यक्रम है जो एसडी कार्ड तक पहुंच रहा है, इसलिए मैंने यह नहीं माना है कि भ्रष्टाचार कहीं और हो सकता है। और ईमानदार होने के लिए मुझे नहीं पता भ्रष्टाचार को शुरू करने या ट्रैक करने के लिए – user1320852

+0

/var/log/एसडी कार्ड के मुद्दों की जड़ को खोजने के लिए खुदाई शुरू करने के लिए एक अच्छी जगह है (कुछ एम्बेडेड सिस्टम डिफ़ॉल्ट रूप से सामान लॉग नहीं करते हैं) – drahnr

उत्तर

1

भ्रष्टाचार संभवतः होता है क्योंकि ओएस ने एफएटी फाइल सिस्टम पर अपने लेखन कार्यों को पूरा नहीं किया है। जैसा कि J-16 SDiZ द्वारा सही ढंग से इंगित किया गया है, आप ओएस को फाइल सिस्टम पर परिवर्तन लिखने के लिए समय-समय पर sync करने में समस्या को कम करने का प्रयास कर सकते हैं।

हालांकि, अगर आप इस तरह की समस्याओं क्योंकि आप (जैसे Ext3 या NTFS के रूप में एक जर्नल फ़ाइल सिस्टम का उपयोग नहीं कर रहे हैं कर रहे हैं। ऐसा करने के लिए एक और बात, fsck लिए फाइल सिस्टम हर बूट हो सकता है और उसके बाद स्पष्ट रूप से रखने के लिए एक rw रिमाउंट लिए मजबूर माउंटपॉइंट स्वच्छ और लिखने योग्य।

+1

एफएटी: फाइल सिस्टम त्रुटि (dev mmcblk0p1) क्लस्टर बुरी तरह गणना की गई (56! = 55) एफएटी: फाइल सिस्टम केवल पढ़ने के लिए सेट किया गया है। यह त्रुटि संदेश है जिसे मैंने अभी मजबूर किया है (लॉगिंग करते समय एसडी कार्ड को अनप्लग करना) मैं ext3 फाइल सिस्टम – user1320852

+0

का प्रयास करूंगा, मुझे लिनक्स के तहत Fat32 त्रुटियों के साथ अधिक अनुभव नहीं है, हालांकि मैं इन त्रुटियों को काटने के लिए Ext3 पर जाने का सुझाव दूंगा। यदि आपको अक्सर एसडी कार्ड को हटाने और विंडोज के तहत इसे पढ़ने की आवश्यकता है तो आप [आईएफएस ड्राइवर्स] (http://www.fs-driver.org/) का उपयोग करने का प्रयास कर सकते हैं। इस आवश्यकता को पूरा करने का एक और तरीका सीआईएफएस माउंटपॉइंट जैसे कि '//192.168.1.1/shared \t/mnt/shared \t cifs \t डिफ़ॉल्ट, noauto, user = guest, pass = guest 0' – Avio

0

क्या भ्रष्टाचार तब भी होता है जब आप शक्ति को हटा दें? उपरोक्त कोड केवल उपयोगकर्ता स्तर है और सरल FILE * संचालन कर रहा है; यह डिवाइस को भ्रष्ट करने में सक्षम नहीं होना चाहिए।

यदि यह है, तो या तो डिवाइस चालक स्वयं ही छोटी है, या कुछ और चल रहा है।

क्या आप जांच सकते हैं कि बिजली की समस्याएं हैं, जो उदाहरण के लिए रीसेट का कारण बन सकती हैं?

+0

आपके इनपुट के लिए धन्यवाद। बिजली विफल हो सकती है क्योंकि एंबेडेड डिवाइस पीएलसी द्वारा शक्ति है, जो एक औद्योगिक क्रेन का विरोध करता है। अगर उस क्रेन की इग्निशन बंद हो जाती है तो पीएलसी नीचे चला जाता है और इसलिए एम्बेडेड डिवाइस और यह अक्सर होता है। – user1320852

संबंधित मुद्दे