硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1846|回复: 12
收起左侧

[emWin] 请教下,标志组有些消息收不到是怎么回事啊 ?

[复制链接]

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2018-8-24 09:18:35 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2018-8-24 09:44 编辑

请教下,标志组有些消息收不到是怎么回事啊 ?

                /* 等待所有任务发来事件标志 */
                uxBits = xEventGroupWaitBits(xCreatedEventGroup, /* 事件标志组句柄 */
                                                                 0xFFFE,                        /* 等待0xFFFE某一位被设置 */
                                                                 pdTRUE,             /* 退出前0xFFFE位被清除,这里是任意0xFFFE位被设置就“退出”*/
                                                                 pdFALSE,            /* 设置为pdTRUE表示等待0xFFFE任意位被设置*/
                                                                 portMAX_DELAY);          /* 等待延迟时间 */

具体描述如下:

1、在 freertos 任务里面 某首曲目自动播放完成后就发送 下一个信息给 emwin

                                    /* 给emWin的音乐播放器发消息,切换到下一首歌曲播放 */
                                WM_SendMessageNoPara(hWinVideo, MSG_NextMusic);

2、emwin 收到 MSG_NextMusic 这个信息后,处理一些相关的数据后再发送

    emwin收到的信息:

                case MSG_NextMusic:
                        
                        if(hTimerProcess)
                        {
                                WM_DeleteTimer(hTimerProcess);
                                hTimerProcess =0;
                        }
               
                        g_tWav.ucDispUpdate = 1;  //初始化为 1
                        s_ucPlayStatus =1;   //播放状态初始化为 暂停状态,2018.08.17
               
                        /*1. 获取下一首要播放音频的序号 */
                        hItem = WM_GetDialogItem(hWinVideoList, GUI_ID_LISTVIEW0);
                        MusicPlayNum++;
                        if(MusicPlayNum == LISTVIEW_GetNumRows(hItem))
                        {
                                MusicPlayNum = 0;
                        }
                        
                        /* 2. 获取音频名 */
                        LISTVIEW_GetItemText(hItem, 0, MusicPlayNum, buf, VideoPathSzie);
                        
                        /* 3. 显示音频名到界面上 */
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_3);
                        TEXT_SetText(hItem,  (const char *)buf);

                        /* 4. 将音频完整的路径复制到缓冲s_VideoName里面 */
                        memset(s_VideoName, 0, VideoPathSzie);
                        strcpy((char *)s_VideoName, s_VideoPathDir);
                        strcat((char *)s_VideoName, buf);
                        
                        /* 5. 显示当前音频播放序号和总的音频数量 */
                        hItem = WM_GetDialogItem(hWinVideoList, GUI_ID_LISTVIEW0);
                        sprintf(buf, "%d/%d", MusicPlayNum + 1, LISTVIEW_GetNumRows(hItem));
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
                        TEXT_SetText(hItem,  (const char *)buf);

                        /* 6. 播放音频 */
                        s_tMusicMsg.ucName = (uint8_t *)s_VideoName;
                        _FileType = FATFS_GetFileType((char *)s_VideoName);
                        
                        switch(_FileType)
                        {
                                case T_AVI:
                                // avi 视频
                                s_tMusicMsg.ucType = MusicType_AVI;                                
                                break;
                                
                                case T_EMF:
                                // emf 视频
                                s_tMusicMsg.ucType = MusicType_EMF;                        
                                break;

                                default:
                                        USART_OS_Printf("Video format is not supported ? \r\n");        //是视频格式不支持
                                break;
                        }
                        /*
                           给音乐任务发送歌曲路径,因为emWin多任务的执行,
                           此时音乐任务被挂起,回调消息执行完才会回到音乐任务 。
                        */
                        pMusicMsg = &s_tMusicMsg;
                        if( xQueueSend(xQueue,
                                                  (void *)&pMusicMsg,
                                                  (TickType_t)portMAX_DELAY) == pdPASS)
                        {
                                /* 继续发消息,启动歌曲播放 */
//                                xEventGroupSetBits(xCreatedEventGroup, MusicTaskAudioStart_8);
                                
                                // 获取视频总的播放时间后再设置播放进度条范围
                                switch(s_tMusicMsg.ucType)
                                {
                                        case  MusicType_AVI:
                                        {
                                                GetAVIInfo((const char *)s_VideoName);                        //获取视频帧时间
                                                                                       
                                        } break;
                                       
                                        case MusicType_EMF:
                                        {
//                                                GetMP3Info(s_MusicName);
                                        } break;
                                }
                                hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_0);
                                SLIDER_SetRange(hItem, 0, g_tWav.uiTotalTime);
                                SLIDER_SetValue(hItem, 0);

                                hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
                                TEXT_SetText(hItem, (const char *)g_tWav.usInfo);
                                
                                sprintf(buf, "%02d:%02d:%02d/%02d:%02d:%02d",
                                                                0,
                                                                0,
                                                                0,
                                                                g_tWav.uiTotalTime/3600,
                                                                g_tWav.uiTotalTime%3600/60,
                                                                g_tWav.uiTotalTime%60);

                                hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_2);
                                TEXT_SetFont(hItem, &GUI_FontLubalGraph20B);
                                TEXT_SetText(hItem, buf);
                                
                                /* 继续发消息,启动歌曲播放 */
                                xEventGroupSetBits(xCreatedEventGroup, MusicTaskAudioStart_8);
                                
                                /* 继续发消息,启动歌曲播放 */
                                hTimerProcess   = WM_CreateTimer(pMsg->hWin, ID_TIMER_PROCESS, 500, 0);        
                                
                                USART_OS_Printf("Video Player next ... \r\n");        //播放下一曲
                        }

                     break;


