免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2850 | 回复: 4
打印 上一主题 下一主题

[Linux] 开发板上SD卡存储数据问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-07 17:21 |只看该作者 |倒序浏览
各位好,最近项目需要用到SD卡存储历史数据,ARM9+Linux2.6平台下,遇到一个奇怪的问题。
存储历史数据的时候,系统的内存在随之增加,增加的内存差不多就是向SD卡里面写入的数据量大小。程序里面没有malloc后没有free的情况,应该不会出现内存泄露。
怀疑是文件缓存的问题,但是SD卡里面存储数据的文件时每分钟打开,下一分钟关闭再打开的,应该不会出现文件缓存一直增加的情况呀。
另外,SD卡确实是挂载成功了的,取下SD卡看里面的数据也确实写进去了。
不过我挂载SD的路径并不是默认的 /mnt 路径,而是在根目录下自行创建的一个文件夹。
麻烦大家帮忙分析一下出现这种情况的可能,拜谢!

论坛徽章:
0
2 [报告]
发表于 2014-01-07 17:37 |只看该作者
对了,我用的方法是,初始化的时候用脚本文件挂载SD卡到指定的目录下,应用程序里面判断挂载是否成功,不成功退出,成功了就在相应的挂载点创建文件,往里面写数据,基于Linux下的文件系统做的。

论坛徽章:
0
3 [报告]
发表于 2014-01-08 14:46 |只看该作者
谁来帮小弟分析分析呢,感觉像是写入SD卡文件里的数据缓存没有被回收。但是这是文件系统造成的呢还是驱动造成的,感觉无从下手来解决了

论坛徽章:
0
4 [报告]
发表于 2014-01-08 17:09 |只看该作者
#define T_INTERVAL 1
int tick_ok = 0;

void sigalrm_fn(int sig)
{   
       
        tick_ok = 1;

        alarm(T_INTERVAL);   
        return;
}

int main(int argc, char *argv[])
{
        int sys_retval;
        FILE *hfile_fp;
        unsigned char *data_ptr;
        /* for time */
        struct tm *local;
        time_t ltime;
        int old_min, old_hour;
        unsigned long ll=0;

        data_ptr = (unsigned char *)malloc(4096 * sizeof(unsigned char));
        if (data_ptr==NULL) {
                perror("malloc");
                exit(EXIT_FAILURE);
        }
        memset(data_ptr, 'A', 4096 * sizeof(unsigned char));
        /* to determine whether /sdcard exists */
        system("mount -t vfat /dev/mmc/blk0/part1 /mnt");
        sleep(10);
        sys_retval = access("/mnt/mntfailed", F_OK);
        if (sys_retval == 0) {
                printf("mount SD card failed!!!\n");
                exit(EXIT_FAILURE);
        }
printf("mnt sd successed!\n");       
        //创建/打开文件,截断方式
        if ((hfile_fp= fopen("/mnt/abc.txt", "wb+"))==NULL) {
                printf("creat flie abc.txt error!\n");
                exit(EXIT_FAILURE);
        }

        ltime = time(NULL);
        local = localtime(&ltime);
        old_min = local->tm_min;       

        signal(SIGALRM, sigalrm_fn);
        alarm(T_INTERVAL);
       
        printf("history datas!\n");
       
        while (1) {
                if (tick_ok) {
                        tick_ok = 0;
                        ltime = time(NULL);
                        local = localtime(&ltime);
                        //写文件
                        if (fwrite(data_ptr, sizeof(char), 1024, hfile_fp) != 1024) {
                                printf("write file abc.txt error!\n");
                                exit(EXIT_FAILURE);
                        }

printf("%d\n", ++ll);
                        /* 新的一分钟到来 */
                        if(local->tm_min != old_min) {
//printf("newm:%d, oldm:%d\n", local->tm_min, old_min);                               
printf("new min!\n");
                                old_min = local->tm_min;       
                                if (fclose(hfile_fp) != 0) {
                                        printf("close file error!\n");
                                        exit(EXIT_FAILURE);
                                }
                                usleep(100000);
                                /* 打开文件 */
                                if ((hfile_fp=fopen("/mnt/abc.txt", "ab+")) == NULL) {
                                        printf("open flie abc.txt error!\n");
                                        exit(EXIT_FAILURE);
                                }                       
                        }
                }
                usleep(50000);
        }

        free(data_ptr);
        if (fclose(hfile_fp) != 0) {
                printf("close file error!\n");
                exit(EXIT_FAILURE);
        }

        exit(EXIT_SUCCESS);
}

论坛徽章:
0
5 [报告]
发表于 2014-01-08 17:19 |只看该作者
这样说的有点抽象,刚才改出来一个写SD卡的小测试程序,运行之后,发现内存也还是在增加
我是每秒钟向SD卡里面的文件写1K数据,使用free查看内存占用还是在增加。
kill掉测试程序的进程之后,增加的内存占用也没有减少到,所增加的内存量和写入SD卡的数据量基本一致;
之后我umount了SD卡,free内存信息,发现内存占用减少了,正好是运行测试程序之前的占用量!
有点头晕了,free出来的不是内存信息么,按说我往SD卡里面写数据,内存不应该增加那么快,增加那么多啊。
难道mount SD卡到文件系统里面,是映射到内存里的?如果真是这样的话,存储数据的程序一直运行,迟早会把内存吃空的啊。
Linux系统对这一块的内存回收机制又是怎么个情况呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP