分类: 嵌入式
2014-04-04 15:22:50
DSKT2 –框架里的一个模块。其中导出一系列函数,自动化instantiating, activating, and controlling xDAIS 算法。
❏ IALG Interface – 一个xDAIS算法导出的一系列标准接口函数(algAlloc, algActivate, algControl, algDeactivate, algFree, algInit, algMoved, algNumAlloc).
❏ Scratch Memory – 临时内存: xDAIS算法定义的共享内存的手段,
典型的框架调用顺序如下:
a) 调用算法algActivate允许算法去初始化内存缓冲区从永久内存中。
b) 调用算法处理函数
c) 调用算法algDeactivate 函数允许算法将占用的临时内存交还到永久内存中一旦这个周期完成,框架可以重复另外一个算法的同一个周期,又可以在其算法处理过程中使用相同的物理临时内存的
xDAIS 库提供服务支持创建,初始化,控制,删除xDAIS算法实例对象。DSKT2的主要目的是当使用一个算法IALG方法时使标准的算法操作自动化。这样做需要一个实例是算法无关的。这个工作包括用一个算法的IALG方法去实例化这个算法,获得它的内存请求,分配算法内存,并且activate/deactivate临时内存。DSKT2 提供API接口来完成这些工作。
DSKT2还介绍了两个主要的功能,导致细粒度的内存配置和优化的内存管理和使用
❏您可以定义多个内存堆段和配置映射一个算法的内存请求到首选堆部分指定的要求的内存空间的属性
❏ 属于同一个scratch-group ID的算法实例的临时内存你一个透明的共享,通过DSKT2有下面的几个好处
❏ 不用复制DSKT2提供的功能,你可以介绍DSP应用程序的大小
❏ 在DSKT2内部分配所有的算法内存。提供DSP端内存申请进行一些级别控制的能力。没有集中分配内存,每个算法开发者将应用不同的内存分配策略,比如. 例如使用所有的片上存储器为自己的算法 ,而不考虑不考虑DSP同时运行其他算法的
#include
#include
#include
Void smain(Int argc, Char * argv[])
{
IUSESCRATCH_Handle alg;
IUSESCRATCH_Params params = IUSESCRATCH_PARAMS;
IALG_Fxns *fxns;
Int scratchId = 0;
Int status = USESCRATCH_SOK;
/* IALG_Fxns for an algorithm that uses scratch memory */
fxns = (IALG_Fxns *)&USESCRATCH_TI_IUSESCRATCH;
/* Create alg */
alg = (IUSESCRATCH_Handle)DSKT2_createAlg(scratchId,
fxns, NULL, (IALG_Params *)¶ms);
if (alg == NULL) {
SYS_abort("Memory allocation failed\n");
}
/* Activate alg before calling its process function */
DSKT2_activateAlg(scratchId, (IALG_Handle)alg);
/* Call alg's processing function */
status = alg->fxns->process((IALG_Handle)alg);
/* Deactivate the alg */
DSKT2_deactivateAlg(scratchId, (IALG_Handle)alg1);
/* Free alg */
DSKT2_freeAlg(scratchId, (IALG_Handle)alg);
}
下面的步骤使用RTSC 配置DSKT2:
1) 第一在RTSC配置文件中需要访问DST2模块如下:
var DSKT2 = xdc.useModule('ti.sdo.fc.dskt2.DSKT2');
2) 允许DSKT2使用外部临时内存scratch memory, 添加下面声明
DSKT2.ALLOW_EXTERNAL_SCRATCH = true;
设置ALLOW_EXTERNAL_SCRATCH 属性为"true"意味着如果一个临时内存请求在内部内部不能获得,并且在连续固有的内部内存法无为这个请求分配内存时,DSKT2将使用外部内部。
如果设置成"false", 没有足够的临时内部或足够得固有内村满足这个请求DSKT2_createAlg 将失败
3) 下一步,你的CFG文件要制定DSTK2默认分配内部对象时的堆大小。堆名称必须要在TCF文件中已经定义,比如,你已经定义EXTMEM_HEAP标签,你可以指定DSTK2使用这个堆来分配内部对象如下
DSKT2.DSKT2_HEAP = "_EXTMEM_HEAP";
记住你要在堆标签前加个下画线 ("_")
4) 然后,镜像IALG 内存空间类型到指定的堆,下面的声明 _L1D_HEAP 和_EXTMEM_HEAP 是已经在DSP/BIOS内存段中定义的堆标签
DSKT2.DARAM0 = "_L1D_HEAP";
DSKT2.DARAM1 = "_L1D_HEAP";
DSKT2.DARAM2 = "_L1D_HEAP";
DSKT2.SARAM0 = "_L1D_HEAP";
DSKT2.SARAM1 = "_L1D_HEAP";
DSKT2.SARAM2 = "_L1D_HEAP";
DSKT2.ESDATA = "_EXTMEM_HEAP";
DSKT2.IPROG = "_EXTMEM_HEAP";
DSKT2.EPROG = "_EXTMEM_HEAP";
5) 然后, 连接DSTK2库,下面的声明连接DEBUG版库,你可以设置
Debug属性为"false"来连接非调试版DSKT2库.
DSKT2.debug = true;
然后, 分配scratch groups大小,每个内存类型可以分配 20个
scratch groups, DARAM and SARAM.
下面声明, the scratch group 0分配一个512 MAUs.大小
DSKT2.DARAM_SCRATCH_SIZES = [0x200,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0];
DSKT2.SARAM_SCRATCH_SIZES = [0x200,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0];
If you assign the same heap label to both DSKT2.DARAM0 and
DSKT2.SARAM0, the values in DSKT2.SARAM_SCRATCH_SIZES
are ignored; algorithms that request scratch memory from SARAM
are granted scratch memory in DARAM if memory is available.
7) 最后你定义一个函数用来cache writeback and invalidation. 函数必须符合下面的形式
(*DSKT2_CacheWBInvFxn)(Ptr blockPtr, size_t byteCnt,Bool wait)
对于C6000平台,DSKT2调用这个函数确保算法实例内存在算法初始化的时候不会长驻在CACHE里。这是必须的遵从xDAIS C6000 DMA Rules and Guidelines
这个参数的默认值是BCACHE_wbInv函数,在C6000平台上,你不必设置,如果在C55平台上你可以把它设置成空如下
DSKT2.cacheWritebackInvalidateFxn = null;