C66系列DSP程序优化说明

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

66AK DSP程序优化说明

此文档不介绍具体技术细节,相关技术细节,还望仔细理解官方文档。如有疑问:请加QQ156898965

平台配置

66ak存储资源结构:

存储资源包括DDRA、DDRB,共享内存MSMC,每个核的局部L2、L1P、L1D。由于整个芯片的地址空间是物理统一编址的。L1,L2运行时钟为主频,常规64系列L2运行时钟为主频一半。MSMSRAM 运行在主频。DSP core直接读取L1,L2,通过MSMC读取SRAM,外部DDRA。

DDRA

DDRB

L1P可配置程序缓存;L1D可配置数据一级缓存,2-WayCache;L2可配置数据二级缓存,4-WayCache。缓存区域从高地址开始分配。如下图:

程序数据存放区域分类

程序存放区域:用于存放所有可以执行的代码和常量,程序运行过程中,不会发生改变;

数据存放区域:用于全局变量和局部变量保留的空间,程序运行过程中会发生改变;

堆栈存放区域:为系统堆栈保留的空间,用于和函数传递变量或为局部变量分配空间。若因意外改变,会导致程序跑飞。

平台配置

通过新建或修改Platform文件来实现存储资源定义,Cache大小分配,及程序数据存放区域指定。以66ak12为例,缓存区域L1P,L1D 全部设置为缓存,L2缓存大小设置为256k。程序存放于DDRB,数据存放于L2,堆栈存放于L2进行。配置过程如下:

Debug模式下,选择tools -> RTSC Tools -> Platform -> New,根据自己的需要选择Platform保存的路径以及对应的芯片,Next,填入所需要的各种空间的大小和起始位置。

芯片选择

时钟定义

Cache配置

数据存放区域指定

平台调用及验证

调用Platform:

在工程查看窗口,相应工程上右键Properties,选择General -> RTSC,找到最后一项,Other Repositories,点击Add,路径选择上一步保存

的路径,需要注意选择XDCtools版本,然后就能找到自己新建的Platform

验证:

查看通过自动生成CMD文件查看,如下图所示,L2SRAM大小为768K。详细程序数据存放位置通过map文件查看。程序调试过程中,通过ROV也能查看堆栈大小。

注意事项

1.多核同时运行时,必须保证数据段,堆栈存放位置不重叠。多

核共享变量除外。

2.多核共用一个程序,程序区域位置可重叠,多核采用不同程序,

程序存放区域也不能重叠。

3.未在平台配置文件中定义的区域,如不定义DDRA空间,也能

通过绝对地址访问。

CACHE使用

66ak DSPcore cache简要描述。

Cache是介于DSPCORE与MCMSRAM和外部DDR间高速缓冲器,解决系统中数据读写速度不匹配及读写方式不一样等问题。

针对读,L1,L2差不多,都是从cache里面找,找不到再去下一级存储区域读入。数据读时,主要作用如下:

减少重复读时间:刚刚使用的数据,很近的将来也可能会被用到。如fir滤波的参数。

减少连续读时间:某地址单元的数据被用到,相邻地址也可能会被用到。如fir滤波的输入数据。

针对写,L1 没有写缓存,L2有写缓存:

L1 cache缓存里面存在时,写到L1;L1缓存里面没,立即写入到L2,CPU不等待,硬件自动完成。L2 cache 不主动往下一级写结果,只有当缓存区满或用户指定是再写回下一级存储区域。

Cache配置

基于sysbios配置参见上一节平台配置。

裸机情况下配置,参看相应的demo演示程序

Cache影响运算速度测试

以DDRA区域,长度为32K,数据类型分别为uint8,uint16,uint32,float,double进行加法,乘法测试。Cache配置分别为L1D 32K、L2 512K,L1D 32K、L2 0K测试结果如下表:

从上表可看成:

1.不开启L2 cache,平均耗时会增加。16位操作改变最大。

2.开启L2 cache,从快到慢uint8,uint16,float,uint32,double

Cache 同步

1.L1D cache 同步L2

采用绝对地址定义,常用作共享变量,共享核内L2,定义如下:

#define CDHZ_SYNC_INT_FLAG (*( volatileunsignedint *)0x108BFFF0u)

#define CDHZ_SYNC_INT_FLAG_ADD ( (unsignedint *) 0x108BFFF0u) 向该标记赋值是,需要强制写回;其他核读此标志时,需要强制刷新Cache。相应的CLS函数为。

CACHE_wbL1d(addr, sizeBytes, CACHE_WAIT); /* Writeback L1D */

CACHE_invL1d(addr, sizeBytes, CACHE_WAIT);/* Invalidate L1D */ 以核间同步作为实例,如下:

if(coreNum == 0)

{

CDHZ_SYNC_INT_FLAG = 0xaa55;

CACHE_wbL1d ((void *) CDHZ_SYNC_INT_FLAG_ADD, sizeof(uint32_t) , CACHE_WAIT);

}

Else

{

do

{

CACHE_invL1d ((void *) CDHZ_SYNC_INT_FLAG_ADD, sizeof(uint32_t) , CACHE_WAIT);

} while( CDHZ_SYNC_INT_FLAG != 0xaa55);

}

2.L2 cache 同步DDR:

主要用于核间大量数据传递,需要保证下一级能获取到上一级完整运算结果。相应CSL函数请参考开发文档。以多核共用一个程序,每个核处理不同算法模块为例,实现方式如下:

switch(coreNum)

{

case CORE_SYS_1:

{

CACHE_wbAllL2(CACHE_WAIT);

相关文档
最新文档