5

我目前正在开发用于数据记录的嵌入式 Linux 设备。Linux 设备插入 CANbus 并将流量写入 SD 卡。

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 作为具有标准挂载选项的文件系统。没有问题了

4

2 回答 2

1

损坏可能是因为操作系统没有完成对 FAT 文件系统的写操作。正如J-16 SDiZ正确指出的那样,您可以尝试缓解sync不时强制操作系统在文件系统上写入更改的问题。

但是,您会遇到此类问题,因为您没有使用日志文件系统(例如 Ext3 或 NTFS。另一件要做的事情是fsck每次启动文件系统,然后显式强制rw重新挂载以保持挂载点清洁和可写。

于 2012-09-17T12:03:35.610 回答
0

即使您移除电源,也会发生腐败吗?上面的代码只是用户级的,做简单的FILE *操作;它不应该损坏设备。

如果是,则设备驱动程序本身有问题,或者发生了其他事情。

您能否检查是否存在可能导致重置的电源问题?

于 2012-09-17T11:57:25.560 回答