C++ RPi2、OpenMAX、死锁 环境 树莓皮2 B+ DebianLinux OpenMAX IL 用例 OpenMAX摄像头视频捕获 相机端口已禁用 已设置渲染器/摄影机通道 所有组件状态都设置为空闲 端口已启用 问题描述
启用摄像头输入端口的第一个端口(端口#73),使用“OMX_CommandPortEnable”命令启用该端口,与使用“OMX_CommandPortDisable”命令一样,预计摄像头组件将触发“OMX_CALLBACKTYPE::EventHandler”事件处理程序,该事件处理程序具有“eEvent==OMX_EventCmdComplete”和“nda1==OMX_CommandPortEnable”,但是,这永远不会发生,应用程序会无限期地等待端口启用 问题分析 我将std::condition_变量与std::mutex结合使用,以等待状态更改完成,因此,OMX_CALLBACKTYPE::EventHandler使用这种方法更新条件变量并调用“notify_one()”,同时调用方线程锁定std::mutex并等待设置条件变量“OMX_CALLBACKTYPE::EventHandler”永远不会被调用(带有任何参数),并且程序将永远锁定。C++ RPi2、OpenMAX、死锁 环境 树莓皮2 B+ DebianLinux OpenMAX IL 用例 OpenMAX摄像头视频捕获 相机端口已禁用 已设置渲染器/摄影机通道 所有组件状态都设置为空闲 端口已启用 问题描述,c++,linux,multithreading,raspberry-pi,openmax,C++,Linux,Multithreading,Raspberry Pi,Openmax,启用摄像头输入端口的第一个端口(端口#73),使用“OMX_CommandPortEnable”命令启用该端口,与使用“OMX_CommandPortDisable”命令一样,预计摄像头组件将触发“OMX_CALLBACKTYPE::EventHandler”事件处理程序,该事件处理程序具有“eEvent==OMX_EventCmdComplete”和“nda1==OMX_CommandPortEnable”,但是,这永远不会发生,应用程序会无限期地等待端口启用 问题分析 我将std::cond
注意:当等待条件变量验证互斥体不为所有时,可通过验证(0==std::mutex::_owner)完成此操作。
但是当通过反复调用usleep和OMX_GetParameter(OMX_IndexParamPortDefinition)轮询端口状态时,所有这些都可以正常工作 手头的问题
为什么“OMX_CALLBACKTYPE::EventHandler”在轮询其值时触发,而在使用条件_变量时不触发?在windows中有APC和可警报线程的概念,linux中是否有任何等效的概念?可以解释上述情况的一个概念?我的经验是,在端口填充缓冲区之前,启用端口不会发出事件回调。Th在is,顺序是:
- 将端口设置为已启用(
withOMX\u SendCommand()
)OMX\u CommandPortEnable
- 填充端口缓冲区(
或OMX\u AllocateBuffer()
)OMX\u UseBuffer()
- 接收
事件回调OMX\u CommandPortEnable
OMX\u参数\u PORTDEFINITIONTYPE.bEnabled
进行轮询时,将立即返回OMX\u TRUE
,因为该成员是同步设置的:
端口应立即在其端口定义中设置为启用
当端口接收到OMX\u CommandPortEnable时的结构
以下是我认为当事情“起作用”时发生的事情:
- 将端口设置为已启用
- 轮询直到
为bEnabled
(立即发生)OMX\u TRUE
- 填充端口缓冲区
- 接收
事件回调OMX\u CommandPortEnable
- 将端口设置为已启用
- 轮询直到
为bEnabled
(立即发生)OMX\u TRUE
- 接收
事件回调OMX\u CommandPortEnable
- 填充端口缓冲区
bEnabled
和OMX\u CommandPortEnable
回调并没有真正报告相同的情况。我不认为在启用端口和分配其缓冲区之间有必要(或需要)任何同步