现象
在HWI的ProcessAEinfo函数中进行打印,发现AE有延迟
解决思路
- 查看ProcessAEinfo函数的执行位置,发现ProcessAEinfo函数是在状态机中的
QCAMERA_INTERNAL_EVT_AE_UPDATE
状态下1执行的 - 相应的找到了只有
matadata_stream_cb_routine
函数对状态机发送这个状态事件,在执行processEVT的地方进行打印,发现这个AE打印是没有延时的;在对状态机这个状态下加打印,发现这个AE打印是有延时的 - processAEinfo函数里的内容,会发现,状态机状态下的AE打印又没有异常了
- 当时在想,为什么输出和输入对不上呢?先对processAEinfo里的内容进行删减,查看加上那句话会造成AE打印有延时
- 发现加上persist进行赋值的地方,ae就会有延迟,对persist设置的函数前后进行打印,发现这个赋值语句需要10Ms才能执行完成。
- 需要重新设置HAL对ispctrl层传递的方法,不能使用persist的方法了
疑问
callback一直在给statemachine发送事件消息,假设每帧发10个事件,但是statemachine由于什么问题,只处理了9个事件,并不会造成太大的影响,图像还是正常出,就是控制可能慢了0.003s
但是存在一个问题,那个事件被callback创建了,并没有被处理完,释放内存,当过了100帧率,就有10个事件没有进行处理,那这些事件依旧在内存中,没有被释放,长此以往,内存被占满了,程序不就各种崩溃了么。
解决方案:
是否在检查队列的时候对队列的长度进行判断,防止队列太长崩溃。
另外就是我们在调试代码的时候,在端口的输入端加上打印,查看每个模块处理的速度,如果低于正常的帧率,就抛出异常。当然一帧看不出什么问题,100帧检测一次,看时间是否超过了正常的时间。
小结
如果上一个模块的输出和下一个模块的输入对不上,很可能是由于FIFO导致的,如果下一个模块的处理跟不上上一个
函数中尽量不要去设置persist的值,根据打印发现,平均设置需要10ms,大大影响运行性能。