HIMAC调度的C语言实现

2016-10-17 05:40戴曙光
电子科技 2016年9期
关键词:轮询分片入队

赵 骞,戴曙光

(上海理工大学 光电信息与计算机工程学院,上海 200093)



HIMAC调度的C语言实现

赵骞,戴曙光

(上海理工大学 光电信息与计算机工程学院,上海 200093)

针对目前HINOC的MAC层协议由FPGA仿真调试时实现代码量大,仿真过程繁琐且修改成本较高等问题,提出一种基于C语言的HIMAC调度的实现方法。通过C语言重构接受调度与发送调度,完整地实现了EMAC帧和HIMAC帧的接收发送过程,解决了帧分片出队问题,并大幅提高了开发效率。

HINOC;HIMAC调度;C语言

HINOC(High Performance Network Over Coax)技术[1]是利用有线电视同轴电缆的带外信道组建多业务宽带接入网的一种新接入技术。构建HINOC网络的目的是在当前FTTB普遍应用的前提下,利用有线电视网已有的同轴电缆线路和分配网络,连接光纤结点到住户,组建最后100 m范围内的宽带接入网。与国际上类似的EOC(Ethernet Over Coax)[2]产品相比,HINOC更符合我国的网络要求与现状,起始带宽设计为8 MHz的整数倍(n×8 MHz),这样既符合我国现有电视频道的8 MHz的带宽要求,又能满足今后宽带业务不断增长的需求。文献[3]中,为提高传输速率,MAC层的部分功能需要由硬件完成。软件部分需用到FPGA,但在仿真调试阶段,FPGA实现较为复杂,仿真过程繁琐。在设计调试阶段利用C语言编写代码,可节省时间成本以及硬件成本,设计思路与在FPGA上实现完全相同。本文描述了一种HIMAC调度的C语言实现方法,已达到较好的调试仿真功能,避免直接用FPGA仿真在器件上产生的消耗。

1 HINOC网络

HINOC[4]网络由位于楼道的头端设备(HINOC Bridge,HB)和位于户内的(HINOC Modem,HM)构成。逻辑拓扑采用点到多点。其中HB处于中心控制地位,各HM可与HB通信并受其控制,各HM之间不能直接通信。HINOC系统上下行数据采用时分传输,系统设计简单,物理层只包含4种帧结构,分别为上行探测帧(Pd帧)、下行探测帧(Pu帧)和上/下行数据帧(Du/Dd帧)。4种帧均采用OFDM(正交频分复用)技术进行数据传输。考虑到系统频带利用率与实现复杂度等制约因素,一个OFDM符号包含256个子载波。在实际应用中,可以是多个家庭共享一个HINOC信道,也可以为每个家庭分配一个HINOC信道。每个用户家庭均分配HINOC信道是典型的信道分配模式,每个用户在这种分配模式下可得到该信道的全部接入速率。未来根据用户需要还可进一步扩展用户家庭接入速率,使每一个用户能享有多个HINOC信道的带宽。HINOC网络逻辑图如图1所示。

图1 HINOC网络逻辑图

2 HIMAC整体工作流程

HIMAC[5]工作流程分为EMAC帧入队流程和HIMAC帧发送流程。

EMAC帧入队流程如下:(1)EMAC数据源进入HIMAC;(2)分组处理提取帧信息(帧长、目的MAC、源MAC和源端口号)后向接收调度申请入队;(3)接收调度根据EMAC的源MAC和源端口号建立查找表项,并根据目的MAC查找相应的目的端口号;(4)总调度读取接收调度的信息(帧长、目的端口号和优先级等);(5)总调度向缓存管理模块申请BD地址,缓存管理模块返回存储EMAC帧的BD地址;(6)若申请缓存成功,总调度将EMAC帧的首BD地址和入队队列号等信息给队列管理,队列管理修改队尾信息;(7)总调度将最终的入队指令信息交给总线模块;(8)总调度根据入队指令将EMAC帧从分组处理搬移到缓存中。

HIMAC帧发送流程如下[6]:(1)HIPHY将组帧指令交给序号处理模块,组帧指令包含目的ID号,HIMAC帧长,组帧个数等信息;(2)序号处理模块将组帧指令交给总调度模块;(3)总调度查询出队队列信息(按照先出高优先级,后出低优先级,先出碎片,后出完整EMAC帧原则),若队列不为空,则队列管理返回当前队列头节点的首BD地址;(4)总调度根据队列头节点的首BD地址去缓存管理模块查询,缓存管理返回即将出队EMAC的所有BD地址,出队后队列管理修改队头信息,缓存管理并释放相应的缓存;(5)总调度将最终的出队指令信息交给总线模块;(6)总线模块根据出队指令将缓存中的数据搬移到组帧模块;(7)组帧模块组好HIMAC帧,将HIMAC帧写入HIPHY的发送缓存区。

3 HIMAC调度模块

