我直接把扩展例程UCOSII移植拿来想实现同时图片和播放音乐,结果只能跑一种

2019-07-20 20:43发布

本人刚入门,勿喷。。。我的想法是这样的,把扩展例程UCOSII移植直接拿来用,在任务led0_task中替换音乐播放器实验代码,在任务led1_task中替换图片显示实验代码,结果实验现象是刚开始启动开发板音乐播放器实验运行,歌曲正常播放,2~3秒以后转到显示图片,然后就不放音乐了,就一直在图片那禁止了。我把任务led1_task中的代码换成轮回清屏代码就可以实现双进程,请请问这是怎么回事?我试过将任务led1_task中的轮回清屏代码里的延时部分延时换成很短,也会造成不放音乐,在之前led1_task中用图片显示实验代码里的延时也不低啊,求指教。

[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"  
#include "usart.h"   
#include "led.h"
#include "lcd.h"
#include "key.h"  
#include "usmart.h"   
#include "malloc.h"
#include "w25qxx.h"   
#include "sdio_sdcard.h"
#include "ff.h"  
#include "exfuns.h"   
#include "fontupd.h"
#include "text.h"         
#include "wm8978.h"         
#include "audioplay.h"
#include "includes.h"
#include "piclib.h"       
#include "string.h"       
#include "math.h"       
//ALIENTEK ì½Ë÷ÕßSTM32F407¿a·¢°å êμÑé43
//òôàÖ2¥·ÅÆ÷ êμÑé -¿aoˉêy°æ±¾
//¼¼êõÖ§3Ö£owww.openedv.com
//ìÔ±|μêÆì£ohttp://eboard.taobao.com
//1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾   
//×÷ÕߣoÕyμãÔ-×ó @alientek
#define START_TASK_PRIO                        10  ///¿aê¼èÎÎñμÄóÅÏ輶Îa×îμí
//éèÖÃèÎÎñ¶ÑÕ»′óD¡
#define START_STK_SIZE                        128
//èÎÎñèÎÎñ¶ÑÕ»
OS_STK START_TASK_STK[START_STK_SIZE];
//èÎÎñoˉêy
void start_task(void *pdata);

//LED0èÎÎñ
//éèÖÃèÎÎñóÅÏ輶
#define LED0_TASK_PRIO                        7
//éèÖÃèÎÎñ¶ÑÕ»′óD¡
#define LED0_STK_SIZE                        128
//èÎÎñ¶ÑÕ»
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//èÎÎñoˉêy
void led0_task(void *pdata);

//LED1èÎÎñ
//éèÖÃèÎÎñóÅÏ輶
#define LED1_TASK_PRIO                        6
//éèÖÃèÎÎñ¶ÑÕ»′óD¡
#define LED1_STK_SIZE                        128
//èÎÎñ¶ÑÕ»
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//èÎÎñoˉêy
void led1_task(void *pdata);

//¸¡μã2aêÔèÎÎñ
#define FLOAT_TASK_PRIO                        5
//éèÖÃèÎÎñ¶ÑÕ»′óD¡
#define FLOAT_STK_SIZE                        128
//èÎÎñ¶ÑÕ»
//èç1ûèÎÎñÖDê1óÃprintfà′′ò󡸡μãêy¾YμÄ»°ò»μãòa8×Ö½ú¶ÔÆë
__align(8) OS_STK FLOAT_TASK_STK[FLOAT_STK_SIZE];
//èÎÎñoˉêy
void float_task(void *pdata);


u16 pic_get_tnum(u8 *path)
{          
        u8 res;
        u16 rval=0;
        DIR tdir;                         //áùê±Ä¿Â¼
        FILINFO tfileinfo;        //áùê±ÎļtDÅÏ¢       
        u8 *fn;                                                                                          
    res=f_opendir(&tdir,(const TCHAR*)path);         //′ò¿aĿ¼
          tfileinfo.lfsize=_MAX_LFN*2+1;                                //3¤ÎļtÃû×î′ó3¤¶è
        tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize);//Îa3¤Îļt»o′æÇø·ÖÅäÄú′æ
        if(res==FR_OK&&tfileinfo.lfname!=NULL)
        {
                while(1)//2éÑˉ×üμÄóDD§Îļtêy
                {
                res=f_readdir(&tdir,&tfileinfo);                       //¶áè¡Ä¿Â¼ÏÂμÄò»¸öÎļt
                if(res!=FR_OK||tfileinfo.fname[0]==0)break;        //′íÎóáË/μ½Ä©Î2áË,íË3ö                  
                     fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);                         
                        res=f_typetell(fn);       
                        if((res&0XF0)==0X50)//衸ßËÄλ,¿′¿′êÇ2»êÇí¼Æ¬Îļt       
                        {
                                rval++;//óDD§ÎļtêyÔö¼ó1
                        }            
                }  
        }
        return rval;
}


