想咨询一下关于DSP(dm642)方面的问题,
在打开cache情况下,想使用DAT_copy实现ping-pang buffer来进行图像处理,
Cache打开程序:
CACHE_clean(CACHE_L2ALL,0,0);
CACHE_setL2Mode(CACHE_128KCACHE);
CACHE_enableCaching(CACHE_EMIFA_CE00);
CACHE_enableCaching(CACHE_EMIFA_CE01);
ping-pang buffer实现过程:
Uint32 ulTmp1;
Uint16 i;
Uint16 m,n;
Uint16 usDataLen;
Uint16 usNum;
//Uint16 usId;
usDataLen = 11520;
usNum = 36;
/*传送临时缓冲区*/
DAT_copy((void *)(pucInputData), (void *)(guacL2DataBufPing),
usDataLen);
for(i = 0; i < usNum; i++)
{
ulTmp1 = (Uint32)usDataLen * i;
if (0 == (i & 0x01))
{
//DAT_wait(DAT_XFRID_WAITALL);
/*传送临时缓冲区*/
DAT_copy((void *)(pucInputData + ((i + 1) * usDataLen)), (void *)(guacL2DataBufPang),
usDataLen);
for(m = 0; m < 16; m++)//行数
{
#pragma MUST_ITERATE(90, 90, 8);
for(n = 0; n < PIXELS_NUM; n++) //像素数/每行
{
guacL2DataBufPing[m * PIXELS_NUM + n] = guacL2DataBufPing[m * PIXELS_NUM + n] < gucTwoValuThrld ? 0x00:0xFF;
} }
//memcpy((void*)(pucInputData + ulTmp1),(void*)guacL2DataBufPing,usDataLen);
CACHE_wbInvL2((void*)guacL2DataBufPing, usDataLen, CACHE_WAIT);
DAT_copy((void *)(guacL2DataBufPing),
(void *)(pucInputData + ulTmp1), usDataLen);
}
else
{
//DAT_wait(DAT_XFRID_WAITALL);
/*传送临时缓冲区*/
DAT_copy((void *)(pucInputData + ((i + 1) * usDataLen)), (void *)(guacL2DataBufPing),
usDataLen);
for(m = 0; m < 16; m++)//行数
{
#pragma MUST_ITERATE(90, 90, 8);
for(n = 0; n < PIXELS_NUM; n++) //像素数/每行
{
guacL2DataBufPang[m * PIXELS_NUM + n] = guacL2DataBufPang[m * PIXELS_NUM + n] < gucTwoValuThrld ? 0x00:0xFF;
} }
//memcpy((void*)(pucInputData + ulTmp1),(void*)guacL2DataBufPang,usDataLen);
CACHE_wbInvL2((void*)guacL2DataBufPang, usDataLen, CACHE_WAIT);
DAT_copy((void *)(guacL2DataBufPang),
(void *)(pucInputData + ulTmp1), usDataLen);
}
}
出现的问题是,末尾出现一段数据从L2->SDRAM过程,数据不正确,L2数据是正确的,DAT_copy后,SDRAM的数据不对,
请问是什么原因,得怎么修改程序,保证数据正确;
Chris Meng:
你好,
你的那个buffer在l2,那个在DDR? DDR上的buffer的cache需要一致性维护么?
建议你网上搜索一下《TI C64x+ DSP CACHE 一致性分析与维护》文档,对cache的一致性维护有进一步了解。
yang meng:
回复 Chris Meng:
这位TI员工,你好像没看懂问题;
我的问题是:
数据从SDRAM->L2,在L2进行处理,处理完后,从L2->SDRAM;
在关闭cache情况下,处理完后,数据从L2->SDRAM过程都是正确的;
在打开cache情况下,处理完后,数据从L2->SDRAM过程不全是正确的,末尾有一段数据不正确,是没有从L2 copy到SDRAM中;
是什么原因产生的?怎么解决?