趙 騫,戴曙光
(上海理工大學(xué) 光電信息與計(jì)算機(jī)工程學(xué)院,上海 200093)
?
HIMAC調(diào)度的C語言實(shí)現(xiàn)
趙騫,戴曙光
(上海理工大學(xué) 光電信息與計(jì)算機(jī)工程學(xué)院,上海 200093)
針對目前HINOC的MAC層協(xié)議由FPGA仿真調(diào)試時實(shí)現(xiàn)代碼量大,仿真過程繁瑣且修改成本較高等問題,提出一種基于C語言的HIMAC調(diào)度的實(shí)現(xiàn)方法。通過C語言重構(gòu)接受調(diào)度與發(fā)送調(diào)度,完整地實(shí)現(xiàn)了EMAC幀和HIMAC幀的接收發(fā)送過程,解決了幀分片出隊(duì)問題,并大幅提高了開發(fā)效率。
HINOC;HIMAC調(diào)度;C語言
HINOC(High Performance Network Over Coax)技術(shù)[1]是利用有線電視同軸電纜的帶外信道組建多業(yè)務(wù)寬帶接入網(wǎng)的一種新接入技術(shù)。構(gòu)建HINOC網(wǎng)絡(luò)的目的是在當(dāng)前FTTB普遍應(yīng)用的前提下,利用有線電視網(wǎng)已有的同軸電纜線路和分配網(wǎng)絡(luò),連接光纖結(jié)點(diǎn)到住戶,組建最后100 m范圍內(nèi)的寬帶接入網(wǎng)。與國際上類似的EOC(Ethernet Over Coax)[2]產(chǎn)品相比,HINOC更符合我國的網(wǎng)絡(luò)要求與現(xiàn)狀,起始帶寬設(shè)計(jì)為8 MHz的整數(shù)倍(n×8 MHz),這樣既符合我國現(xiàn)有電視頻道的8 MHz的帶寬要求,又能滿足今后寬帶業(yè)務(wù)不斷增長的需求。文獻(xiàn)[3]中,為提高傳輸速率,MAC層的部分功能需要由硬件完成。軟件部分需用到FPGA,但在仿真調(diào)試階段,F(xiàn)PGA實(shí)現(xiàn)較為復(fù)雜,仿真過程繁瑣。在設(shè)計(jì)調(diào)試階段利用C語言編寫代碼,可節(jié)省時間成本以及硬件成本,設(shè)計(jì)思路與在FPGA上實(shí)現(xiàn)完全相同。本文描述了一種HIMAC調(diào)度的C語言實(shí)現(xiàn)方法,已達(dá)到較好的調(diào)試仿真功能,避免直接用FPGA仿真在器件上產(chǎn)生的消耗。
HINOC[4]網(wǎng)絡(luò)由位于樓道的頭端設(shè)備(HINOC Bridge,HB)和位于戶內(nèi)的(HINOC Modem,HM)構(gòu)成。邏輯拓?fù)洳捎命c(diǎn)到多點(diǎn)。其中HB處于中心控制地位,各HM可與HB通信并受其控制,各HM之間不能直接通信。HINOC系統(tǒng)上下行數(shù)據(jù)采用時分傳輸,系統(tǒng)設(shè)計(jì)簡單,物理層只包含4種幀結(jié)構(gòu),分別為上行探測幀(Pd幀)、下行探測幀(Pu幀)和上/下行數(shù)據(jù)幀(Du/Dd幀)。4種幀均采用OFDM(正交頻分復(fù)用)技術(shù)進(jìn)行數(shù)據(jù)傳輸??紤]到系統(tǒng)頻帶利用率與實(shí)現(xiàn)復(fù)雜度等制約因素,一個OFDM符號包含256個子載波。在實(shí)際應(yīng)用中,可以是多個家庭共享一個HINOC信道,也可以為每個家庭分配一個HINOC信道。每個用戶家庭均分配HINOC信道是典型的信道分配模式,每個用戶在這種分配模式下可得到該信道的全部接入速率。未來根據(jù)用戶需要還可進(jìn)一步擴(kuò)展用戶家庭接入速率,使每一個用戶能享有多個HINOC信道的帶寬。HINOC網(wǎng)絡(luò)邏輯圖如圖1所示。
圖1 HINOC網(wǎng)絡(luò)邏輯圖
HIMAC[5]工作流程分為EMAC幀入隊(duì)流程和HIMAC幀發(fā)送流程。
EMAC幀入隊(duì)流程如下:(1)EMAC數(shù)據(jù)源進(jìn)入HIMAC;(2)分組處理提取幀信息(幀長、目的MAC、源MAC和源端口號)后向接收調(diào)度申請入隊(duì);(3)接收調(diào)度根據(jù)EMAC的源MAC和源端口號建立查找表項(xiàng),并根據(jù)目的MAC查找相應(yīng)的目的端口號;(4)總調(diào)度讀取接收調(diào)度的信息(幀長、目的端口號和優(yōu)先級等);(5)總調(diào)度向緩存管理模塊申請BD地址,緩存管理模塊返回存儲EMAC幀的BD地址;(6)若申請緩存成功,總調(diào)度將EMAC幀的首BD地址和入隊(duì)隊(duì)列號等信息給隊(duì)列管理,隊(duì)列管理修改隊(duì)尾信息;(7)總調(diào)度將最終的入隊(duì)指令信息交給總線模塊;(8)總調(diào)度根據(jù)入隊(duì)指令將EMAC幀從分組處理搬移到緩存中。
HIMAC幀發(fā)送流程如下[6]:(1)HIPHY將組幀指令交給序號處理模塊,組幀指令包含目的ID號,HIMAC幀長,組幀個數(shù)等信息;(2)序號處理模塊將組幀指令交給總調(diào)度模塊;(3)總調(diào)度查詢出隊(duì)隊(duì)列信息(按照先出高優(yōu)先級,后出低優(yōu)先級,先出碎片,后出完整EMAC幀原則),若隊(duì)列不為空,則隊(duì)列管理返回當(dāng)前隊(duì)列頭節(jié)點(diǎn)的首BD地址;(4)總調(diào)度根據(jù)隊(duì)列頭節(jié)點(diǎn)的首BD地址去緩存管理模塊查詢,緩存管理返回即將出隊(duì)EMAC的所有BD地址,出隊(duì)后隊(duì)列管理修改隊(duì)頭信息,緩存管理并釋放相應(yīng)的緩存;(5)總調(diào)度將最終的出隊(duì)指令信息交給總線模塊;(6)總線模塊根據(jù)出隊(duì)指令將緩存中的數(shù)據(jù)搬移到組幀模塊;(7)組幀模塊組好HIMAC幀,將HIMAC幀寫入HIPHY的發(fā)送緩存區(qū)。
調(diào)度模塊[7]是HIMAC內(nèi)部的核心模塊之一,在整個HIMAC中起著重要的作用。它連接著轉(zhuǎn)發(fā)表模塊、隊(duì)列管理模塊、內(nèi)部總線控制模塊、分組處理模塊、HIMAC數(shù)據(jù)發(fā)送控制FIFO等,在這些模塊之間進(jìn)行信息的控制、傳遞,最終有序、正確地完成EMAC幀的接收和發(fā)送、HIMAC幀[8]的組幀和拆幀等工作。調(diào)度機(jī)制設(shè)計(jì)結(jié)構(gòu)[9]如圖2所示,主要由中心調(diào)度、緩存管理、隊(duì)列管理3個模塊組成,其中中心調(diào)度模塊控制幀入隊(duì)/出隊(duì)、緩存分配/釋放、反饋重傳處理、分片信息生成等過程,緩存管理模塊負(fù)責(zé)緩存分配和釋放操作,隊(duì)列管理模塊管理隊(duì)列中EMAC幀之間的關(guān)系。
圖2 調(diào)度機(jī)制設(shè)計(jì)結(jié)構(gòu)
4.1接收調(diào)度
接收調(diào)度設(shè)計(jì)思路:
(1)通過Poll信號的跳轉(zhuǎn)輪詢HIMAC端口和EMAC端口的以太網(wǎng)數(shù)據(jù),分別判斷來自HB的HIMAC端口和EMAC端口或是HM的HIMAC端口以及EMAC端口,將即將入隊(duì)的EMAC幀信息(幀長、優(yōu)先級和目的節(jié)點(diǎn))交給中心調(diào)度處理;
(2)在查找表模塊[10],先學(xué)習(xí),后查找,根據(jù)EMAC幀的源MAC地址和源端口號,建立查找表項(xiàng),根據(jù)EMAC幀的目的MAC地址進(jìn)行查表。
以下是輪詢部分代碼:
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總調(diào)度
總調(diào)度是中心調(diào)度、入隊(duì)出隊(duì)控制、隊(duì)列管理、緩存分配的頂層文件,其中緩存分配和隊(duì)列管理作為子模塊和其相連,包含了EMAC幀入隊(duì)、EMAC幀出隊(duì)、處理重傳反饋、HIMAC幀出隊(duì)、釋放緩存區(qū)等狀態(tài)。
總調(diào)度設(shè)計(jì)思路:
(1)先從tx_fifo中獲取目的HM_ID、HIMAC幀序號、HIMAC幀長、是否包含EIF子幀等信息,這時將HIMAC幀長減去首部、CRC、EIF子幀長(若有EIF 子幀)賦給remainByteNumber(剩余字節(jié)數(shù));
(2)從獲取的目的HM_ID由高到低輪詢dequeueInfo,若此HM_ID對應(yīng)的3個優(yōu)先級中的碎片長度不為0,說明上次此隊(duì)列出隊(duì)未出完整,有剩余碎片沒出,將此剩余碎片的長度和remainByteNumber 比較,如果剩余的碎片長度不小于后者,則此HIMAC幀只能容納一個碎片,更新dequeueInfo和dequeueResultFifo,輪詢結(jié)束;若剩余的碎片長度小于后者,則此碎片作為HIMAC幀的頭部EMAC碎片出隊(duì),輪詢完頭部碎片情況,繼續(xù)輪詢完整的EMAC幀情況,由高到低輪詢3個優(yōu)先級的隊(duì)列情況,如果查詢到的EMAC幀大于remainByteNumber,說明此EMAC幀的頭一部分可作為尾部碎片出,直接轉(zhuǎn)到尾部輪詢;若查詢到的EMAC幀小于等于remainByteNumber,說明此EMAC作為HIMAC幀的一部分出隊(duì),繼續(xù)輪詢完整的EMAC幀的隊(duì)列情況。對于滿足要求的EMAC幀,在輪詢過程中,無論碎片還是完整的,將此EMAC幀的相關(guān)信息寫到dequeueResultFifo里面,同時更新dequeueInfo;
(3)輪詢之后,首先判斷是否空幀,如果輪詢之后沒有幀出隊(duì),remainByteNumber保持一個定值不變,滿足這個要求則是空幀。如果是空幀,將結(jié)果寫到SR_FIFO;如果不是空幀,執(zhí)行從出隊(duì)結(jié)果FIFO中讀出的指令。每執(zhí)行一次對應(yīng)一個EMAC幀,每次將EMAC的第一個64 Byte塊的首地址交給緩存管理進(jìn)行查詢,緩存管理返還所有64 Byte塊的首地址和最后一個64 Byte塊有效長度,調(diào)度根據(jù)dequeueResultFifo中記錄的需要這些64 Byte塊的哪些和每個64 Byte塊多少有效數(shù)據(jù)來判斷緩存管理返還的信息哪些是需要的,并把需要的信息寫到sr_fifo里。在所有dequeueResultFifo中的數(shù)據(jù)執(zhí)行完HIMAC幀出隊(duì)過程結(jié)束;
(4)EMAC幀出隊(duì)狀態(tài),將EMAC幀出隊(duì)發(fā)往EMAC端口。將EMAC隊(duì)列號交給隊(duì)列管理,隊(duì)列管理返還第一個64 Byte塊地址和長度信息,調(diào)度將此地址交給緩存區(qū)管理,緩存管理反饋此EMAC幀所有64 Byte塊的首地址和最后一個64 Byte塊的有效長度,調(diào)度將相關(guān)信息寫到SR_FIFO中;
(5)釋放緩存區(qū)狀態(tài),釋放緩存管理里面的內(nèi)存。將第一個64 Byte塊的首地址和釋放請求交給緩存區(qū)管理,緩存管理根據(jù)第一個64 Byte塊的首地址,將這一EMAC的所有64 Byte塊的地址均刪除。
判斷高中低優(yōu)先級中是否存在分片程序如下:
if(dequeueInfo[dequeueDestNodeId_HighPri]!=0) //若高優(yōu)先級隊(duì)列中存在分片, 出隊(duì)分片信息
dequeuefronthigh_pri();
else if(dequeueInfo[dequeueDestNodeId_MidPri]!=0)// 若中優(yōu)先級隊(duì)列中存在分片,出隊(duì)分片信息
dequeuefrontmid_pri();
else if(dequeueInfo[dequeueDestNodeId_LowPri] !=0)// 若低優(yōu)先級隊(duì)列中存在分片,出隊(duì)分片信息
dequeuefrontlow_pri();
else
dequeue_whole_frame();//若三個優(yōu)先級隊(duì)列均未分片,則出隊(duì)整幀
整幀出隊(duì)部分程序如下:
if(Queue_location_address !=0) //若高優(yōu)先級隊(duì)列中有整幀存在,出隊(duì)此幀
dequeue_whole_high_pri(Queue_location_address);
else
{
Queue_location_address=
Queue_location_RAM[dequeueDestNodeId_MidPri]->emac_current_address;//查詢位置記憶ram,得到中優(yōu)先級對列的整幀地址信息
if(Queue_location_address !=0) //若中優(yōu)先級隊(duì)列中有整幀存在,出隊(duì)此幀
dequeue_whole_mid_pri(Queue_location_address);
else
{
Queue_location_address=
Queue_location_RAM[dequeueDestNodeId_LowPri]->EMAC_current_address ;
//查詢位置記憶ram,得到低優(yōu)先級對列的整幀地址信息
if(Queue_location_address !=0) //若低優(yōu)先級隊(duì)列中有整幀存在,出隊(duì)此幀
{
dequeue_whole_low_pri(Queue_location_address);//若低優(yōu)先級隊(duì)列中還有分片,繼續(xù)出分片
}
else
dequeue_tail_frag();//如果3個優(yōu)先級隊(duì)列均沒有整幀,則開始組HIMAC尾部
}
HINOC作為我國擁有自主研發(fā)產(chǎn)權(quán)的新型寬帶技術(shù),具有重要的科研價值。本文介紹了HINOC網(wǎng)絡(luò)、HIMAC的整體工作流程和HIMAC調(diào)度機(jī)制,分別介紹了接受調(diào)度與中心調(diào)度的C語言設(shè)計(jì)思路并展示了部分代碼。C語言優(yōu)秀的硬件結(jié)合能力與高效率的特點(diǎn),可以大幅節(jié)省協(xié)議設(shè)計(jì)調(diào)試階段的工作量。另外,用C語言代替FPGA實(shí)現(xiàn)HIMAC調(diào)度,雖目前目的僅為仿真測試,但為轉(zhuǎn)化成System C等軟硬件結(jié)合語言做了鋪墊。
[1]國家廣播電影電視總局廣播科學(xué)研究院,北京大學(xué),西安電子科技大學(xué).高性能同軸電纜接入網(wǎng)(HINOC)物理層傳輸模式及媒質(zhì)接入控制協(xié)議[M].北京:國家廣播電影電視總局廣播科學(xué)研究院,2010.
[2]歐陽鋒,崔競飛.HINOC技術(shù)概述和進(jìn)展[J].電視技術(shù),2011,35(12):11-13.
[3]龔晨亮,邱智亮.HIMAC協(xié)處理器的調(diào)度方案[J].網(wǎng)絡(luò)新媒體技術(shù),2013,2(5):35-38.
[4]崔金.HiNOC網(wǎng)絡(luò)MAC協(xié)議研究[D].西安:西安電子科技大學(xué),2009.
[5]潘偉濤,邱智亮.一種HIMAC硬件協(xié)處理器的設(shè)計(jì)與FPGA實(shí)現(xiàn)[J].電子器件,2012,35(2):221-226.
[6]馮振威.基于嵌入式平臺的HINOC MAC驅(qū)動程序的設(shè)計(jì)[D].西安:西安電子科技大學(xué),2011.
[7]王煒濤.基于嵌入式平臺的HINOC協(xié)議MAC層軟件設(shè)計(jì)與實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),2011.
[8]張輝,曹麗娜.現(xiàn)代通信原理與技術(shù)[M].3版.西安:西安電子科技大學(xué)出版社,2013.
[9]李建東,盛敏.通信網(wǎng)絡(luò)基礎(chǔ)[M].北京:高等教育出版社,2004.
[10]齊立龍.HINOC網(wǎng)絡(luò)MAC層調(diào)度算法的設(shè)計(jì)與實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),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-),男,碩士研究生。研究方向:網(wǎng)絡(luò)通信等。戴曙光(1957-),男,教授,博士生導(dǎo)師。研究方向:工業(yè)光電檢測技術(shù)與裝置等。
10.16180/j.cnki.issn1007-7820.2016.09.017
TN949.194
A
1007-7820(2016)09-061-04