尊敬的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下看的),这是怎么回事?我是用定时器计算程序实际运行时间的。
非常希望能得到你的帮助,谢谢!
Chris Meng:
1. 我的理解是:VPFE (CCDC)的输出地址指向的就是VPBE的OSD的输入地址。你可以修改CCDC的输出地址到其他地址,然后对其做相应的处理。再把处理完的数据配置的OSD的地址寄存器里,用于显示。
2. 如果你需要对采集的数据进行处理,那采集和输出就会有延时,不知道你提到的同步是什么概念。
3. 建议使用timer来看运行时间,是比较准确的
Shiwei Li:
回复 Chris Meng:
非常感谢你的回复,我说的同步是帧同步的意思,就是说我怎么才能知道CCDC已经采集好一帧数据并保存到DDR2了?这样我就可以在存完一帧数据后进行我的算法处理(算法是以帧为单位对图像进行处理的),处理完成后,后又怎样去控制显示器去显示这处理完的一帧数据?难道大家在做图像处理的时候不是严格以帧为单位进行的,而是随时取出采集缓存区的数据(不管这个时候缓冲区存的是完整的一帧数据还是上一帧和当前帧的混合数据)?
Shiwei Li:
回复 Chris Meng:
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大概要消耗多少硬件资源,是不是会占用掉算法处理的时间?
问题有点多,麻烦你了,非常感谢!
Chris Meng:
回复 Shiwei Li:
你好!
DSP优化请了解一下processors.wiki.ti.com/…/TMS320C6000_DSP_Optimization_Workshop。你的编译选项,以及对循环的处理都对运行的时间有影响。
我对DM6437的软件不是很熟悉,但如果是软件包提供的各个软件模块,一定是可以配套运行正常的,请放心使用。
Shiwei Li:
回复 Chris Meng:
Chris,
谢谢的你的帮助,我自己再摸索摸索,非常感谢!
fan xiao:
你好!我也是刚入入门达芬奇平台,选的是DM6446;也在做图像处理,遇到类似的问题,请问楼主你是在VPFE和VPBE之间添加处理代码的吗?楼主方便加一下QQ吗?Q:415926459.谢谢楼主!
mingxing pan:
回复 Shiwei Li:
你好。我现在写代码是也遇到了相同的问题。由于我以前是写软件的,对硬件不太熟悉。所以对怎么在VPFE和VPBE之间加入自己的处理算法不太熟悉,你方便说下你的方法么??谢谢了。
Chris Meng:
回复 mingxing pan:
你好,
建议你看一下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
mingxing pan:
回复 Chris Meng:
你好!谢谢你的回复,根据你说的我将ddr1和ddr2的地址设置成不同的可以加入我的函数了。
但是这样做的话显示器上的图片会一帧一帧的出现(我直接将地址里的数据搬运过去),也就是说这样太费时间了。你是怎么改进的??(如果方便的话加我QQ:805043368)
谢谢!!