调度模块[7]是HIMAC内部的核心模块之一,在整个HIMAC中起着重要的作用。它连接着转发表模块、队列管理模块、内部总线控制模块、分组处理模块、HIMAC数据发送控制FIFO等,在这些模块之间进行信息的控制、传递,最终有序、正确地完成EMAC帧的接收和发送、HIMAC帧[8]的组帧和拆帧等工作。调度机制设计结构[9]如图2所示,主要由中心调度、缓存管理、队列管理3个模块组成,其中中心调度模块控制帧入队/出队、缓存分配/释放、反馈重传处理、分片信息生成等过程,缓存管理模块负责缓存分配和释放操作,队列管理模块管理队列中EMAC帧之间的关系。

图2 调度机制设计结构

4 HIMAC 调度C实现

4.1接收调度

接收调度设计思路:

(1)通过Poll信号的跳转轮询HIMAC端口和EMAC端口的以太网数据,分别判断来自HB的HIMAC端口和EMAC端口或是HM的HIMAC端口以及EMAC端口,将即将入队的EMAC帧信息(帧长、优先级和目的节点)交给中心调度处理;

(2)在查找表模块[10],先学习,后查找,根据EMAC帧的源MAC地址和源端口号,建立查找表项,根据EMAC帧的目的MAC地址进行查表。

以下是轮询部分代码:

if(!poll&&!que_fp_rx_fifo_h.empty()) //poll=0来自himac端口的情况

{

pfp_rx_fifo_tmp=

(pfp_rx_fifo)malloc(sizeof(fp_rx_fifo));

pthread_mutex_lock(

&que_fp_rx_fifo_h_mutex);

pfp_rx_fifo_tmp=

que_fp_rx_fifo_h.front();

que_fp_rx_fifo_h.pop();

pthread_mutex_unlock(

&que_fp_rx_fifo_h_mutex);

in_port_num=0;

src_port=pfp_rx_fifo_tmp->src_port_h;

}

else if(poll&&!que_fp_rx_fifo_e.empty()) //poll=1来自emac端口的情况

{

pfp_rx_fifo_tmp=

(pfp_rx_fifo)malloc(sizeof(fp_rx_fifo));

pthread_mutex_lock(

&que_fp_rx_fifo_e_mutex);

pfp_rx_fifo_tmp=

que_fp_rx_fifo_e.front();

que_fp_rx_fifo_e.pop();

pthread_mutex_unlock(

&que_fp_rx_fifo_e_mutex);

in_port_num=1;

src_port=85;

}

4.2总调度

总调度是中心调度、入队出队控制、队列管理、缓存分配的顶层文件,其中缓存分配和队列管理作为子模块和其相连,包含了EMAC帧入队、EMAC帧出队、处理重传反馈、HIMAC帧出队、释放缓存区等状态。

总调度设计思路:

(1)先从tx_fifo中获取目的HM_ID、HIMAC帧序号、HIMAC帧长、是否包含EIF子帧等信息,这时将HIMAC帧长减去首部、CRC、EIF子帧长(若有EIF 子帧)赋给remainByteNumber(剩余字节数);

(2)从获取的目的HM_ID由高到低轮询dequeueInfo,若此HM_ID对应的3个优先级中的碎片长度不为0,说明上次此队列出队未出完整,有剩余碎片没出,将此剩余碎片的长度和remainByteNumber 比较,如果剩余的碎片长度不小于后者,则此HIMAC帧只能容纳一个碎片,更新dequeueInfo和dequeueResultFifo,轮询结束;若剩余的碎片长度小于后者,则此碎片作为HIMAC帧的头部EMAC碎片出队,轮询完头部碎片情况,继续轮询完整的EMAC帧情况,由高到低轮询3个优先级的队列情况,如果查询到的EMAC帧大于remainByteNumber,说明此EMAC帧的头一部分可作为尾部碎片出,直接转到尾部轮询;若查询到的EMAC帧小于等于remainByteNumber,说明此EMAC作为HIMAC帧的一部分出队,继续轮询完整的EMAC帧的队列情况。对于满足要求的EMAC帧,在轮询过程中,无论碎片还是完整的,将此EMAC帧的相关信息写到dequeueResultFifo里面,同时更新dequeueInfo;

(3)轮询之后,首先判断是否空帧,如果轮询之后没有帧出队,remainByteNumber保持一个定值不变,满足这个要求则是空帧。如果是空帧,将结果写到SR_FIFO;如果不是空帧,执行从出队结果FIFO中读出的指令。每执行一次对应一个EMAC帧,每次将EMAC的第一个64 Byte块的首地址交给缓存管理进行查询,缓存管理返还所有64 Byte块的首地址和最后一个64 Byte块有效长度,调度根据dequeueResultFifo中记录的需要这些64 Byte块的哪些和每个64 Byte块多少有效数据来判断缓存管理返还的信息哪些是需要的,并把需要的信息写到sr_fifo里。在所有dequeueResultFifo中的数据执行完HIMAC帧出队过程结束;

(4)EMAC帧出队状态,将EMAC帧出队发往EMAC端口。将EMAC队列号交给队列管理,队列管理返还第一个64 Byte块地址和长度信息,调度将此地址交给缓存区管理,缓存管理反馈此EMAC帧所有64 Byte块的首地址和最后一个64 Byte块的有效长度,调度将相关信息写到SR_FIFO中;

