本文共 3421 字,大约阅读时间需要 11 分钟。
将RF现有的模块列表如下: 1.ALGMIN模块 由RF1提供的一个IALG执行接口成为ALGMIN。ALGMIN模块提供了静态应用的XDAIS算法函数,可以同时在C5000和C6000平台上使用。 2.ALGRF模块 ALGRF模块可以使用DSP/BIOS存储管理器来创建和删除XDAIS算法,符合RF3和RF5的需要。它还可能适用于其他级别的RF。
3.CHAN模块 CHAN负责管理算法的封装,它使定义的结构符合ICELL接口。
4.ICC模块 ICC负责管理内部CELL之间的通信。
5.SCOM模块 SCOM负责模块间的同步通信。 6.SSCR模块 SSCR是共享的可改写存储模块。 7.UTL模块 UTL是调试和诊断的统一模块。 RF主要实现三个主要的功能:存储管理,线程模型和通道封装。对于不同的应用,我们只需在这三个元素上做改变,而不用从头设计整个应用,这大大简化了开发者的开发难度,并节省了开发时间。 RF5针对大型系统,主要用于由C6 ×实现的高端系统。RF5适用于包含大量的算法,且要求多线程、多通道的应用,像图像处理、多媒体应用等。 Motion Detection程序是按照RF5框架来构造的,下面是针对该程序做简要介绍: 1.线程(Thread) RF5框架包含四个基本数据处理元素,处在最顶层是线程,线程总是顺次执行所包含的通道。线程在一个较高级别的层次上把数据组织在一起,它们可以与别的线程,设备驱动以及别的类似结构进行通讯。每个线程都是在不断地等待消息,处理数据,并将结果传给别的线程。每个线程之间是通过SCOM来进行通讯的。 每个线程都是进行数据处理的一个单元。有的处理是很简单的,有些处理却很复杂,简单的线程可以不包含任何通道,而复杂的线程可以包含多个通道。
该系统有四个线程,分别为 Capture线程 Process线程 Display线程 Control线程 四个线程既是分工明确,又是有序的结合。Capture线程进行原始图像的捕获,并对捕获的图像进行转换,以便于接下来的处理;Process线程对采集进来的图像进行处理,主要包括DIFF和ROTATE两个处理过程,是这个程序的主要部分;Display线程将处理好的图像进行显示;Control线程主要是用来进行控制在DIFF算法中所涉及的参考帧和所着的颜色信息。
2.同步通讯机制(SCOM) ThrProcess中包含两个SCOM对象。RF5使用SCOM对象来实现线程间的通讯。 SCOM消息是用户自定义的一种结构。一个线程通过调用SCOM putMsg ( ),将SCOM消息放到一个SCOM队列中,发送给别的线程,或者通过调用SCOM getMsg()从队列中获取消息。一般情况下,发送消息指明接受线程所要读取的数据缓冲区的地址,接受消息指明发送线程所要写入的数据缓冲区的地址。在本例中,thrProcess要从thrCapture接受消息,并且要发送消息给thrDisplay。 RF5使用SCOM来实现线程间的通讯:thrProcess拥有一些缓冲区,需要thrCapture写或thrDisplay读。故thrProcess需要告诉thrCapture和thrDisplay这些缓冲区的位置,并且保证两个线程不会同时访问同一个缓冲区。这就要用到SCOM。thrProcess创建了两种消息以分别与两个线程进行通讯。整个系统中包含许多存储区,它们可以被任何线程访问,但为了保证每次只能有一个线程访问某个存储区,当前访问该存储区的线程通过发送SCOM消息给另外一个线程,表示它放弃了访问该存储区的权利,而接受到SCOM消息的线程就可以访问该存储区了。 下面是一个利用SCOM通信的简单例子:
本程序中的应用示例如下: 在Capture线程中: scomReceive = SCOM_create("scomCapture", &SCOM_ATTRS);
scomReceive = SCOM_open( "scomCapture" ); scomSend = SCOM_open( "scomToProcessFromCapture" );
在Process线程中: scomReceiveFromCapture = SCOM_create( "scomToProcessFromCapture", &SCOM_ATTRS ); scomReceiveFromDisplay = SCOM_create( "scomToProcessFromDisplay", &SCOM_ATTRS );
scomSendToCapture = SCOM_open( "scomCapture" ); scomSendToDisplay = SCOM_open( "scomDisplay" );
在Display线程中: scomReceive = SCOM_create("scomDisplay", NULL);
scomReceive = SCOM_open( "scomDisplay" ); scomSend = SCOM_open( "scomToProcessFromDisplay" );
一共创建了四个SCOM。Capture创建了“scomCapture”,用来接收Process发来的空缓冲区。Process创建了“scomToProcessFromCapture”和“scomToProcessFromDisplay”,前者用来接收Capture发来的满的缓冲区,后者用来接收Display发来的空的缓冲区。
3.通道(Channel) RF5提供了一种通道结构是为了更方便地封装算法。我们可以把通道理解为并行里的串行,因为线程的执行就由通道的串行执行来完成的。一个通道包含了一组核。通道的主要任务就是依次顺序地执行所包含的核。其主要执行流程为:首先需要初始化通道模块,然后建立通道对象,注册该通道所包含的核对象,接着依次执行每个核,执行完了后就销毁对象,最后退出。要注意的是,每个通道可以包含多个核,每一个核都要进行初始化后再调用CHAN regCell注册。 本程序的Process线程中,安排了四个通道,分别为: 1. Passthrough Channel 2. Diff Channel 3. Rotate Channel 4. Combo Channel
4.核(Icell) 核实际上就是ICELL接口对象。基于RF5的应用常常包含大量的算法和通道。为了便于算法集中到应用中,RF5提出了核的概念。一个核就是包含一种XDAIS算法的容器。一个RF5通道对象可以包含多个核,也即是包含多个算法。通道通过核来调用算法。实际上,真正的数据处理是在XDAIS算法,核只是提供了一个调用算法的接口。这大大简化了工作量,便于移植。RF5提供了一个核对象接口,称为ICELL。该接口包含一个重要的结构: ICELL Fxns ,该结构包含一组函数指针。通道通过调用这些函数来调用算法。其中包含一个关键的函数cellExecute ,这个函数的功能是调用XDAIS算法来执行。上面的通道执行函数CHAN execute就包含了对每一个cellExecute的调用。 实际情况和和上面的图稍有不同,就是四个通道都没有包含“YUV2RGB”这个CELL。所以四个通道包含的CELL数分别是:0,1,1,2。 拿“DIFF”核来说,它的具体算法的源代码存放在referenceframeworks\apps\rf5_iek\diff_ti目录下,以库文件diff_ti.l64的形式输出,存放在/lib目录下。在.cmd file文件中,有如下代码: _l diff_ti.l64 _DIFF_IDIFF = _DIFF_TI_IDIFF; 运用这套算法,需要为它做一个CELL外壳。工程中的文件cellDiff.h和cellDiff.c就是来实现这个外壳的。 5.ICC ICC模块是用来管理在核之间以及核与它们的线程之间的数据通讯的,我们知道线程间的数据传输是通过SCOM模块来实现的。每个ICC模块管理一个或多个ICC对象。每个核都有一组输入和输出ICC对象。这些对象是通过CHAN regCell()来注册到相应的通道中的。
转载地址:http://stgxf.baihongyu.com/