现象

在HWI的ProcessAEinfo函数中进行打印,发现AE有延迟

解决思路

  1. 查看ProcessAEinfo函数的执行位置,发现ProcessAEinfo函数是在状态机中的QCAMERA_INTERNAL_EVT_AE_UPDATE状态下1执行的
  2. 相应的找到了只有matadata_stream_cb_routine函数对状态机发送这个状态事件,在执行processEVT的地方进行打印,发现这个AE打印是没有延时的;在对状态机这个状态下加打印,发现这个AE打印是有延时的
  3. processAEinfo函数里的内容,会发现,状态机状态下的AE打印又没有异常了
  4. 当时在想,为什么输出和输入对不上呢?先对processAEinfo里的内容进行删减,查看加上那句话会造成AE打印有延时
  5. 发现加上persist进行赋值的地方,ae就会有延迟,对persist设置的函数前后进行打印,发现这个赋值语句需要10Ms才能执行完成。
  6. 需要重新设置HAL对ispctrl层传递的方法,不能使用persist的方法了

疑问

callback一直在给statemachine发送事件消息,假设每帧发10个事件,但是statemachine由于什么问题,只处理了9个事件,并不会造成太大的影响,图像还是正常出,就是控制可能慢了0.003s

但是存在一个问题,那个事件被callback创建了,并没有被处理完,释放内存,当过了100帧率,就有10个事件没有进行处理,那这些事件依旧在内存中,没有被释放,长此以往,内存被占满了,程序不就各种崩溃了么。

解决方案

是否在检查队列的时候对队列的长度进行判断,防止队列太长崩溃。

另外就是我们在调试代码的时候,在端口的输入端加上打印,查看每个模块处理的速度,如果低于正常的帧率,就抛出异常。当然一帧看不出什么问题,100帧检测一次,看时间是否超过了正常的时间。

小结

  1. 如果上一个模块的输出和下一个模块的输入对不上,很可能是由于FIFO导致的,如果下一个模块的处理跟不上上一个

  2. 函数中尽量不要去设置persist的值,根据打印发现,平均设置需要10ms,大大影响运行性能。