(5)释放缓存区状态,释放缓存管理里面的内存。将第一个64 Byte块的首地址和释放请求交给缓存区管理,缓存管理根据第一个64 Byte块的首地址,将这一EMAC的所有64 Byte块的地址均删除。

判断高中低优先级中是否存在分片程序如下:

if(dequeueInfo[dequeueDestNodeId_HighPri]!=0) //若高优先级队列中存在分片, 出队分片信息

dequeuefronthigh_pri();

else if(dequeueInfo[dequeueDestNodeId_MidPri]!=0)// 若中优先级队列中存在分片,出队分片信息

dequeuefrontmid_pri();

else if(dequeueInfo[dequeueDestNodeId_LowPri] !=0)// 若低优先级队列中存在分片,出队分片信息

dequeuefrontlow_pri();

else

dequeue_whole_frame();//若三个优先级队列均未分片,则出队整帧

整帧出队部分程序如下:

if(Queue_location_address !=0) //若高优先级队列中有整帧存在,出队此帧

dequeue_whole_high_pri(Queue_location_address);

else

{

Queue_location_address=

Queue_location_RAM[dequeueDestNodeId_MidPri]->emac_current_address;//查询位置记忆ram,得到中优先级对列的整帧地址信息

if(Queue_location_address !=0) //若中优先级队列中有整帧存在,出队此帧

dequeue_whole_mid_pri(Queue_location_address);

else

{

Queue_location_address=

Queue_location_RAM[dequeueDestNodeId_LowPri]->EMAC_current_address ;

//查询位置记忆ram,得到低优先级对列的整帧地址信息

if(Queue_location_address !=0) //若低优先级队列中有整帧存在,出队此帧

{

dequeue_whole_low_pri(Queue_location_address);//若低优先级队列中还有分片,继续出分片

}

else

dequeue_tail_frag();//如果3个优先级队列均没有整帧,则开始组HIMAC尾部

}

5 结束语

HINOC作为我国拥有自主研发产权的新型宽带技术,具有重要的科研价值。本文介绍了HINOC网络、HIMAC的整体工作流程和HIMAC调度机制,分别介绍了接受调度与中心调度的C语言设计思路并展示了部分代码。C语言优秀的硬件结合能力与高效率的特点,可以大幅节省协议设计调试阶段的工作量。另外,用C语言代替FPGA实现HIMAC调度,虽目前目的仅为仿真测试,但为转化成System C等软硬件结合语言做了铺垫。

[1]国家广播电影电视总局广播科学研究院,北京大学,西安电子科技大学.高性能同轴电缆接入网(HINOC)物理层传输模式及媒质接入控制协议[M].北京:国家广播电影电视总局广播科学研究院,2010.

[2]欧阳锋,崔竞飞.HINOC技术概述和进展[J].电视技术,2011,35(12):11-13.

[3]龚晨亮,邱智亮.HIMAC协处理器的调度方案[J].网络新媒体技术,2013,2(5):35-38.

[4]崔金.HiNOC网络MAC协议研究[D].西安:西安电子科技大学,2009.

[5]潘伟涛,邱智亮.一种HIMAC硬件协处理器的设计与FPGA实现[J].电子器件,2012,35(2):221-226.

[6]冯振威.基于嵌入式平台的HINOC MAC驱动程序的设计[D].西安:西安电子科技大学,2011.

[7]王炜涛.基于嵌入式平台的HINOC协议MAC层软件设计与实现[D].西安:西安电子科技大学,2011.

[8]张辉,曹丽娜.现代通信原理与技术[M].3版.西安:西安电子科技大学出版社,2013.

[9]李建东,盛敏.通信网络基础[M].北京:高等教育出版社,2004.

[10]齐立龙.HINOC网络MAC层调度算法的设计与实现[D].西安:西安电子科技大学,2010.

C Language Implementation of HIMAC Scheduling

ZHAO Qian, DAI Shuguang

(School of Optical-Electrical and Computer Engineering, University of Shanghai for Science and Technology, Shanghai 200093, China)

This paper introduces a way of realizing HIMAC scheduling module using C language to maximize efficiency of design and debugging in view of the difficulty of HINOC’s MAC layer protocol realized by FPGA. The function of receiving schedule and sending schedule by C language realizes the process how EMAC and HIMAC receive and send frames. And the solution of the problem of dequeuing frame shards improves the efficiency of development.

HINOC; HIMAC scheduling; C language

2015- 12- 18

赵骞(1992-),男,硕士研究生。研究方向:网络通信等。戴曙光(1957-),男,教授,博士生导师。研究方向:工业光电检测技术与装置等。

10.16180/j.cnki.issn1007-7820.2016.09.017

TN949.194

A

1007-7820(2016)09-061-04

猜你喜欢
轮询分片入队
上下分片與詞的時空佈局
今天我入队——入队仪式
降低跨分片交易回滚概率的多轮验证方案
分片光滑边值问题的再生核方法
1+1我们这样学队章:我们的入队誓词
基于等概率的ASON业务授权设计∗
基于模糊二分查找的帧分片算法设计与实现
今天我入队了
入队风波
依托站点状态的两级轮询控制系统时延特性分析