将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算法中所涉及的参考帧和所着的颜 {MOD}信息。
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”核来说,它的具体算法的源代码存放在referenceframeworksapps
f5_iekdiff_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()来注册到相应的通道中的。