3、在 FreeRTOS 任务里面貌似始终都没有收到

    MusicTaskAudioStart_8   这个信息啊  ???

    在任务里面貌似收到的一直是 MusicTaskAudioGetTime_7 或者是  MusicTaskReserved_4   ??????????????????




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107143
QQ
发表于 2018-8-24 09:32:31 | 显示全部楼层
是FreeRTOS的事件标志,需要你将它的定时器任务优先级弄到最高,因为FreeRTOS的时间标志需要定时器任务中间处理下。
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2018-8-24 09:55:51 | 显示全部楼层
本帖最后由 hpdell 于 2018-8-24 11:00 编辑
eric2013 发表于 2018-8-24 09:32
是FreeRTOS的事件标志,需要你将它的定时器任务优先级弄到最高,因为FreeRTOS的时间标志需要定时器任务中间 ...

你好,

我的 曲目任务

  xTaskCreate( vTaskMusic,                     /* 任务函数  */
                            "vTaskMusic",                   /* 任务名    */
                                        2048,                            /* 任务栈大小,单位word,也就是4字节 */
                                        NULL,                           /* 任务参数  */
                                        9,                               /* 目前总任务数量定义为10个,此处设置的优先级为9,也就是最高了
                                  最高任务不能够大于所定义的任务优先级最大值
                                  configMAX_PRIORITIES - 1
                                 目前定义最大任务数是10个(编号是0-9),
                              */
                                        &xHandleTaskMusic );   /* 任务句柄  */


任务:
#define MusicTaskWaitFlag                       (MusicTaskAudioFillBuffer0_10 | MusicTaskAudioFillBuffer1_9 | MusicTaskAudioReturn_6 | MusicTaskAudioGetTime_7)

