STM32
直播中

杨云

8年用户 894经验值
私信 关注

CyU3PDmaMultiChannelCommitBuffer失败后,如何重置?

我在 CX3 的框架下降方面需要一些帮助。 我有几台 200 万像素(准确地说是 1600x1301)的摄像机,以 20fps 的速度串流,每台摄像机都有一个 cx3 做 MIPI-USB 桥接。 我遇到的问题是,由于缺乏缓冲内存(主机速度不够快,因为它必须同时处理多个 CX3 数据流),CX3 有时会丢弃一些帧。

这是我目前使用的内存映射(我优化了一些数据区域,并使用 2 级引导加载器区域进行缓冲)。
定制
描述符区域 基数:0x40000000 大小:12 KB
代码区基数:0x40003000 大小: 134 KB
数据区基:0x40024800 大小: 32 KB
驱动程序堆基:0x4002C800 大小:32 KB
缓冲区基数:0x40034800 大小:302 KB -> 0x40080000 结束

这是 DMA 相关的定义。 我有 9 个(18 个,因为它们总是双倍的)16000 字节的缓冲区,因此

#define cx3_uvc_data_buf_size_ov(0x3E80)//(0x3E80)
#else
#definecx3_uvc_data_buf_size (0x8000)
#endif

#define cx3_uvc_prod_header(12)/* UVC DMA 缓冲区头大小 */
#define cx3_uvc_prod_footer(4)/* UVC DMA 缓冲区页脚大小 */

/* UVC 缓冲区大小 - 将映射到批量事务大小 */
#define cx3_uvc_stream_buf_size_ov(cx3_uvc_data_buf_size_ov + cx3_uvc_prod_header + cx3_uvc_prod_footer)

/* UVC 缓冲区计数 */
#define cx3_uvc_stream_buf_count_ov(9)




每次 CX3 运行缓冲内存时,当 CyU3PDmaMultiChannelCommitBuffer 失败时,就会发生 CX3_DMA_RESET_EVENT,然后我就会重置数据流:


CyCx3_ImageSensor_Stop_Stream();
如果(glIsApplnActive) {
uvc_app_stop();
}

uvc_app_start();
CyCx3_ImageSensor_Start_Stream();


我需要的是 CX3 更快地重置丢失的图像,或者我需要缓冲区内存。

我的问题是

1) CyU3PDmaMultiChannelCommitBuffer 失败后,如何使重置速度更快?
2) 如何将微控制器其他部分的内存用于帧缓冲?

回帖(1)

duke刘

2024-9-29 16:39:37
在您遇到 CyU3PDmaMultiChannelCommitBuffer 失败的问题时,重置的方法可能会因您的具体硬件和软件配置而有所不同。但是,我可以提供一些一般性的建议和步骤,这些可能会帮助您解决问题。

1. **检查硬件连接**:确保所有硬件连接都是正确的,包括摄像机、CX3桥接器和主机之间的连接。

2. **优化数据流**:如果可能,尝试降低数据流的速率或分辨率,以减少对缓冲内存的需求。

3. **增加缓冲内存**:如果硬件允许,增加缓冲内存的大小可能会帮助解决丢弃帧的问题。

4. **优化软件**:确保您的软件能够有效地管理缓冲内存。这可能包括优化数据传输的代码,确保没有内存泄漏,以及确保及时处理数据。

5. **使用 DMA 传输**:确保您正在使用 DMA(直接内存访问)来传输数据,这可以减少 CPU 的负担并提高数据传输的效率。

6. **检查错误处理**:确保您的代码中有适当的错误处理机制,以便在发生错误时能够正确地重置或恢复。

7. **更新固件/驱动程序**:检查是否有可用的固件或驱动程序更新,这些更新可能包含了修复您遇到的问题的补丁。

8. **重置 DMA 通道**:如果 DMA 通道失败,您可能需要编写代码来重置这些通道。这通常涉及到清除错误状态,释放资源,并重新初始化 DMA 通道。

9. **调试工具**:使用调试工具来监控 DMA 传输的状态,这可以帮助您确定问题发生的具体位置。

10. **查看文档和社区**:查看 CX3 的官方文档,看看是否有关于如何处理 DMA 错误的指导。此外,搜索相关的开发社区,看看是否有其他开发者遇到并解决了类似的问题。

对于您提供的内存映射配置,您可能需要考虑以下几点:

- **定制描述符区域**:确保这个区域的大小足够大,以存储所有必要的描述符。
- **代码区**:确保代码区的大小足够大,以容纳您的程序代码。
- **数据区**:您已经为数据区分配了 32 KB,这可能需要根据实际需要进行调整。
- **驱动程序堆**:同样,确保驱动程序堆的大小足够大,以支持您的应用程序。

最后,如果问题仍然存在,您可能需要考虑与硬件供应商或技术支持团队联系,以获得更专业的帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分