benchmark(p_param); 函数相关问题

在benchmark的switch-case中,PerformSetStartTime和PerformSetEndTime是为了计算花费时间,这个我能理解。

但是这个R_CACHE_L1DataInvalidLine和R_CACHE_L1DataCleanLine两个函数的作用是什么?如果后续我要应用opencv的库函数进行进一步处理(比如再加一个case),那我是不是也需要加R_CACHE_L1DataInvalidLine和R_CACHE_L1DataCleanLine?

 

然后,在调用的这个cv_threshold函数中,发现和opencv库的函数不是完全一样的,入口参数不同,这里不是很理解这个:

cv_threshold(p_param->p_work_bufadr, p_param->p_output_bufadr, R_BCD_CAMERA_WIDTH, R_BCD_CAMERA_HEIGHT / 2, 50, 0);

int cv_threshold(uint8_t *src, uint8_t *dst, uint16_t in_w, uint16_t in_h, uint8_t thres, uint8_t mode)

 

这里p_work_bufadr又是什么作用?为什么既需要src又需要dst

  • 如果所有处理都使用opencv或都使用DRP那么可以不用调用R_CACHE_L1DataInvalidLine和R_CACHE_L1DataCleanLine。
    但是如果存在DRP和openCV混用时,例如DRP写到内存,openCV读出来做后续处理,则需要添加这两个操作。
    主要原因是DRP使用DMA方式读写内存,他是不经过cache的,而openCV是用CPU读写内存,会经过cache。
    例如如下流程:DRP写到内存 -> openCV读出内存并更新此内存 -> DRP再处理这个内存
    那么在openCV读出之前需要调用R_CACHE_L1DataInvalidLine,让cache里面的和这段内存空间相关的值都无效
    在openCV写出内存后需要调用R_CACHE_L1DataCleanLine,把cache里面和这段空间相关的值都写回物理内存。这样DRP再读数据时才能保证是完全正确的。
    如果你不调用这两个函数,有可能有问题,有可能没问题,取决于cache是否有命中这块内存。

    关于参数接口,是否和openCV参数数量或顺序一致完全取决于应用,cv_threshold可以认为是openCV threshold函数的一个wrapper层,不一定参数要完全一致,这部分你们可以灵活设计。

    关于p_work_bufadr,你可以认为它是除了camera buffer,display buffer之外的一个工作区,可以用,也可以不用。你可以存放数据处理过程中的数据到这个buffer,而不是直接写到display buffer

    关于为什么既有src又有dst的问题,对于二值化来讲可以不需要,因为你可以将结果直接保存到输入buffer,但预留这个接口让应用更灵活,你既可以输出到输入buffer,也可以输出到另外一个新的buffer。
    另外某些算法是不支持将结果输出到输入buffer上的。