硬汉嵌入式论坛

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

[RL-RTX] 请教下大神, 使用 rtx5 v5.9.0 版本, 等待事件标志组的值有时会出现 2个值叠加的情况 ?

[复制链接]

684

主题

3514

回帖

5591

积分

论坛元老

积分
5591
发表于 2024-10-3 14:38:51 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2024-10-3 14:44 编辑



请教下大神, 使用 rtx5  v5.9.0 版本, 等待事件标志组的值有时会出现 2个值叠加的情况 ?

在捣鼓 wav 播放,  双缓冲切换, 刚开始 几s 钟 双缓冲交替切换还是正常, 貌似等播放 xx s 后就卡死好几 秒钟, 再之后就会出现 等待事件标志组的值发生了重叠


#define osRtxKernelId     "RTX V5.9.0"  ///< Kernel identification string

#define MusicTaskAudioFillBuffer1_9        (uint16_t)(0x0200)
#define MusicTaskAudioFillBuffer0_10        (uint16_t)(0x0400)


rtx5 playrt err.png


正常来说出现:

MusicTaskAudioFillBuffer0_10 :0x400
MusicTaskAudioFillBuffer1_9 :0x200

交替出现是正常的, 但是不知道是什么原因 过一会就出现了 WavMusicPlay Error uxBits : 0x600 ??   

以前使用 rtx5  v5.5.3 版本的貌似就没有出现这个问题, 是不是跟 rtx5 的版本有关啦  ?






回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2024-10-3 17:22:26 | 显示全部楼层
有这种情况,这种情况要处理的。
回复

使用道具 举报

684

主题

3514

回帖

5591

积分

论坛元老

积分
5591
 楼主| 发表于 2024-10-3 17:36:52 | 显示全部楼层
eric2013 发表于 2024-10-3 17:22
有这种情况,这种情况要处理的。

这种情况要怎么处理呀 ?

貌似 出现叠加后, 大概过 3-5s 又会自动回复正常的 交替 发送 标志位, 但此时播放的声音已经中断了, 即使 现在交替发送双缓冲的 标志位是正确的, 播放也没有声音出来, 过一会后就会出现硬件中断错误了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2024-10-4 10:19:42 | 显示全部楼层
hpdell 发表于 2024-10-3 17:36
这种情况要怎么处理呀 ?

貌似 出现叠加后, 大概过 3-5s 又会自动回复正常的 交替 发送 标志位, 但此时 ...

这个是我早期的处理MusicTaskWaitBuffer  。

#define MusicTaskWaitBuffer                      (MusicTaskAudioFillBuffer0_10 | MusicTaskAudioFillBuffer1_9)

[C] 纯文本查看 复制代码
        /* 当前使用的是缓冲0,填充缓冲1,并通过64点FFT实行频谱显示 */
                                case MusicTaskAudioFillBuffer1_9:
                                        VedioSynCount--;
                                        if(hWinMusic != WM_HWIN_NULL)
                                        {
                                                DSP_FFT64(ptMP3->pI2SBuffer0);        
                                        }
                                        MP3_FillAudio((uint16_t *)ptMP3->pI2SBuffer1,
                                                                  (uint16_t *)ptMP3->pI2STempBuff,
                                                                  mp3FrameInfo.outputSamps);
                                        GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
                                        break;

                                /* 当前使用的是缓冲1,填充缓冲0,并通过64点FFT实行频谱显示 */
                                case MusicTaskAudioFillBuffer0_10:
                                        VedioSynCount--;
                                        if(hWinMusic != WM_HWIN_NULL)
                                        {
                                                DSP_FFT64(ptMP3->pI2SBuffer1);
                                        }
                                        MP3_FillAudio((uint16_t *)ptMP3->pI2SBuffer0,
                                                                  (uint16_t *)ptMP3->pI2STempBuff,
                                                                  mp3FrameInfo.outputSamps);
                                        GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
                                        break;

                                /* 
                                   早期设计的时候,为了防止视频播放任务一直占用文件系统,导致音频的DMA的
                                   双缓冲都发消息过来,现在的版本进入这个消息的概率极小了。
                                */
                                case MusicTaskWaitBuffer:
                                        #if 0 /* 这种方式有时候会多计算一次 */
                                                printf_MP3dbg("count = %d, ddd = %x\r\n", count, xResult);
                                                xResult = 0;
                                                while(os_sem_wait (&SemaphoreVedio, 0) == OS_R_OK)
                                                {
                                                        xResult++;
                                                        GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
                                                }
                                                printf_MP3dbg("count = %d, ddd = %x\r\n", count, xResult);
                                                count = 0;
                                        #else
                                                printf_MP3dbg("count = %d, ddd = %x\r\n", VedioSynCount, xResult);
                                                uiTempCount = VedioSynCount;
                                                VedioSynCount = 0;
                                                
                                                for(i = 0; i < uiTempCount; i++)
                                                {
                                                        GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
                                                }
                                                
                                                /* 防止同步的过程中,count被改变,再进行一次 */
                                                for(i = 0; i < VedioSynCount; i++)
                                                {
                                                        GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
                                                }
                                                printf_MP3dbg("count = %d, ddd = %x\r\n", VedioSynCount, xResult);
                                                VedioSynCount = 0;
                                        #endif
                                        break;

回复

使用道具 举报

684

主题

3514

回帖

5591

积分

论坛元老

积分
5591
 楼主| 发表于 2024-10-4 17:14:46 | 显示全部楼层
eric2013 发表于 2024-10-4 10:19
这个是我早期的处理MusicTaskWaitBuffer  。

#define MusicTaskWaitBuffer                      (MusicTaskAudioFil ...


好的, 感谢感谢啊

VedioSynCount  这个是在 sai tx dma 中断里面  VedioSynCount += 1;  操作吗 ?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2024-10-6 11:11:39 | 显示全部楼层
hpdell 发表于 2024-10-4 17:14
好的, 感谢感谢啊

VedioSynCount  这个是在 sai tx dma 中断里面  VedioSynCount += 1;  操作吗 ?

这个是完整的例子

https://www.armbbs.cn/forum.php? ... &extra=page%3D1
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 20:13 , Processed in 0.320102 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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