static  void vTaskMusic(void *pvParameters)
{
        MusicMsg_T *pMsg;
        BaseType_t xResult;

        ( void )pvParameters;                  /* 避免编译器告警 */
        while(1)
        {
                /* 接受数据,播放MP3文件或者WAV文件 */
                xResult = xQueueReceive(xQueue,                    /* 消息队列句柄 */
                                                                                                                (void *)&pMsg,                     /* 这里获取的是结构体的地址 */
                                                                                                                (TickType_t)portMAX_DELAY);/* 设置阻塞时间 */

                if( xResult == pdPASS )
                {
                        /* DMA禁止后要等到当前转换完毕才可以停止,所以这里需要清除相应标志 */
                        xEventGroupWaitBits(xCreatedEventGroup, /* 事件标志组句柄 */
                                                                                                        MusicTaskWaitFlag,  /* 等待MusicTaskWaitFlag某位被设置 */
                                                                                                        pdTRUE,             /* 退出前MusicTaskWaitFlag被清除,这里是任意MusicTaskWaitFlag位被设置就“退出”*/
                                                                                                        pdFALSE,            /* 设置为pdFALSE表示等待MusicTaskWaitFlag任意位被设置*/
                                                                                                        0);                                  /* 等待延迟时间 */

      switch(pMsg->ucType)
      {
        case MusicType_WAV:
        {
           WavMusicPlay((const char *)pMsg->ucName);                                       
        } break;

        case  MusicType_MP3:
        {
           MP3MusicPlay((const char *)pMsg->ucName);               
        } break;

        case  MusicType_FLAC:
        {
           FLACMusicPlay((const char *)pMsg->ucName);
        } break;

        case  MusicType_APE:
        {
          APEMusicPlay((const char *)pMsg->ucName);
        } break;
                                
        case  MusicType_REC:
        {
                                        /* 录音机 */
                                        WavRecPlay((const char *)pMsg->ucName);
        }         break;                                

                                
        case  MusicType_RADIO:
        {
                                        /* 收音机 */
                                        RadioPlay();
        }         break;               

                                case   MusicType_AVI:
                                {
                                                /* avi 视频播放 */
                                                AVIMusicPlay((const char *)pMsg->ucName);
                                }  break;
                        

                        

        default : break;
      }
                }
        }
}


这个任务 我已经设置为最高了啊 ????
另外你说的定时器任务 是指的 FreeRTOS 的软件定时器优先级 还是 emwin 的软件定时器 优先级 啊 ?????
我目前吧 FreeRTOS 软件定时器的优先级设置为 7
#define configUSE_TIMERS   1  /* 配置为 1
                              使能软件定时器。
                              配置为 0
                              禁能软件定时器。
                              */
// 如果 configUSE_TIMERS ==1 ,那么下面的三个宏必须设置,切记
#define  configTIMER_TASK_PRIORITY  7  /*配置软件定时器任务的优先级。*/
#define  configTIMER_QUEUE_LENGTH   20  /*配置软件定时器命令队列的长度。*/
#define  configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 ) /*配置软件定时器任务的栈空间大小。 */






回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2018-8-24 11:54:46 | 显示全部楼层
eric2013 发表于 2018-8-24 09:32
是FreeRTOS的事件标志,需要你将它的定时器任务优先级弄到最高,因为FreeRTOS的时间标志需要定时器任务中间 ...

在播放音乐时,某个音乐正常播放完后会自动进入到下一首曲目继续播放,

怎么播放 视频就不行了,播放视频都是 套用 播放 音乐的 套路走的啊 ?????
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107143
QQ
发表于 2018-8-25 01:09:48 | 显示全部楼层
hpdell 发表于 2018-8-24 09:55
你好,

我的 曲目任务

是指的FreeRTOS的定时器任务,你当前开的7 ,比你的TaskMusic任务优先级一定要高。

最好将FreeRTOS的定时器任务设置成所有任务里面优先级最高的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107143
QQ
发表于 2018-8-25 01:19:01 | 显示全部楼层
hpdell 发表于 2018-8-24 11:54
在播放音乐时,某个音乐正常播放完后会自动进入到下一首曲目继续播放,

怎么播放 视频就不行了,播放 ...

一个很大的原因是这种架构使用FreeRTOS + FatFS的方案性能跟不上。

所以这种架构下,我们V6的视频播放器是采用的RTX + FlashFS。

你可以这样测试,将视频界面显示部分不做实际显示,仅作处理,看看音频部分是否正常。
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2018-8-25 08:27:17 | 显示全部楼层
本帖最后由 hpdell 于 2018-8-25 09:32 编辑
eric2013 发表于 2018-8-25 01:19
一个很大的原因是这种架构使用FreeRTOS + FatFS的方案性能跟不上。

