工具/软件:TI-RTOS
你好。
对于 ToF 项目,我需要使用在 TI-RTOS 下运行的 Cortex M4来控制摄像机,以馈送包含4帧序列(对应于不同阶段)的环形缓冲器: 4帧是在 TI-RTOS 下的 DSP 上运行的算法的输入、而 M4正在控制摄像头并启动下一次采集。 我想在 M4和 DSP 之间实现生产者-使用者机制、其中 M4在共享存储器中馈送环形缓冲器、而 DSP 消耗 由 M4的邮箱触发的输入。 问题是如何在 VPS 驱动程序库中实现此理念:
1) 1)分析 TI 的示例、似乎排队帧列表的机制作用于同一组地址: 似乎提供给驱动程序的帧缓冲区是通过对 FVID2_DEQue 的调用临时释放的、并且在通过 FVID2_queue 再次将内容副本提供给驱动程序后没有任何更改。 这是唯一可用的机制吗?
2) 2)我分配了一个帧的静态环缓冲区、在 FVID2_DEQUE 和 FVID2_queue 之间、我尝试在捕获回调触发的 swi 的上下文中更改提供给 FVID2_queue 的帧列表中的地址: 即使 TI 的文档和示例在捕获回调中直接调用 FVID2_DEQue、结果也是"不良上下文异常"。 我想问题是由于地址更改涉及 VPDMA 重新配置、而这种情况在 ISR/Swi 上下文中无法发生:它是否正确? 在 ISR/Swi 上下文中是否有其他访问 VPDMA 寄存器的方法?
3) 3)我移动了一个由捕获回调生成的事件触发的高优先级任务中的环缓冲区管理、它正在工作-这次没有坏的上下文异常-但我最初发现了一个非常奇怪的问题: 我配置了 VIP 禁用回调 周期性调用(periodicCbEnable = false 在 VPS_CaptCreateParams 结构中),并将缓冲区捕获模式设置为 VPS_CAPT_BCM_FRM_DROP (bufCaptMode = VPS_CAPT_BCM_FRM_DROP 在同一结构中);读取文档即意味着: "在此模式下、当输入队列中没有更多缓冲区时、驱动程序将停止捕获数据。 驱动程序不会保留任何缓冲区、最后一个缓冲区将通过去队列调用返回到应用程序。 对于此模式、驱动程序使用 VPDMA 丢弃数据功能。"
如果我要排队4帧,这句话是否意味着在4帧采集结束时仅触发一次回调? 回调触发机制如何? 根据我使用计数器进行的分析,回调在每一帧触发,并在最后一帧停止:这是真的吗?