OpenEdv-开源电子网

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

大神进来看看。用EMWIN播放wav文件,重复进入recorder_play_song函数6次就会卡死,什么原因?

[复制链接]

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2016-6-12
在线时间
61 小时
发表于 2016-10-9 20:44:48 | 显示全部楼层 |阅读模式
1金钱

用这段代码实现播放WAV文件的,我用EMWIN 的listbox通过点击不同项目播放不同WAV文件,用EMWIN的效果就是不等下面的函数执行完直接重新执行,我把该释放的内存在函数执行前释放一次,避免重复申请内存,还是会进入6次就卡死,但是让WAV文件播放完毕再点击播放就不会出现这个问题,什么原因?

[mw_shl_code=c,true]u8 recorder_play_song(u8* fname)
{
        u8 key;
        u8 t=0;
        u8 res;  
        u32 fillnum;
        audiodev.file=(FIL*)mymalloc(SRAMIN,sizeof(FIL));
        audiodev.i2sbuf1=mymalloc(SRAMIN,WAV_I2S_TX_DMA_BUFSIZE);
        audiodev.i2sbuf2=mymalloc(SRAMIN,WAV_I2S_TX_DMA_BUFSIZE);
        audiodev.tbuf=mymalloc(SRAMIN,WAV_I2S_TX_DMA_BUFSIZE);
        if(audiodev.file&&audiodev.i2sbuf1&&audiodev.i2sbuf2&&audiodev.tbuf)
        {
                res=wav_decode_init(fname,&wavctrl);//μÃμ½ÎļtμÄDÅÏ¢
                if(res==0)//½aÎöÎļt3é1|
                {
                        if(wavctrl.bps==16)
                        {
                                WM8978_I2S_Cfg(2,0);        //·éàûÆÖ±ê×¼,16λêy¾Y3¤¶è
                                I2S2_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_16bextended);                //·éàûÆÖ±ê×¼,Ö÷»ú·¢Ëí,ê±ÖóμíμçƽóDD§,16λà©Õ1Ö¡3¤¶è
                        }else if(wavctrl.bps==24)
                        {
                                WM8978_I2S_Cfg(2,2);        //·éàûÆÖ±ê×¼,24λêy¾Y3¤¶è
                                I2S2_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_24b);                //·éàûÆÖ±ê×¼,Ö÷»ú·¢Ëí,ê±ÖóμíμçƽóDD§,24λà©Õ1Ö¡3¤¶è
                        }
                        I2S2_SampleRate_Set(wavctrl.samplerate);//éèÖÃ2éÑùÂê
                        I2S2_TX_DMA_Init(audiodev.i2sbuf1,audiodev.i2sbuf2,WAV_I2S_TX_DMA_BUFSIZE/2); //ÅäÖÃTX DMA
                        i2s_tx_callback=wav_i2s_dma_tx_callback;                        //»Øμ÷oˉêyÖ¸wav_i2s_dma_callback
                        audio_stop();
                        res=f_open(audiodev.file,(TCHAR*)fname,FA_READ);        //′ò¿aÎļt
                        if(res==0)
                        {
                                f_lseek(audiodev.file, wavctrl.datastart);                //ìø1yÎļtí·
                                fillnum=wav_buffill(audiodev.i2sbuf1,WAV_I2S_TX_DMA_BUFSIZE,wavctrl.bps);
                                fillnum=wav_buffill(audiodev.i2sbuf2,WAV_I2S_TX_DMA_BUFSIZE,wavctrl.bps);
                                audio_start();  
                                while(res==0)
                                {
                                        GUI_Delay(100);
                                        while(wavtransferend==0);//μè′ywav′«êäíê3é;
                                        wavtransferend=0;
                                        if(fillnum!=WAV_I2S_TX_DMA_BUFSIZE)//2¥·Å½áêø?
                                        {
                                                res=KEY0_PRES;
                                                break;
                                        }
                                        if(wavwitchbuf)fillnum=wav_buffill(audiodev.i2sbuf2,WAV_I2S_TX_DMA_BUFSIZE,wavctrl.bps);//ìî3äbuf2
                                        else fillnum=wav_buffill(audiodev.i2sbuf1,WAV_I2S_TX_DMA_BUFSIZE,wavctrl.bps);//ìî3äbuf1
                                        while(1)
                                        {
                                                GUI_Delay(100);
                                                key=KEY_Scan(0);
                                                if(key==WKUP_PRES)//ÔYí£
                                                {
                                                        if(audiodev.status&0X01)audiodev.status&=~(1<<0);
                                                        else audiodev.status|=0X01;  
                                                }
                                                if(key==KEY2_PRES||key==KEY0_PRES)//&#207;&#194;ò&#187;&#199;ú/é&#207;ò&#187;&#199;ú
                                                {
                                                        res=key;
                                                        break;
                                                }
                                                wav_get_curtime(audiodev.file,&wavctrl);//μ&#195;μ&#189;×üê±&#188;&#228;oíμ±&#199;°2¥·&#197;μ&#196;ê±&#188;&#228;
                                                recorder_msg_show(wavctrl.totsec,wavctrl.cursec,wavctrl.bitrate);
                                                t++;
                                                if(t==20)
                                                {
                                                        t=0;
                                                        LED0=!LED0;
                                                }
                                                if((audiodev.status&0X01)==0)delay_ms(10);
                                                else break;
                                        }
                                }
                                audio_stop();
                        }else res=0XFF;
                }else res=0XFF;
        }else res=0XFF;
        myfree(SRAMIN,audiodev.tbuf);        //êí·&#197;&#196;ú′&#230;
        myfree(SRAMIN,audiodev.i2sbuf1);//êí·&#197;&#196;ú′&#230;
        myfree(SRAMIN,audiodev.i2sbuf2);//êí·&#197;&#196;ú′&#230;
        myfree(SRAMIN,audiodev.file);        //êí·&#197;&#196;ú′&#230;
        return res;
}[/mw_shl_code]

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

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2016-6-12
在线时间
61 小时
 楼主| 发表于 2016-10-9 21:36:28 | 显示全部楼层
就是说用UCOS系统时一个函数里面有WHILE循环,多次调用这个函数没有退出就会卡死程序么
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2016-6-12
在线时间
61 小时
 楼主| 发表于 2016-10-10 16:34:43 | 显示全部楼层
有人没?用EMWIN时造成的每次点击按钮没有退出一个函数的while循环,再多次调用此函数是不是会导致卡死,怎么解决?
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2016-6-12
在线时间
61 小时
 楼主| 发表于 2016-10-10 16:35:22 | 显示全部楼层
大神来看看。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-10-12 21:51:55 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 21:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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