所以这种架构下,我们V6的视频播放 ...

看来 FreeRTOS 也没有传说中的那么牛逼呀,

不知道使用 ucos-iii 会不会出现这个同样的问题呀 ?
st 的官方貌似提供了一个使用 freertos+emwin 播放 avi 视频的历程 ,路径如下:
STM32Cube_FW_H7_V1.3.0\Projects\STM32H743I_EVAL\Demonstration\STemWin\MDK-ARM

这个历程貌似看起来比较复杂,看着头晕,
找了半天也没有找到他播放视频的显示函数在哪里啊 ??????
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2018-8-26 20:09:12 | 显示全部楼层
eric2013 发表于 2018-8-25 01:19
一个很大的原因是这种架构使用FreeRTOS + FatFS的方案性能跟不上。

所以这种架构下,我们V6的视频播放 ...

这个问题终于搞定了啊

自动播放完成后搞个标志位职位
                                _VideoPlayCtrl.PlayNextFlag = 1;
                                /* 给emWin的音乐播放器发消息,切换到下一首歌曲播放 */
                                WM_SendMessageNoPara(hWinVideo, MSG_NextMusic);       



// 自动播放下一首时会进入到这个函数里面,重新发送播放信号量
                                /* 获取歌曲播放时间 */
                                case MusicTaskAudioGetTime_7:
                                {
                                        if(ucFileOpenFlag == 1)
                                        {
                                                AVI_TimeShow(_VideoPlayCtrl._avi_file, &_VideoPlayCtrl);
                                        }
                                        if(_VideoPlayCtrl.PlayNextFlag == 1)   //自动播放完一首视频后,自动切换到下一个视频
                                        {
                                                _VideoPlayCtrl.PlayNextFlag =0;
                                                xEventGroupSetBits(xCreatedEventGroup, MusicTaskAudioStart_8);
                                        }
                                }        break;

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107143
QQ
发表于 2018-8-28 01:18:53 | 显示全部楼层
hpdell 发表于 2018-8-26 20:09
这个问题终于搞定了啊

自动播放完成后搞个标志位职位

想不到这个框架也能搞定。
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2018-8-28 10:52:50 | 显示全部楼层
eric2013 发表于 2018-8-28 01:18
想不到这个框架也能搞定。

我是瞎折腾啊,
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2018-8-28 11:38:24 | 显示全部楼层
eric2013 发表于 2018-8-25 01:09
是指的FreeRTOS的定时器任务,你当前开的7 ,比你的TaskMusic任务优先级一定要高。

最好将FreeRTOS的 ...

你好,我想请教下,

freertos 里面的定时器优先级最高是多少啊 ??

configTIMER_TASK_PRIORITY  就是这个最高可以设置为多少 ??

#define configMAX_PRIORITIES                ( 10 )    //任务优先级最大是数目

我目前已经设置为
#define  configTIMER_TASK_PRIORITY  (configMAX_PRIORITIES + 1)    //这个我这样设置有没有什么问题呀 ???????
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107143
QQ
发表于 2018-8-29 01:01:09 | 显示全部楼层
hpdell 发表于 2018-8-28 11:38
你好,我想请教下,

freertos 里面的定时器优先级最高是多少啊 ??

比如你这里configMAX_PRIORITIES定的是10,那么用户可以使用的优先级号就是0,1,2,3,4,5,6,7,8,9 。特别注意不包含10,也就是用户可以设置的最高优先级任务就是9

你的定时器任务优先级配置9即可,也就是configMAX_PRIORITIES - 1
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2018-8-29 09:42:18 | 显示全部楼层
eric2013 发表于 2018-8-29 01:01
比如你这里configMAX_PRIORITIES定的是10,那么用户可以使用的优先级号就是0,1,2,3,4,5,6,7,8,9 。特别注 ...

原来如此啊,多谢多谢啊
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-20 10:48 , Processed in 0.244181 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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