This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

如何在VPFE和VPBE之间加入自己的处理算法

尊敬的TI专家:

你好!我现在用DM6437开发板开发图像处理的项目,想在TI提供的video_loopback例程上进行开发,但是现在遇到了如下问题:

1.例程中只对VPFE和VPBE进行了初始化,而后就可以进行连续的图像采集和显示,我想知道采集和显示是怎么进行帧同步的,即显示端怎么知道采集端采完并在DDR2中保存了完整的一帧后才去显示的?我看了VPFE和VPBE的文档,没有找到两个模块之间是怎么进行帧同步的。

2.如果我想对采集的数据进行处理后再去显示的话,该怎么进行采集和显示的帧同步?我想,采集端可以使用VDINT0/VDINT1中断指示一帧采集的完成,但是这个中断指示的好像是CCDC采集完成而不是DDR2的存储完成,所以估计这个想法不行。所以我就想例程中VPFE和VPBE对DDR2的数据存取是不是都是用EDMA完成的,那么我就该使用EDMA的中断来通知VPBE采集的一帧数据已经存储完成,但是VPBE怎样得到这个通知?又怎样去显示新的一帧呢?

3.还有一个问题就是我在CCS中用profile clk得到的算法的运行的周期数计算得到的时间是程序实际运行时间的一半(都是在Emulator下看的),这是怎么回事?我是用定时器计算程序实际运行时间的。

