IALG接口浅析

来源:互联网 发布:淘宝花王海外旗舰店 编辑:程序博客网 时间:2024/06/05 00:54

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://erudite.blogbus.com/logs/5805933.html

      最近一直在论证毕设的可行性,多查阅资料,就怕给自己挖的坑太大添不平.......

      我是想做DM642上的系统集成,算法库有了,别人做好的要集成平台也有了,现在只是一个拼装的过程,不过对于我这种菜鸟而言,还是怕出岔子,毕竟第一次接触,谁初到出什么问题。所以多方查阅资料,发现需要学习RF5框架和XDAIS算法标准的内容...随便写了点东西,里面不成熟的内容大侠们多指正

     先说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()的返回值,可以在任何时刻调用,且值不变。

0 0
原创粉丝点击