博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DAT_copy 产生的问题
阅读量:2178 次
发布时间:2019-05-01

本文共 1804 字,大约阅读时间需要 6 分钟。

//这个转载的东西,经我实验没有发现错误。就当学习了吧。

//我分析应该不会出错,因为编译器有一套维护cache的机制,否则不累死程序员了

 

#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的限制,如果要刷新的数据大小超过了这个值,则应该分为几块分别调用该函数。

 

 

###############################################################################

The DATA_SECTION pragma allocates space for the symbol in a section called section name.

The syntax for the pragma in C is:

#pragma DATA_SECTION (symbol, "section name");

我个人的理解是:

定义一个数据段:

          段名为:    "section name"
          段的内容在: symbol 里
在CCS编程中,如果我们不指定变量的存放位置,编译器会自动的给变量分配一个位置,但是如果有的时候需要把变量放在一个特定的空间内,我们应该如何操作呢,CCS提供了如下的两个指令
#pragma CODE_SECTION
#pragma DATA_SECTION
其中data_section是针对数据空间的,code_section是针对程序空间的,具体的使用办法是
#pragma DATA_SECTION(bufferB, ”my_sect”)
char bufferB[512];
在.cmd文件中建立对应的section就可以使用了。

注意:在使用#pragma DATA_SECTION时,应该先开辟一个空间,即:#pragma DATA_SECTION(bufferB, ”my_sect”),然后再定义该空间的大小:char bufferB[512];

你可能感兴趣的文章
orcal 循环执行sql
查看>>
web.xml配置监听器,加载数据库信息配置文件ServletContextListener
查看>>
结构型模式之桥接模式(Bridge)
查看>>
行为型模式之状态模式(State)
查看>>
行为型模式之策略模式(Strategy)
查看>>
行为型模式之模板方法模式(TemplateMethod)
查看>>
行为型模式之访问者模式(Visitor)
查看>>
大小端详解
查看>>
source insight使用方法简介
查看>>
<stdarg.h>头文件的使用
查看>>
C++/C 宏定义(define)中# ## 的含义 宏拼接
查看>>
Git安装配置
查看>>
linux中fork()函数详解
查看>>
C语言字符、字符串操作偏僻函数总结
查看>>
Git的Patch功能
查看>>
分析C语言的声明
查看>>
TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>