非常希望能得到你的帮助,谢谢!

  • 1. 我的理解是:VPFE (CCDC)的输出地址指向的就是VPBE的OSD的输入地址。你可以修改CCDC的输出地址到其他地址,然后对其做相应的处理。再把处理完的数据配置的OSD的地址寄存器里,用于显示。

    2. 如果你需要对采集的数据进行处理,那采集和输出就会有延时,不知道你提到的同步是什么概念。

    3. 建议使用timer来看运行时间,是比较准确的

  • 非常感谢你的回复,我说的同步是帧同步的意思,就是说我怎么才能知道CCDC已经采集好一帧数据并保存到DDR2了?这样我就可以在存完一帧数据后进行我的算法处理(算法是以帧为单位对图像进行处理的),处理完成后,后又怎样去控制显示器去显示这处理完的一帧数据?难道大家在做图像处理的时候不是严格以帧为单位进行的,而是随时取出采集缓存区的数据(不管这个时候缓冲区存的是完整的一帧数据还是上一帧和当前帧的混合数据)?

  • 一般我们认为下一帧数据的VD来到的时候,上一帧的数据就写到DDR完毕,当然你可以调整芯片内部VD产生的延时以确保。在VD里面我们是需要切换CCDC写DDR的输出地址的(ping-pong buffer)。这个寄存器是shadow寄存器,会在下一个VD到来的时候更新。

    如果输入和输出显示的频率相同,一般可以不控制。因为如果你可以做到实时处理输入的数据,就可以可以把相应帧率的数据输出。当然你也可以做控制,利用采集的VD,或者timer。

  • Chris,

    非常感谢你的建议,让我知道了我对VPFE还是有很多理解不够透彻的地方,我基本明白了,回头我再仔细看一下VPFE的手册。现在还有几个新的问题请教:

    1、我在采集和显示720*480的图像的时候,中间只做了一个简单的灰度化处理,由于程序的各个段都配置到了DDR2中,所以没有达到实时处理的效果,显示的运动场景的画面非常不连续,而我把各个段都配置到内部L2RAM后画面基本就连续了,我用profile clk看了一下,灰度化的过程分别消耗大约100ms和11ms,由于灰度化的代码非常简单,所以我猜测大部分时间都消耗在读写DDR2内存上了,如果读写内存这么消耗时间,那我的算法很可能不能达到时间要求,我想问一下怎样估算读写DDR2需要的时间?比如读一帧720*480的数据,DDR2时钟是162MHz。而且如果我程序在L2RAM中存储不下,要怎样分配段到外部DDR2才能达到最快处理速度?

    灰度化代码:

    for(i=0;i<pixel_cnt/2;i++)

    *(disPack_32addr+i)=(*(capPack_32addr+i)&0xFF00FF00)|0x00800080;

    2、我在程序中使能cache和不使能cache,程序运行时间没有什么差别,我在想是不是CCS的GEL中自动使能了cache,但是我在CCS SETUP里面没有设置GEL文件,所以很困惑。要怎样查看我的cache是否起作用了呢?我是这样使能cache的:

    void config_cache(void)

    {

     CSL_CacheRegsOvly cacheRegs = (CSL_CacheRegsOvly)CSL_CACHE_0_REGS;

     volatile unsigned int stall;

     // The below writes to the CFG registers are followed by a dummy read.  Mode

     // switches require that a read is performed immediately after the write.  The

     // read stalls the cpu to ensure the mode change completes.

     // Set L1P size to 32K

     CSL_FINST(cacheRegs->L1PCFG,CACHE_L1PCFG_MODE,32K);

     stall = cacheRegs->L1PCFG;

     // Set L1D size to 32K

     CSL_FINST(cacheRegs->L1DCFG,CACHE_L1DCFG_MODE,32K);

     stall = cacheRegs->L1DCFG;

     // Set L2 size to 64k and normal opperation

     cacheRegs->L2CFG = CSL_FMKT(CACHE_L2CFG_MODE,64K)

                      | CSL_FMKT(CACHE_L2CFG_L2CC,NORMAL);

     stall = cacheRegs->L2CFG;

     // The MAR registers set the cachability of memory spaces external to the

     // megamodule.  Below is an example of turning on cachability for two ranges.

     // Reference spru187 for a complete list the MAR ranges.

     // Set MAR[17] range 0x83000000-0x83FFFFFF as cacheable

     CSL_FINST(cacheRegs->MAR[131],CACHE_MAR_PC,CACHEABLE);

     CSL_FINST(cacheRegs->MAR[129],CACHE_MAR_PC,CACHEABLE);

     CSL_FINST(cacheRegs->MAR[130],CACHE_MAR_PC,CACHEABLE);

     CSL_FINST(cacheRegs->MAR[132],CACHE_MAR_PC,CACHEABLE);

     CSL_FINST(cacheRegs->MAR[133],CACHE_MAR_PC,CACHEABLE);

     CSL_FINST(cacheRegs->MAR[134],CACHE_MAR_PC,CACHEABLE);

    }

    3、我现在想用BIOS来处理底层硬件的配置,但是我在TI网站上下的dvsdk_1_11_00_00里包含的PSP的user guide中对应用PSP的系统要求XDC tools 3.00.01 or higher,但是DVSDK中自带的XDC的版本是2.95.02,我不知道这是不是自相矛盾了,我能不能在2.95.02的版本的基础上使用这个版本的PSP?如果不能我怎样单独安装其他版本的XDC,或者我能不能在CCS3.3中使用CCS4中的XDC?还有使用BIOS大概要消耗多少硬件资源,是不是会占用掉算法处理的时间?

    问题有点多,麻烦你了,非常感谢!

  • 你好!

    DSP优化请了解一下processors.wiki.ti.com/.../TMS320C6000_DSP_Optimization_Workshop。你的编译选项,以及对循环的处理都对运行的时间有影响。

    我对DM6437的软件不是很熟悉,但如果是软件包提供的各个软件模块,一定是可以配套运行正常的,请放心使用。

  • Chris,

    谢谢的你的帮助,我自己再摸索摸索,非常感谢!

  • 你好!我也是刚入入门达芬奇平台,选的是DM6446;也在做图像处理,遇到类似的问题,请问楼主你是在VPFE和VPBE之间添加处理代码的吗?楼主方便加一下QQ吗?Q:415926459.谢谢楼主!

  • 你好。我现在写代码是也遇到了相同的问题。由于我以前是写软件的,对硬件不太熟悉。所以对怎么在VPFE和VPBE之间加入自己的处理算法不太熟悉,你方便说下你的方法么??谢谢了。

  • 你好,

    建议你看一下VPFE/VPBE的user guide,了解一下数据流。下面是一个例子,前端采集可能不会有不同的数据流。

    CCDC->previewer>-resizer->DDR1, DDR2-》OSD->VENC->LCD/CVBS

    一般来说loopback demo通常会把DDR1地址和DDR2地址设置为同一个。如果你需要在采集和显示中间加上处理,请将DDR1的地址和DDR2的地址设置为不同。下面是一个数据流的例子。一般DDR1和DDR2都要有ping -pong buffer,或者更多的buffer循环使用。

    CCDC->previewer>-resizer->DDR1-》Data process-》DDR2-》OSD->VENC->LCD/CVBS

  • 你好!谢谢你的回复,根据你说的我将ddr1和ddr2的地址设置成不同的可以加入我的函数了。

    但是这样做的话显示器上的图片会一帧一帧的出现(我直接将地址里的数据搬运过去),也就是说这样太费时间了。你是怎么改进的??(如果方便的话加我QQ:805043368)

    谢谢!!

  • 您好 我想问一下 能简单说以下 如何将 DDR1地址和DDR2地址设置为不同吗 谢谢

  • 您好 楼主,我现在也在学习DM6437。我也需要在前端和后端加入我自己的算法,我的程序在L2内存上放不下,所以视频的数据和程序全部存在DDR2中。显示很不流畅,问问楼主怎么解决的。

  • 这个VD信号怎么得到,在我的板子上它连在了GP[53],我直接判断改IO口的高低电平,可是却没有变换是咋回事,忘大牛指教。test = EVMDM6437_GPIO_getInput(53);

  • Zeng Junxian,

    我前面回复提到的VD是芯片内部的VD中断,是根据外部VD信号内部产生的信号。

  • 就是说,芯片内部自己产生了一个满足视频解码器的VD时序信号吗?但是我看在示例程序中它只对VPFE进行了初始化操作,是不是该时序的产生,已经在初始化时候完成了吗??那我如何在程序上判断一帧图像存储完成?

  • Zeng Junxian,

    需要外部有VD信号输入才可以才能使内部的VD。用户需要配置的是VDINT寄存器。具体的请参考DM6437的Video Processing Front End (VPFE) User's Guide。