打印
[通用 MCU]

CyU3PDmaMultiChannelCommitBuffer失败后,如何使重置速度更快?

[复制链接]
198|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
onlycook|  楼主 | 2024-8-18 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在 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) 如何将微控制器其他部分的内存用于帧缓冲?

使用特权

评论回复
沙发
laocuo1142| | 2024-8-19 12:54 | 只看该作者
在CyU3PDmaMultiChannelCommitBuffer失败后,为了更快地重置系统,可以采取以下几个步骤来优化和加速恢复过程:

立即停止数据流:
当检测到CyU3PDmaMultiChannelCommitBuffer失败时,首先应立即停止当前的数据流。这可以通过调用相应的停止函数实现,如CyCx3_ImageSensor_Stop_Stream()(以Cypress CX3为例)。
重置相关组件:
根据具体的硬件和架构,可能需要重置与DMA操作相关的组件,如GPIF(通用可编程接口)状态机。这可以通过调用如CyU3PGpifSMSwitch()的函数来实现,该函数可以重置GPIF状态机并切换到新的状态。
优化内存管理:
确保内存分配和释放操作高效进行。如果可能,预先分配足够的缓冲区以避免在运行时因内存不足而导致的失败。
检查并优化DMA缓冲区的配置,包括其大小和数量,以确保它们能够高效处理数据流。
减少重置时间:
优化重置逻辑,确保在重置过程中只重置必要的组件,避免不必要的操作。
使用更快的重置机制,如硬件重置信号,而不是软件重置,这通常能更快地恢复系统状态。
错误处理和重试机制:
实现错误处理和重试机制,以便在CyU3PDmaMultiChannelCommitBuffer失败后自动重试操作。这可以通过设置重试次数和重试间隔来实现。
监控和日志记录:
增加监控和日志记录功能,以便在CyU3PDmaMultiChannelCommitBuffer失败时能够获取更多关于失败原因的信息。这有助于快速定位问题并进行修复。

使用特权

评论回复
板凳
laocuo1142| | 2024-8-19 12:54 | 只看该作者
将微控制器其他部分的内存用于帧缓冲通常涉及以下几个步骤:

内存映射:
首先,需要了解微控制器的内存映射情况,包括哪些内存区域是可用的以及它们的访问权限(如可读、可写或可执行)。
根据需要,将一部分内存映射为帧缓冲区域。这通常需要在微控制器的配置寄存器中设置相应的内存映射地址和大小。
缓冲区分配:
在帧缓冲区域中分配足够的缓冲区来存储图像帧。缓冲区的数量和大小应根据图像的分辨率和帧率来确定。
确保缓冲区的大小是适当的,以便能够完整地存储一帧图像数据,并且不会浪费过多的内存资源。
内存访问控制:
配置微控制器的内存访问控制机制,以确保帧缓冲区域的数据访问是安全的。这可能包括设置内存保护单元(MPU)或类似的机制来防止非授权的内存访问。
数据写入和读取:
在图像采集或渲染过程中,将图像数据写入帧缓冲区域。这通常涉及将图像数据从图像传感器或其他数据源传输到帧缓冲区域。
当需要显示或处理图像时,从帧缓冲区域读取图像数据。这可以通过DMA(直接内存访问)或其他高效的内存传输机制来实现。
优化和性能考虑:
考虑到帧缓冲区域可能与其他内存区域共享相同的物理内存或内存总线,因此需要优化内存访问模式以避免冲突和瓶颈。
如果可能的话,使用缓存或其他缓存一致性机制来提高内存访问性能。
错误处理和恢复:
在使用帧缓冲区域时,应实现错误处理和恢复机制以应对内存损坏、溢出等异常情况。
这可能包括定期检查帧缓冲区域的状态、实现错误检测和纠正算法以及制定恢复策略等。

使用特权

评论回复
地板
Allison8859| | 2024-8-23 11:52 | 只看该作者
CyU3PDmaMultiChannelCommitBuffer 是 Cypress (现在的 Infineon) FX3 SDK 中的一个函数,用于提交 DMA 缓冲区。如果在使用这个函数时遇到失败,可能需要采取一些措施来加快重置速度,以便系统能够快速恢复正常运行

使用特权

评论回复
5
Belle1257| | 2024-8-23 13:00 | 只看该作者
建议检查 CyU3PDmaMultiChannelCommitBuffer 返回的错误代码,了解失败的具体原因。这可以帮助你确定问题的根源

使用特权

评论回复
6
Carina卡| | 2024-8-23 14:04 | 只看该作者
在错误处理逻辑中,确保快速释放资源并重置相关状态。避免在错误处理过程中进行不必要的延迟操作

使用特权

评论回复
7
B1lanche| | 2024-8-23 15:10 | 只看该作者
如果重置过程中有依赖项,尽量减少这些依赖项的数量和复杂性。例如,如果重置过程中需要等待某些事件或信号,尽量简化这些事件的处理逻辑

使用特权

评论回复
8
Annie556| | 2024-8-23 16:15 | 只看该作者
如果软件重置不够快,可以考虑使用硬件复位。硬件复位通常比软件复位更快,因为它直接操作硬件寄存器

使用特权

评论回复
9
Charlene沙| | 2024-8-23 18:03 | 只看该作者
审查和优化重置流程,确保在重置过程中只执行必要的操作。避免在重置过程中进行不必要的初始化和配置

使用特权

评论回复
10
Candic12e| | 2024-8-23 19:16 | 只看该作者
如果 SDK 提供了快速重置机制或 API,优先使用这些机制。这些机制通常经过优化,可以更快地完成重置操作

使用特权

评论回复
11
alxd| | 2024-8-24 09:20 | 只看该作者
在实际硬件上进行调试和测试,确保重置流程在实际环境中能够快速执行。有时候,模拟环境或开发板上的表现可能与实际硬件有所不同

使用特权

评论回复
12
Emily999| | 2024-8-24 10:24 | 只看该作者
确保你使用的是最新版本的 SDK 和固件。新版本可能包含性能改进和错误修复,有助于提高重置速度

使用特权

评论回复
13
Alina艾| | 2024-8-24 12:30 | 只看该作者
在重置过程中,监控系统状态,确保重置操作不会引入新的问题。使用调试工具和日志记录来帮助监控和分析系统状态

使用特权

评论回复
14
呐咯密密| | 2024-8-27 10:10 | 只看该作者
在使用帧缓冲区域时,应实现错误处理和恢复机制以应对内存损坏、溢出等异常情况。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

409

主题

1539

帖子

3

粉丝