2012-09-17 29 views
5

Tôi hiện đang làm việc trên thiết bị Linux được nhúng để ghi dữ liệu. Thiết bị Linux được cắm vào một CANbus và ghi lưu lượng truy cập vào thẻ SD.tránh tham nhũng thẻ SD trong ansi C

Thỉnh thoảng thẻ SD bị hỏng và được gắn kết chỉ đọc. Hành vi này cần phải tránh.

Hệ thống tệp là FAT (thẻ SD phải ở chế độ có thể đọc được bởi hệ thống cửa sổ).

Thiết bị nhúng có thể mất điện bất cứ lúc nào, vì vậy tôi cần một cách an toàn để ghi vào thẻ SD từ chương trình C.

Như Tôi không thực sự vào C, tôi dựa vào một chương trình gọi là "candump" mà về cơ bản in các canmessages stdout ở định dạng này:

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

chương trình C của tôi về cơ bản sẽ mở ra chương trình candump, đọc từ stdout, thêm dấu thời gian và xóa các ký tự không cần thiết:

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

} 

Đoạn mã trên hoạt động tốt, chỉ để tôi bị hỏng thẻ SD.

Giải pháp

tôi đã kết thúc bằng ext3 là hệ thống tập tin với gắn kết tùy chọn tiêu chuẩn. Không có vấn đề gì nữa

+0

Bạn có chắc là tham nhũng không xảy ra ở nơi khác? –

+0

đây là chương trình duy nhất truy cập vào thẻ sd vì vậy tôi đã không nghĩ rằng tham nhũng có thể xảy ra ở nơi khác. để bắt đầu hoặc theo dõi tham nhũng – user1320852

+0

/var/log/là một nơi tốt để bắt đầu đào để tìm gốc của các vấn đề về thẻ SD (một số hệ thống nhúng không ghi nhật ký theo mặc định/ở tất cả) – drahnr

Trả lời

1

Tham nhũng có thể xảy ra vì hệ điều hành không hoàn tất thao tác ghi trên hệ thống tệp FAT. Như được chỉ ra một cách chính xác bởi J-16 SDiZ, bạn có thể cố gắng giảm thiểu sự cố khi đang thực hiện sync để buộc hệ điều hành viết các thay đổi trên hệ thống tệp.

Tuy nhiên, bạn đang gặp loại này của vấn đề bởi vì bạn không sử dụng một hệ thống tập tin journal (như Ext3 hoặc NTFS. Một điều để làm, có thể là để fsck hệ thống tập tin mỗi khi khởi động và sau đó buộc một cách rõ ràng đi ngược lại rw để giữ

+1

FAT: Lỗi hệ thống tệp (dev mmcblk0p1) cụm được tính toán kém (56! = 55) FAT: Hệ thống tệp đã được đặt chỉ đọc. Đây là thông báo lỗi tôi vừa buộc (rút thẻ SD khi đang đăng nhập) tôi sẽ thử hệ thống tập tin ext3 – user1320852

+0

Tôi không có nhiều kinh nghiệm với lỗi Fat32 trong Linux, tuy nhiên tôi khuyên bạn nên chuyển sang Ext3 để cắt các lỗi này. Nếu bạn cần thường xuyên tháo thẻ SD và đọc nó trong Windows, bạn có thể thử sử dụng [Trình điều khiển IFS] (http://www.fs-driver.org/). Một cách khác để đáp ứng yêu cầu này có thể là thiết lập một điểm gắn kết CIFS như '//192.168.1.1/shared \t/mnt/shared \t cifs \t mặc định, noauto, user = guest, pass = guest 0' – Avio

0

Tham nhũng có xảy ra ngay cả khi bạn không xóa nguồn không? Mã trên chỉ là cấp người dùng và thực hiện các thao tác đơn giản FILE *; nó không thể làm hỏng thiết bị.

Nếu có, thì trình điều khiển thiết bị chính là lỗi, hoặc đang xảy ra sự cố khác.

Bạn có thể kiểm tra xem có sự cố về nguồn không, ví dụ: có thể gây ra cài đặt lại?

+0

cảm ơn bạn đã nhập. mất điện có thể xảy ra bởi vì thiết bị emebedded là sức mạnh của một PLC, mà controles một cần cẩu công nghiệp. nếu sự đánh lửa của cầu trục đó bị tắt thì plc sẽ xuống và do đó thiết bị nhúng và nó xảy ra khá thường xuyên. – user1320852