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
Bạn có chắc là tham nhũng không xảy ra ở nơi khác? –
đâ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
/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