int main(void)
{
        delay_init(168);       //Ñóê±3õê¼»ˉ
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÖD¶Ï·Ö×éÅäÖÃ
        uart_init(115200);    //′®¿ú2¨ìØÂêéèÖÃ
        LED_Init();  //LED3õê¼»ˉ
        LCD_Init();                                        //LCD3õê¼»ˉ  
        KEY_Init();                                        //°′¼ü3õê¼»ˉ  
        W25QXX_Init();                                //3õê¼»ˉW25Q128
        WM8978_Init();                                //3õê¼»ˉWM8978
        WM8978_HPvol_Set(40,40);        //¶ú»úòôá¿éèÖÃ
        WM8978_SPKvol_Set(50);                //à®°èòôá¿éèÖÃ
       
        my_mem_init(SRAMIN);                //3õê¼»ˉÄú2¿Äú′æ3Ø
        my_mem_init(SRAMCCM);                //3õê¼»ˉCCMÄú′æ3Ø
        exfuns_init();                                //ÎafatfsÏà1رäá¿éêÇëÄú′æ  
  f_mount(fs[0],"0:",1);                 //1òÔØSD¿¨
       
        OSInit();  //UCOS3õê¼»ˉ
        OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); //′′½¨¿aê¼èÎÎñ
        OSStart(); //¿aê¼èÎÎñ
}

//¿aê¼èÎÎñ
void start_task(void *pdata)
{
        OS_CPU_SR cpu_sr=0;
        pdata=pdata;
        OSStatInit();  //¿aÆôí3¼ÆèÎÎñ
       
        OS_ENTER_CRITICAL();  //½øèëáù½çÇø(1رÕÖD¶Ï)
        OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);//′′½¨LED0èÎÎñ
        OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);//′′½¨LED1èÎÎñ
        OSTaskSuspend(START_TASK_PRIO);//1òÆe¿aê¼èÎÎñ
        OS_EXIT_CRITICAL();  //íË3öáù½çÇø(¿aÖD¶Ï)
}


//LED0èÎÎñ
void led0_task(void *pdata)
{
        while(1)
        {
        POINT_COLOR=RED;      
        while(font_init())                         //¼ì2é×Ö¿a
        {            
                LCD_ShowString(30,50,200,16,16,"Font Error!");
                delay_ms(200);                                  
                LCD_Fill(30,50,240,66,WHITE);//Çå3yÏÔê¾             
                delay_ms(200);                                  
        }           
                while(1)
                {
                        audio_play();
                }
        }
}

