DSP

关于xdais

2019-07-13 17:29发布

一、对于 IALG 接口之理解
先说 XDAIS 算法标准,原本以为是类似 C 的语法标准,结果买了本书查了下才知道,这是一个实现标
准(个人定义,呵呵),不是定义算法该如何具体去写,而是定义了算法能做什么不能去做什么,好像
有 46 条规则,还在完善中。至于为什么要符合这个标准,是因为现在第三方厂家提供算法都是按照它来
写的,这样更方便系统集成(比如 TI 的某部分程序+你自己完成的某部分程序)......
对于规则中一些编程的规范,不在重复,没多大意思。主要关心的是接口的问题。提到接口,就不能
不说下 XDAIS 最终要实现的目标--就是将算法与硬件的使用相分离,如果使用硬件资源,只能使用
逻辑资源,真正分配时不依靠算法本身,这样可以使算法在任意平台下都可以被调用...
XDAIS 定义的抽象接口包括 2 部分:IALG,IDMA2。
IALG 是算法实例接口,头文件是 ialg.h。它的主要任务是让算法定义其使用的存储器资源以实现更
高效资源利用。所有的 XDAIS 算法都要实现 IALG 接口。其中一个结构体特殊,它是一些函数的结构
体,IALG_Fxns
typedef struct IALG_Fxns {
Void *implementationId;
Void (*algActivate)(IALG_Handle);
Int
(*algAlloc)(const IALG_Params *, struct IALG_Fxns **, IALG_MemRec
*);
Int
(*algControl)(IALG_Handle, IALG_Cmd, IALG_Status *);
Void (*algDeactivate)(IALG_Handle);
Int
(*algFree)(IALG_Handle, IALG_MemRec *);
Int
(*algInit)(IALG_Handle, const IALG_MemRec *, IALG_Handle, const
IALG_Params *);
Void (*algMoved)(IALG_Handle, const IALG_MemRec *, IALG_Handle,
const IALG_Params *);
Int
(*algNumAlloc)(Void);
} IALG_Fxns;
上面结构体中的所有函数都要实现或赋予相应的值,就算不需要完成任何功能,也要将指针设置为
NULL。结构体中只有第一个成员变量比较特殊,不是函数指针而是一个空指针,它的作用是唯一标识
模块的实现,经常需要用到。
剩下定义的函数可以分为 3 类:1.用于创建、初始化和删除实例对象的函数,包括:
algAlloc(),algInit()和 algFree();2.算法处理的函数,包括:algActivate()和
algDeactivate();3.用于控制和重定位实例对象的函数,包括:algControl()和 algMoved()。
剩下的一个 algNumAlloc()函数可在任何时候调用且值不变,主要是求得算法实例的需要分配的存储
器数目。
按顺序逐一而来:
1.algActivate()。功能:在数据处理之前,实现临时存储器的初始化。参数是算法实例的句柄
IALG_Handle handle,通过该句柄识别出算法需要的不同类型的缓冲,并完成相应的初始化。该
函数是可选实现的,仅当在数据处理之前需要初始化时才实现,如不实现可置 NULL,以下雷同。
调用的前提:必须在 algInit()成功之后才能调用;handle 是一个有效的算法句柄;它不能抢占
对象的其它方法;如果算法实现了 IDMA2 接口,则 algActivate()必须在 dmaInit()成功后调用。
实现此函数之后,算法中所有方法都可使用。
2.algAlloc()。功能:得到算法对象对于存储器的需求情况。第一个参数是指向用于创建算法对象
的参数,如果为 NULL 则是默认参数,第二个参数是输出参数,返回给父 IALG 函数;第三个参数是
一个存储器记录的表格。如果成功返回一个非 0 整数,这个整数说明表格中包含多少个有效项。
调用前提:存储器表格中记录的个数不能少于 algNmAlloc()返回值,params 允许为空。
3.algControl()。功能:算法的控制和状态信息的提取。第一个参数是算法实例的句柄,剩下的
2 个参数是算法特定的。返回值是 IALG_EOK 或是其它出错信息。这个函数实现是可选的,如不实现
设置为空。
调用条件:只能在 algInit()后调用,handle 是一个有效句柄,cmd 的数值必须小于
IALG_SYSCMD。
4.algDeactivate()。功能:保存所有的持久数据到非临时存储器上。与 algActivate()类似,
在其之后只能调用 algActive()或 algFree()。
5.algFree()。功能:获得算法的存储器资源。与 algAlloc()类似,返回值是存储器表格的有效
项数。存储器表格中包含所有传递给算法的指向缓冲的指针。
algInit()。功能:初始化算法实例对象。algInit()实现在运行阶段创建算法实例对象,在该函数成功
返回后,算法实例对象才开始处理数据。参数解释:第一个参数是算法实例句柄,它指向一个初始化后
的 IALG_Obj 结构,数值与 memTab[0].base 相同(看不明白先看下他们的数据结构);第二个
参数是存储器记录表格,有效记录项目数与 algAlloc()相同;第三个参数是另一个算法实例对象的句柄,
通常为 NULL,表示没有父对象存在;最后一个是算法特定参数,可以为 NULL。
调用条件较复杂。。。。。。
algMoved()。功能:重新定位算法实例的存储器资源。主要是当算法实例需要移动时调用,可选
实现,不实现表明不可移动。参数与 algInit()中一样。
algNumAlloc()。功能:返回需要的存储器数目。必须大于等于 algAlloc()的返回值,可以在任
何时刻调用,且值不变
二、XDAIS 算法封装需要注意的几个问题:
1,algNumAlloc()接口。XDAIS 工具生成的算法实现.c 文件中,并没有该函数,默认的为
NULL。如下面的红 {MOD}字体标示:
#define IALGFXNS
&RVM_TI_IALG,/* module ID */

NULL,
/* activate */

RVM_TI_alloc,/* alloc */

NULL,
/* control (NULL => no control ops) */
NULL,
/* deactivate */

RVM_TI_free, /* free */

RVM_TI_initObj, /* init */

NULL,
/* moved */

NULL /* numAlloc (NULL => IALG_MAXMEMRECS) */
如果没有 algNumAlloc()函数的话,mem rec 的数目是小于等于默认值
IALG_DEFMEMRECS(该值为 4),也就是说么说么 memTab 的大小最多为 4,当 memTab
的数目大于 4 的时候,需要加上该接口,返回当前算法最大的 memTab 数目。具体可以参考 lalg.h
文件。
2,XDM_SETACCESSMODE_READ()or
XDM_CLEARACCESSMODE_WRITE()。当用到 CPU 向 DSP 读写数据时在算法里不要
忘记加上相应的该接口函数(可参靠 xdm.h 文件)

热门文章