OpenEdv-开源电子网

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

fatfs文件系统的问题,很急啊!!!

[复制链接]

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
2100
注册时间
2013-11-27
在线时间
518 小时
发表于 2015-3-30 10:55:29 | 显示全部楼层 |阅读模式
5金钱
使用的ucos+ucgui

播放音乐的任务,每次按键都会影响歌曲的播放,因为只要点了按键,文件read就读不出来数据了,br就等于0了 然后就切换到下一首了,返回的错误是06
路劲不对,可是我看来mfile这个结构体没有什么变化啊,为什么会读取不出来数据呢?

在切换任务的时候也会打开其他的文件,我使用了外部字库

FRESULT play_mp3(const TCHAR *fileName)
{
u16 i,n;
// FATFS fs;              // 建立一个文件系统
//  FIL file;              // 暂存文件
UINT  br;              // 字节计数器
FRESULT res;   // 存储函数执行结果
u8 mp3_buf[512]={0};

VS_HD_Reset(); //硬复位
   
VS_Soft_Reset();   //软复位VS10XX   
set10XX();         //设置音量等信息          

SPIx_SetSpeed(SPI_SPEED_8);//高速,对VS1003B,最大值不能超过36.864/6Mhz,这里设置为4.5M 

    f_mount(0,&fs);   // 加载文件系统
file_flag=1;

res = f_open(&mfile, fileName, FA_OPEN_EXISTING|FA_READ); // 打开文件
    if(res != FR_OK)  // 如果没有正确打开文件
    {
return res;  // 返回错误报告
    }
else  // 如果打开了文件
{
while(1)
{
if(play_flag==1)
{
res=f_read(&mfile,mp3_buf,512,&br);
if(br==0)
{
file_num++;
break;
}
i=0;
do      //主播放循环
   {      
if(VS_DQ!=0)   
{    
    VS_XDCS=0;    
           for(n=0;n<32;n++)
{
SPIx_ReadWriteByte(mp3_buf[i++]);
}
VS_XDCS=1;    
}    
}while(i<511);
delay_ms(15);
}
else
{
play_flag=1;
break;
}
}
}
    f_close(&mfile);      // 关闭文件,必须和f_open函数成对出现
// GPIO1->DATA &= ~(1<<10);
    f_mount(0,0); // 卸载文件系统
file_flag=0;

    return res;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-30 18:59:43 | 显示全部楼层
楼主问了不少问题,也应该学了一点东西了吧。
基础的,函数局部变量不要太多。
你居然还搞出:u8 mp3_buf[512]={0};
这种奇葩数组在函数里面,我也是醉了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
2100
注册时间
2013-11-27
在线时间
518 小时
 楼主| 发表于 2015-3-30 23:06:45 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
不是,我一直觉得,局部变量不是到函数结束以后就会释放吗?所以我才放在这里面的。


fatfs是可以同时打开两个文件的吗?
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
2100
注册时间
2013-11-27
在线时间
518 小时
 楼主| 发表于 2015-3-30 23:09:45 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
哈哈 确实问了不少的问题。

我看到你使用的那些局部变量都是用内存分配来做的,到了函数末尾才释放的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-30 23:39:58 | 显示全部楼层
回复【4楼】wmh19910511:
---------------------------------
内存分配和你这种放一个大的数组 完全是两码事。
内存分配占用的堆栈无论分配多少,都只占用1个u32类型的指针而已。
你这个是确确实实的512字节啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
金钱
2100
注册时间
2013-11-27
在线时间
518 小时
 楼主| 发表于 2015-3-31 00:02:06 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
不会吧  只占用一个u32类型的指针?我看里面给指针赋值了。。。为什么只占一个u32的指针啊?

不是一开始 初始化的时候分配了 规定字节的大小吗?
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2015-3-31 08:17:01 | 显示全部楼层
回复【6楼】wmh19910511:
---------------------------------
原子大大的意思應該是只要是大些的數組 都丟在堆裡面

宣告一個指針 然後用malloc()分配空間 

這樣棧裡面就只占用4個byte 其他的都在堆

原因應該是一開始task分配的stack都不是很大 

區域變數宣告太多可能會溢出崩潰...

PS:我亂猜的 還沒真的用過OS...
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-31 23:57:17 | 显示全部楼层
回复【6楼】wmh19910511:
---------------------------------
好好理解下指针。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 11:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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