OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5133|回复: 4

sd卡 读写 数据指针问题请教

[复制链接]

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
发表于 2014-7-25 14:56:22 | 显示全部楼层 |阅读模式
5金钱
#define FILE_BUF_LENGTH  (2048)
__align(4) u8 filebuf[FILE_BUF_LENGTH] = {0};

FRESULT DownloadDataToSDFunc_EPA_ACTS(void)
{
static u32 ReadSaveToSD_Pointer = 0, ReadSaveToSD_PointerBack = 0;

uint32_t byteamount ;
uint32_t readpointer ;

char csx[30];
uint8  err;
UINT bw,br; // 文件读/写字节计数

FRESULT res;
FATFS   fs;
FIL     file;
DIR     dir;

if(SysParameter.InfoData.Tag18000Total == 0) //if(SysParameter.InfoData.AlarmPacketWritePointer == 0)
{
return FR_NO_FILE; //没有可以写入的文件,自定义的返回类型
}

if( SD_Detect() != SD_NOT_PRESENT ) //检测磁盘是否插好
{
SDIO_POWER_EN_ON;
OSTimeDly(OS_TICKS_PER_SEC/10);

Read_Clock();
sprintf((char*)csx,"/AVANTE/AAL%02d%02d.dat",RtcTime.month,RtcTime.dom);

if(disk_initialize(0) == SD_OK)
{

res = f_mount(0, &fs); // Register a work area for logical drive 0
res = f_opendir (&dir,"/AVANTE");

if(FR_OK != res)
{
res = f_mkdir("/AVANTE");
if(FR_EXIST == res) //已经存在同名的文件或目录
{
}

else if(FR_OK != res)
{
f_mount(0, NULL);
SDIO_POWER_EN_OFF;
OSSemPost(SPIOperateSem);
return res;
}
}

res = f_open(&file, (char*)csx, FA_READ | FA_WRITE | FA_OPEN_ALWAYS); //打开目标文件,如果没有则创建
if (res != FR_OK)
{
f_mount(0, NULL);
SDIO_POWER_EN_OFF;
return res;
}

SysParameter.InfoData.Tag18000Total=365;    //这个值/2,写入的数据没有问题,否则写入到sd卡的数据有错误
byteamount = (u32)(18 * (SysParameter.InfoData.Tag18000Total));  
readpointer = 0 ;

while(byteamount > readpointer)
{
if(byteamount > (readpointer + FILE_BUF_LENGTH))
{

Flash_Read((TAG18000_STA_ADDR + readpointer), FILE_BUF_LENGTH, (uint8*)&filebuf[0]);    //从spi的flash里面读取数据,这个数据在写入时已经是校验过的,绝对是对的,而且读取的数//据通过串口看也是对的
res = f_lseek(&file, f_size(&file));         //这个文件大小好像始终都是0 ????????????
res = f_write(&file, (uint8*)&filebuf[0], FILE_BUF_LENGTH, &bw);

if (bw != (FILE_BUF_LENGTH))  //说明写入有错误
{
f_mount(0, NULL);
SDIO_POWER_EN_OFF;
return res;
}
readpointer += FILE_BUF_LENGTH ;
}

else
{
memset((uint8*)&filebuf[0], 0, FILE_BUF_LENGTH);
Flash_Read((TAG18000_STA_ADDR + readpointer), (byteamount - readpointer), (uint8*)&filebuf[0]);
res = f_lseek(&file, f_size(&file));        //这个文件大小好像始终都是0 ????????????
res = f_write(&file, (uint8*)&filebuf[0], byteamount - readpointer, &bw);

if (bw != (byteamount - readpointer))  //说明写入有错误
{
f_mount(0, NULL);
SDIO_POWER_EN_OFF;
return res;
}
readpointer = byteamount ;
}
}

f_close(&file);
f_mount(0, NULL);
SDIO_POWER_EN_OFF;

}
}
else
{
SDIO_POWER_EN_OFF;
return FR_DISK_ERR;
}

return FR_OK;
}
大神们看看问题出在哪里啊 ???

最佳答案

查看完整内容[请看2#楼]

局部变量太多,必死无疑.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-25 14:56:23 | 显示全部楼层
局部变量太多,必死无疑.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2014-7-26 13:38:24 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
局部变量多了就不行了,这是何故啊 ???
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-26 23:29:56 | 显示全部楼层
回复【3楼】hpdell:
---------------------------------
因为堆栈不够了.
所以就会死机.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2014-7-29 16:09:03 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原来如此啊
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 17:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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