2012-09-17 55 views
5

我目前正在使用嵌入式Linux設備進行數據記錄。 Linux設備插入CANbus並將流量寫入SD卡。避免在ansi中損壞SD卡C

SD卡隨時會損壞並掛載爲只讀。這種行爲需要避免。

文件系統是FAT(SD卡應該可以讓Windows系統保持可讀)。

嵌入式設備可能會隨時發生故障,所以我需要一種安全的方式從我的C程序寫入SD卡。

由於我沒有真正進入C,我靠所謂的「candump」基本上打印canmessages這種格式的標準輸出方案:

<0x006> [8] 77 00 00 00 00 00 00 00 

我的C語言程序基本上打開candump程序,從讀取標準輸出,增加了一個時間戳,並刪除不必要的字符:以上

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); 

} 

的代碼片段工作正常,它只是我得到的SD卡腐敗。

解決方案

我結束了使用ext3作爲標準安裝選項的文件系統。沒有問題

+0

你確定腐敗不會發生在其他地方嗎? –

+0

這是唯一一個訪問SD卡的程序,所以我沒有考慮到腐敗可能發生在其他地方,說實話我不知道在哪裏開始或追蹤損壞 – user1320852

+0

/var/log /是一個開始挖掘SD卡問題根源的好地方(某些嵌入式系統默認情況下不會記錄任何東西) – drahnr

回答

1

由於操作系統沒有在FAT文件系統上完成其寫入操作,可能發生損壞。正如J-16 SDiZ正確指出的那樣,您可以不時嘗試緩解sync的問題,迫使操作系統在文件系統上寫入更改。

但是,你是因爲你不使用日誌文件系統(如ext3或NTFS有這樣那樣的問題。做的另一件事,可能是fsck文件系統每次啓動,然後明確地迫使rw重新裝入保持該安裝點是乾淨的和可寫的。

+1

FAT:文件系統錯誤(dev mmcblk0p1) 集羣計算嚴重(56!= 55) FAT:文件系統已被設置爲只讀。這是我剛剛強制的錯誤消息(記錄時拔出SD卡)我會嘗試ext3文件系統 – user1320852

+0

在Linux下我沒有很多Fat32錯誤的經驗,但是我建議轉移到Ext3以切斷這些錯誤。如果您需要經常移除SD卡並在Windows下閱讀,您可以嘗試使用[IFS Drivers](http://www.fs-driver.org/)。滿足這一要求的另一種方法是設置一個CIFS掛載點,例如'//192.168.1.1/shared \t/mnt/shared \t cifs \t default,noauto,user = guest,pass = guest 0' – Avio

0

即使你沒有刪除權力,腐敗是否發生?以上代碼僅限用戶級別,並且在操作中執行簡單的FILE *;它不應該能夠損壞設備。

如果是,那麼無論是設備驅動程序本身是越野車,或其他事情正在發生。

例如,您可以檢查是否存在可能導致重置的電源問題?

+0

感謝您的意見。由於嵌入式設備由PLC供電,控制工業起重機,因此可能會發生電源故障。如果該起重機的點火裝置被關閉,則plc停機,因此嵌入式裝置經常發生。 – user1320852