这个线程是应用程序的核心;它通过XDAIS算法处理数据.如果我们要使用RF5,那么它是主要要修改的地方.源代码在thrProcess.c和thrProcess.h中. ThrProcess结构体中定义了: typedef struct ThrProcess { CHAN_Obj chanList[ NUMCHANNELS ]; // array of channel objects ICELL_Obj cellList[ NUMCHANNELS * NUMCELLS ]; // array of cell objects Sample *bufInput[ NUMCHANNELS ]; // pointers to input buffers Sample *bufOutput[ NUMCHANNELS ]; // pointers to output buffers Sample *bufIntermediate; // pointers to intermediate buf. ScomBufChannels scomMsgRx; // SCOM object ScomBufChannels scomMsgTx; // SCOM object } ThrProcess; 真正的没有初始化的代表通道和细胞的符号是这个结构体的部分.数据缓存区是静态分配的,在这个结构体的外部,因为它们一般情况下需要为高速缓存对齐数据,而且对结构体成员来说数据对齐不能容易控制.指向这些缓冲区的指针也在这个结构体中定义.线程初始化它的细胞在thrProcessInit()中,并且创建实际上的XDAIS算法并初始化通道队列在thrPrecessStartup().我们需要两阶段的初始化,因为在第一个阶段系统需要收集所有细胞信息来计算最小的缓冲区的大小,但是不用创建任何东西.在第二个阶段,分配内存并创建算法.大多数的启动工作在setParamsAndStartChannels()函数中.这个函数知道,通过它的单一参数,而不管是thrProcessInit()还是thrProcessStartup()调用.也就是,它知道是运行在第一个还是第二个初始化阶段.在第一个阶段,它定义细胞对象并注册,在第二个阶段,它初始化通道对象通过创建XDAIS算法.但是在这两个阶段,它需要为细胞中的算法设置XDAIS的参数.默认的XDAIS算法的参数是通过全局对象中的vendor提供的,但是我们经常需要修改一些参数. 除了定义细胞对象和算法的参数外,初始化还要为通信创建SCOM对象,并通过把指针指向静态数据缓存区初始化细胞间通信的缓冲区. 处理线程有两个通道,并且每个通道有两个算法,它涉及到它的细胞用记忆方法而不用数字.这定义在thrProcess.h中: enum { CELLFIR = 0, // cell #0 CELVOL, // cell #1 NUMCELLS // total number of cells }; 这允许使用CELLFIR标记来代替FIR细胞索引0,这使得代码的可读性增强.处理线程的NUMCHANNELS(2)通道有相同的细胞类型,但是如果处理有不同的通道,如,一个通道使用FIR,VOL算法,而另一个通道使用FIF,G723解码算法,这会枚举它的通道,并且在相应的通道名字前加相应的前缀. // enumeration example for a thread that has two channels with different types // of cells: on enum { // chanel indices CHFILTER = 0, // first channel (FIR + VOL) CHCOMPRESS, // second channel (FIR + G723ENC) NUMCHANS // total number of channels }; enum { // cell indices for channel FILTER CHFILTERCELLFIR = 0, // cell #0 (FIR) CHFILTERCELLVOL, // cell #1 (VOL) CHFILTERNUMCELLS // total number of cells for this channel }; enum { // cell indices for channel COMPRESS CHCOMPRESSCELLFIR = 0, // cell #0 (FIR) CHCOMRESSCELLENC, // cell #1 (ENCODER) CHCOMPRESSNUMCELLS // total number of cells for this channel }; 前面的例子说明了当一个应用程序有不同数量的通道时发生的情况.因为这个枚举是为每一个线程提供的,所以每一个线程会有它自己的限制条件.在RF5中,碰巧有两个物理通道(左和右).因此,NUMCHANNELS=2. 如果这个线程的通道有不同数量的细胞,那么我们应该为每一个通道单独的声明细胞序列(在前面的例子中,大小是CHFILTERNUMCELLS和CHCOMPRESSNUMCELLS. (秩名) |