DAT_copy 产生的问题

#include <csl.h>
#include <csl_cache.h>
#include <csl_dat.h>
#include <stdio.h>

#pragma DATA_SECTION(external, "quickdata")
char external[352*416];                              // 片外

#pragma DATA_SECTION(internal, "quickdata")
char internal[16 * 352];                              // 片内

void main()
{
int i, j, id;
char x = 0;

CSL_init();                                             
CACHE_clean(CACHE_L2ALL, 0, 0);
CACHE_setL2Mode(CACHE_128KCACHE);       
CACHE_enableCaching(CACHE_EMIFA_CE00);
CACHE_enableCaching(CACHE_EMIFA_CE01);

for(i = 0; i < 352 * 416;++i)
{
   external[i] = (i & 0xff);
}

DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
id = DAT_copy2d(DAT_2D1D, &external[0], internal, 352, 16, 416);
DAT_wait(id);

for(i = 0; i < 16; ++i)   // 检查搬移是否正确
{
      if(memcmp(&external[i * 416], &internal[i * 352], 352) != 0)
   {
    fprintf(stderr, "error/n");
   }
}
fprintf(stderr, "end/n");
}

测试运行失败。DMA传输后片内与片外数据不一致。经分析后确认是因为程序开始打开了L2Cache,并且允许对片外存储器进行缓存,因此开始对external的初始化实际上实在L2Cache中做的,并未实时更新到片外external,故DMA不正确,解决办法是在external初始化之后调用下面的语句请求二级缓存立刻刷新数据:

CACHE_wbInvL2(external, 352*416, CACHE_WAIT);

则测试正确,注意这个函数的第二个参数有最大为65536*4的限制,如果要刷新的数据大小超过了这个值,则应该分为几块分别调用该函数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值