//LED1èÎÎñ
void led1_task(void *pdata)
{
        u8 x;
        while(1)
        {
        switch(x)
                {
                        case 0CD_Clear(WHITE);break;
                        case 1CD_Clear(BLACK);break;
                        case 2CD_Clear(BLUE);break;
                        case 3CD_Clear(RED);break;
                        case 4CD_Clear(MAGENTA);break;
                        case 5CD_Clear(GREEN);break;
                        case 6CD_Clear(CYAN);break;
                        case 7CD_Clear(YELLOW);break;
                        case 8CD_Clear(BRRED);break;
                        case 9CD_Clear(GRAY);break;
                        case 10:LCD_Clear(LGRAY);break;
                        case 11:LCD_Clear(BROWN);break;
                }
                POINT_COLOR=RED;          
                LCD_ShowString(30,40,210,24,24,"Explorer STM32F4");       
                LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
                LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");                                               
                LCD_ShowString(30,130,200,12,12,"2014/5/4");               
          x++;
                if(x==12)x=0;
                LED0=!LED0;         
                delay_ms(5000);
        }
//        u8 res;
//         DIR picdir;                         //í¼Æ¬Ä¿Â¼
//        FILINFO picfileinfo;//ÎļtDÅÏ¢
//        u8 *fn;                           //3¤ÎļtÃû
//        u8 *pname;                        //′ø·¾¶μÄÎļtÃû
//        u16 totpicnum;                 //í¼Æ¬Îļt×üêy
//        u16 curindex;                //í¼Æ¬μ±Ç°Ë÷òy
//        u8 key;                                //¼üÖμ
//        u8 pause=0;                        //ÔYí£±ê¼Ç
//        u8 t;
//        u16 temp;
//        u16 *picindextbl;        //í¼Æ¬Ë÷òy±í
//        while(1)
//        {
//               
//        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏ輶·Ö×é2
//        delay_init(168);  //3õê¼»ˉÑóê±oˉêy
//        uart_init(115200);                //3õê¼»ˉ′®¿ú2¨ìØÂêÎa115200
//        LED_Init();                                        //3õê¼»ˉLED
//        usmart_dev.init(84);                //3õê¼»ˉUSMART
//         LCD_Init();                                        //LCD3õê¼»ˉ  
//         KEY_Init();                                        //°′¼ü3õê¼»ˉ  
//        W25QXX_Init();                                //3õê¼»ˉW25Q128
//        my_mem_init(SRAMIN);                //3õê¼»ˉÄú2¿Äú′æ3Ø
//        my_mem_init(SRAMCCM);                //3õê¼»ˉCCMÄú′æ3Ø
//        exfuns_init();                        //ÎafatfsÏà1رäá¿éêÇëÄú′æ  
//          f_mount(fs[0],"0:",1);         //1òÔØSD¿¨
//         f_mount(fs[1],"1:",1);         //1òÔØFLASH.
//        POINT_COLOR=RED;      
//        while(font_init())                 //¼ì2é×Ö¿a
//        {            
//                LCD_ShowString(30,50,200,16,16,"Font Error!");
//                delay_ms(200);                                  
//                LCD_Fill(30,50,240,66,WHITE);//Çå3yÏÔê¾             
//                delay_ms(200);                                  
//        }           
//         Show_Str(30,50,200,16,"Explorer STM32F4¿a·¢°å",16,0);                                             
//        Show_Str(30,70,200,16,"í¼Æ¬ÏÔê¾3ìDò",16,0);                                             
//        Show_Str(30,90,200,16,"KEY0:NEXT KEY1REV",16,0);                                             
//        Show_Str(30,110,200,16,"WK_UPAUSE",16,0);                                             
//        Show_Str(30,130,200,16,"ÕyμãÔ-×ó@ALIENTEK",16,0);                                             
//        Show_Str(30,150,200,16,"2014Äê5ÔÂ15èÕ",16,0);
//         while(f_opendir(&picdir,"0:/PICTURE"))//′ò¿aí¼Æ¬Îļt¼D
//         {            
//                Show_Str(30,170,240,16,"ICTUREÎļt¼D′íÎó!",16,0);
//                delay_ms(200);                                  
//                LCD_Fill(30,170,240,186,WHITE);//Çå3yÏÔê¾             
//                delay_ms(200);                                  
//        }  
//        totpicnum=pic_get_tnum("0:/PICTURE"); //μÃμ½×üóDD§Îļtêy
//          while(totpicnum==NULL)//í¼Æ¬ÎļtÎa0               
//         {            
//                Show_Str(30,170,240,16,"ûóDí¼Æ¬Îļt!",16,0);
//                delay_ms(200);                                  
//                LCD_Fill(30,170,240,186,WHITE);//Çå3yÏÔê¾             
//                delay_ms(200);                                  
//        }
//          picfileinfo.lfsize=_MAX_LFN*2+1;                                                //3¤ÎļtÃû×î′ó3¤¶è
//        picfileinfo.lfname=mymalloc(SRAMIN,picfileinfo.lfsize);        //Îa3¤Îļt»o′æÇø·ÖÅäÄú′æ
//         pname=mymalloc(SRAMIN,picfileinfo.lfsize);                                //Îa′ø·¾¶μÄÎļtÃû·ÖÅäÄú′æ
//         picindextbl=mymalloc(SRAMIN,2*totpicnum);                                //éêÇë2*totpicnum¸ö×Ö½úμÄÄú′æ,óÃóú′æ·Åí¼Æ¬Ë÷òy
//         while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//Äú′æ·ÖÅä3ö′í
//         {            
//                Show_Str(30,170,240,16,"Äú′æ·ÖÅä꧰ü!",16,0);
//                delay_ms(200);                                  
//                LCD_Fill(30,170,240,186,WHITE);//Çå3yÏÔê¾             
//                delay_ms(200);                                  
//        }         
//        //¼Ç¼Ë÷òy
//    res=f_opendir(&picdir,"0:/PICTURE"); //′ò¿aĿ¼
//        if(res==FR_OK)
//        {
//                curindex=0;//μ±Ç°Ë÷òyÎa0
//                while(1)//è«2¿2éÑˉò»±é
//                {
//                        temp=picdir.index;                                                                //¼Ç¼μ±Ç°index
//                res=f_readdir(&picdir,&picfileinfo);                       //¶áè¡Ä¿Â¼ÏÂμÄò»¸öÎļt
//                if(res!=FR_OK||picfileinfo.fname[0]==0)break;        //′íÎóáË/μ½Ä©Î2áË,íË3ö                  
//                     fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);                         
//                        res=f_typetell(fn);       
//                        if((res&0XF0)==0X50)//衸ßËÄλ,¿′¿′êÇ2»êÇí¼Æ¬Îļt       
//                        {
//                                picindextbl[curindex]=temp;//¼Ç¼Ë÷òy
//                                curindex++;
//                        }            
//                }
//        }   
//        Show_Str(30,170,240,16,"¿aê¼ÏÔê¾...",16,0);
//        delay_ms(1500);
//        piclib_init();                                                                                //3õê¼»ˉ»-í¼                     
//        curindex=0;                                                                                        //′ó0¿aê¼ÏÔê¾
//           res=f_opendir(&picdir,(const TCHAR*)"0:/PICTURE");         //′ò¿aĿ¼
//        while(res==FR_OK)//′ò¿a3é1|
//        {       
//                dir_sdi(&picdir,picindextbl[curindex]);                        //¸Ä±äμ±Ç°Ä¿Â¼Ë÷òy          
//        res=f_readdir(&picdir,&picfileinfo);                       //¶áè¡Ä¿Â¼ÏÂμÄò»¸öÎļt
//        if(res!=FR_OK||picfileinfo.fname[0]==0)break;        //′íÎóáË/μ½Ä©Î2áË,íË3ö
//             fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);                         
//                strcpy((char*)pname,"0:/PICTURE/");                                //¸′ÖÆ·¾¶(Ŀ¼)
//                strcat((char*)pname,(const char*)fn);                          //½«ÎļtÃû½óÔúoóÃæ
//                 LCD_Clear(BLACK);
//                 ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//ÏÔê¾í¼Æ¬   
//                Show_Str(2,2,240,16,pname,16,1);                                 //ÏÔê¾í¼Æ¬Ãû×Ö
//                t=0;
//                while(1)
//                {
//                        ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);
//                        key=KEY_Scan(0);                //é¨Ãè°′¼ü
//                        if(t>250)key=1;                        //Ä£Äaò»′ΰ′ÏÂKEY0   
//                        if((t%20)==0)LED0=!LED0;//LED0éá˸,ìáê¾3ìDòÕyÔúÔËDD.
//                        if(key==KEY1_PRES)                //éÏò»ÕÅ
//                        {
//                                if(curindex)curindex--;
//                                else curindex=totpicnum-1;
//                                break;
//                        }else if(key==KEY0_PRES)//ÏÂò»ÕÅ
//                        {
//                                curindex++;                          
//                                if(curindex>=totpicnum)curindex=0;//μ½Ä©Î2μÄê±oò,×Ô¶ˉ′óí·¿aê¼
//                                break;
//                        }else if(key==WKUP_PRES)
//                        {
//                                pause=!pause;
//                                LED1=!pause;         //ÔYí£μÄê±oòLED1áá.  
//                        }
//                        if(pause==0)t++;
//                        delay_ms(10);
//                }                                            
//                res=0;  
//        }                                                                                           
//        myfree(SRAMIN,picfileinfo.lfname);        //êí·ÅÄú′æ                            
//        myfree(SRAMIN,pname);                                //êí·ÅÄú′æ                            
//        myfree(SRAMIN,picindextbl);                        //êí·ÅÄú′æ       
//        }
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
LVZHENHAI
1楼-- · 2019-07-22 02:03
正点原子 发表于 2016-8-17 19:50
堆栈不够?进入hardfault了?

不会啊,我把任务led0_task音乐播放器实验代码替换成LED1闪烁都不行,程序一开始正常闪烁,但图片一刷新出来就不闪了
LVZHENHAI
2楼-- · 2019-07-22 04:31
正点原子 发表于 2016-8-17 19:50
堆栈不够?进入hardfault了?

。。还真是堆栈不够,多谢原子哥

一周热门 更多>