注册 登录
查看: 449|回复: 17

[K60] 关于SDHC存储时间的问题!

[复制链接]
发表于 2014-5-18 12:38:25 | 显示全部楼层 |阅读模式
void img_sd_init(void) //初始化SD
{
    int   fireres;
    char  myfilename[20];
    u16 imgsize[] = {CAMERA_H, CAMERA_W};
    u32 mybw;
    u32 Imag_num = 0;

    f_mount(0, &firefs);

    do
    {
        Imag_num ++;
        sprintf(myfilename, "0:/Fire%d.sd", Imag_num);
        fireres = f_open( &firesrc , myfilename, FA_CREATE_NEW | FA_WRITE);

        if(firefs.fs_type == 0)
        {
            firesrc.fs = 0;
            return;
        }

    }while(fireres == FR_EXIST);        //如果文件存在,则命名继续加1

    if ( fireres == FR_OK )
    {
        fireres = f_write(&firesrc, imgsize, sizeof(imgsize), (UINT *)&mybw);  //先写入高和宽,方便上位机处理
    }
    else
    {
        f_close(&firesrc);
        firesrc.fs = 0;
    }
}

void img_sd_save(u8 * imgaddr)  //存SD
{
#define SD_ONEWRITE_MAX 511   //511

    int   fireres;
    u32 mybw;
    static u8 time = 0;
    u32 size = CAMERA_SIZE;

    if(firesrc.fs != 0)
    {
        time ++;

        while(size > SD_ONEWRITE_MAX)
        {
            fireres = f_write(&firesrc, imgaddr, SD_ONEWRITE_MAX , (UINT *)&mybw);  
            imgaddr +=   SD_ONEWRITE_MAX;  
            size -=  SD_ONEWRITE_MAX;
        }

        fireres = f_write(&firesrc, imgaddr, size , (UINT *)&mybw);  

        if(fireres != FR_OK)
        {
            f_close(&firesrc);
            firesrc.fs = 0;
        }

        if(time > 30)
        {
            time = 0 ;
            f_sync(&firesrc);
        }
    }
}


请问山外哥,这个是旧版代码还是新版代码?我还发现每隔一段时间规律性的来一个很长时间的存储,不是道问什么!

回复

使用道具 举报

发表于 2014-5-18 14:20:07 | 显示全部楼层
是因为有个 f_sync(&firesrc); 这个函数是同步的。可以避免突然掉电导致数据丢失。

如果可以保证不会突然掉电,那么可以等小车停下来,然后按下按键来调用 f_sync(&firesrc); 函数进行同步,就可以避免中间占用较长的时间。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 14:50:20 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-18 14:20
是因为有个 f_sync(&firesrc); 这个函数是同步的。可以避免突然掉电导致数据丢失。

如果可以保证不会突然 ...

      /*   if(time > 30)
        {
            time = 0 ;
            f_sync(&firesrc);
        }*/

if(backs>4)  
            {  f_sync(&firesrc);
               FTM_PWM_Duty(FTM0,CH1, 0);//左轮死区
               FTM_PWM_Duty(FTM0,CH2, 0);//右轮死区
               FTM_PWM_Duty(FTM0,CH3, 0);//左轮死区
               FTM_PWM_Duty(FTM0,CH0, 0);//右轮死区

我把那个屏蔽了,在停车的时候调用,可效果还是一样的啊,问什么啊,急急急?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 14:55:57 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-18 14:20
是因为有个 f_sync(&firesrc); 这个函数是同步的。可以避免突然掉电导致数据丢失。

如果可以保证不会突然 ...

山外哥救助啊!!
回复 支持 反对

使用道具 举报

发表于 2014-5-18 15:08:09 | 显示全部楼层
喻顺志 发表于 2014-5-18 14:50
/*   if(time > 30)
        {
            time = 0 ;

你示波器测测 这个函数是不是写入时间很长。大概有多长?
f_write(&firesrc, imgaddr, size , (UINT *)&mybw);  

SD卡,写数据肯定需要一个长时间写入的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 15:56:53 | 显示全部楼层
gpio_set(PORTB,18,HIGH);
        while(size > SD_ONEWRITE_MAX)
        {  
        
        
            gpio_set(PORTB,18,LOW);
            fireres = f_write(&firesrc, imgaddr, SD_ONEWRITE_MAX , (UINT *)&mybw);  
            imgaddr +=   SD_ONEWRITE_MAX;  
            size -=  SD_ONEWRITE_MAX;
        }
        
         
        fireres = f_write(&firesrc, imgaddr, size , (UINT *)&mybw);  
        gpio_set(PORTB,18,HIGH);
我是这样测的,得到的结果是:图片上的结果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 15:58:10 | 显示全部楼层
请山外哥过目!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 15:58:28 | 显示全部楼层
急急急啊!
回复 支持 反对

使用道具 举报

发表于 2014-5-18 16:18:55 | 显示全部楼层
喻顺志 发表于 2014-5-18 15:56
gpio_set(PORTB,18,HIGH);
        while(size > SD_ONEWRITE_MAX)
        {  

f_write里停留300ms ,这个时间是正常的,写入到sd卡是需要时间的,没法避免啊!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 16:22:45 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-18 16:18
f_write里停留300ms ,这个时间是正常的,写入到sd卡是需要时间的,没法避免啊!

他是在每隔3.3秒钟左右有规律的出现300ms,在3s之内不会出现啊!
回复 支持 反对

使用道具 举报

发表于 2014-5-18 16:24:04 | 显示全部楼层
喻顺志 发表于 2014-5-18 16:22
他是在每隔3.3秒钟左右有规律的出现300ms,在3s之内不会出现啊!

其实是SD驱动有个缓存,够一个扇区才写入一次,如果没写满一个扇区,就暂时缓存。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 16:26:41 | 显示全部楼层
那岂不是误解了啊,山外哥!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 16:27:10 | 显示全部楼层

那岂不是无解了啊,山外哥!
回复 支持 反对

使用道具 举报

发表于 2014-5-18 16:28:28 | 显示全部楼层
喻顺志 发表于 2014-5-18 16:27
那岂不是无解了啊,山外哥!

既要写入数据,又不能占用时间,那样肯定无解啊!
因为SD卡需要占用时间,所以仅仅调试的时候用而已,比赛的时候很少会用SD卡。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 16:29:37 | 显示全部楼层
新版代码也存在这样的问题麽?
回复 支持 反对

使用道具 举报

发表于 2014-5-18 16:30:33 | 显示全部楼层
喻顺志 发表于 2014-5-18 16:29
新版代码也存在这样的问题麽?

凡是用SD卡都存在这问题!这个是SD卡驱动本来的特性。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 16:33:00 | 显示全部楼层
嗯嗯,谢谢山外哥啦!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 16:37:17 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-18 16:30
凡是用SD卡都存在这问题!这个是SD卡驱动本来的特性。

额,还有个问题f_write()可以被其他中断打断麽?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部