文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2012)09-0014-04
TD_LTE技術(shù)標(biāo)準(zhǔn)從確定至今發(fā)展十分迅速,。根據(jù)TD產(chǎn)業(yè)聯(lián)盟信息,,TD_LTE產(chǎn)業(yè)鏈的發(fā)展得到了全球主流研發(fā)制造廠商的積極參與,而測試又是關(guān)系未來商用的關(guān)鍵點(diǎn),。其中測試儀表對測試結(jié)果的準(zhǔn)確性和可信度影響很大,,因此急需對測試儀在測試標(biāo)準(zhǔn)化、測試儀表的功能和性能等方面對測試儀進(jìn)行改進(jìn)[1],。
本文在對TD_LTE射頻一致性測試儀表的開發(fā)中,,需要建立多個承載來滿足同時發(fā)起的業(yè)務(wù),因此引入了多實(shí)例模式,。而如何保證消息正確到達(dá)對應(yīng)的實(shí)例,,解決各實(shí)例消息和數(shù)據(jù)的內(nèi)存區(qū)的分配和釋放是關(guān)鍵。在本設(shè)計過程中,,結(jié)合了Nucleus Plus操作系統(tǒng)提供的內(nèi)存池,、隊列、任務(wù)等組件功能,,有效地解決了測試儀表中多實(shí)例模式的實(shí)現(xiàn)問題,。
1 多實(shí)例模式
TD_LTE射頻一致性測試儀表是依據(jù)3GPP標(biāo)準(zhǔn)、TD_LTE國家行業(yè)標(biāo)準(zhǔn)開發(fā)的TD_LTE基站和終端的測試儀表,。在TD_LTE終端協(xié)議棧中,,無線承載用于接入層向上提供的服務(wù),包括了用于承載控制面信令的信令無線承載(SRB)和用于承載用戶面的數(shù)據(jù)業(yè)務(wù)的數(shù)據(jù)無線承載(DRB),。而默認(rèn)承載和專用承載是非接入層向上提供的服務(wù),,以滿足不同業(yè)務(wù)的QoS,。在實(shí)際測試中,,可能同時激活建立多個承載去滿足不同的業(yè)務(wù)。非接入層與接入層承載的映射是根據(jù)承載建立情況動態(tài)配置的,,并且是一一映射的關(guān)系,。在設(shè)計過程中,建立的承載每個對應(yīng)一個激活的實(shí)例,,每個實(shí)例通過分配的唯一標(biāo)識進(jìn)行區(qū)分,。根據(jù)LTE協(xié)議規(guī)范,,在整個協(xié)議棧中同時存在多個實(shí)例的有ESM、RLC和PDCP三個子層[2],。
2 Nucleus Plus
Nucleus Plus是美國源代碼操作系統(tǒng)商ATI公司推出的嵌入式系統(tǒng),,以其實(shí)時響應(yīng)、搶先,、多任務(wù)以及源代碼開放特性獲得在通信,、國防、自動化控制,、智能家電等領(lǐng)域的廣泛應(yīng)用,。同時Nucleus Plus初始化過程中提供的Application_Initialize是對用戶開放的子程序,用戶可以根據(jù)自己的需要在其中初始化Nucleus Plus提供的組件,,如任務(wù),、內(nèi)存池、隊列等[3],。系統(tǒng)為協(xié)議棧每個子層設(shè)置一個對應(yīng)的任務(wù),,并為每個任務(wù)分配了一個優(yōu)先級,數(shù)值范圍從0~255對應(yīng)由高到低的256個優(yōu)先級別,。同時也為每個任務(wù)分配一個隊列,,隊列是Nucleus Plus中承載消息的載體之一。隊列提供了傳輸多個消息的機(jī)制,,消息以數(shù)值形式發(fā)送和接收,。發(fā)送消息時要求將消息拷貝進(jìn)隊列;接收消息時要求將消息從隊列拷貝出消息,。而內(nèi)存池組件又提供了分區(qū)內(nèi)存池分配和動態(tài)內(nèi)存池分配兩大類,,為用戶提供了靈活的內(nèi)存管理模塊。
3 多實(shí)例模式實(shí)現(xiàn)方案
3.1 初始化模塊
(1)在Application_Initialize中首先完成內(nèi)存池組件的初始化,。在系統(tǒng)設(shè)計時,,共創(chuàng)建了5個分區(qū)內(nèi)存池和2個動態(tài)內(nèi)存池。動態(tài)內(nèi)存池用于系統(tǒng)任務(wù)堆棧和隊列的創(chuàng)建內(nèi)存分配,。分區(qū)內(nèi)存池用于消息,、各實(shí)例數(shù)據(jù)等存儲區(qū)的內(nèi)存分配,本文即著重介紹了對分區(qū)內(nèi)存池的初始化進(jìn)行,。
Nucleus系統(tǒng)低級初始化中,,由系統(tǒng)堆棧之后分配一個可用內(nèi)存,用于分區(qū)內(nèi)存池的第一個可用地址,;然后把連續(xù)的大塊內(nèi)存按分區(qū)池進(jìn)行管理,,每個池中包含整數(shù)大小相同的小分區(qū),但不同池之間的分區(qū)大小不同。根據(jù)實(shí)際需要,,定義了不同密度的小分區(qū),,分別為52 B、140 B,、352 B,、2 000 B、60 000 B,。每個池都分配一個PM_PCB(分區(qū)池控制塊)和一個分區(qū)的內(nèi)存區(qū)指針,。PM_PCB中包含了每個分區(qū)池的詳細(xì)信息包括:分區(qū)內(nèi)存池的名稱、起始池地址,、總分區(qū)大小,、分區(qū)大小、分區(qū)中第1個可用地址等,。每個小分區(qū)都有一個占8 B的頭,,包含2個地址(下一個可用的分區(qū)地址和分區(qū)池地址)。分區(qū)池之間通過一個雙向鏈表進(jìn)行鏈接,,而池中單個分區(qū)通過單向鏈表進(jìn)行鏈接,,如圖1所示。在動態(tài)申請內(nèi)存時,,系統(tǒng)首先進(jìn)行判斷,,根據(jù)申請內(nèi)存的大小選擇一個與其大小最接近的分區(qū),然后在相應(yīng)的分區(qū)池中劃去第1個可用地址對應(yīng)的小分區(qū),。將劃分出的分區(qū)中的下一個可用分區(qū)地址置為NULL,,同時更改PM_PCB中相應(yīng)的消息,例如下一個可用分區(qū)地址,、可用分區(qū)數(shù)等,。釋放內(nèi)存時根據(jù)該小分區(qū)中保存的分區(qū)池地址,將其放回它以前所屬的分區(qū)池,,并作為第一個可用分區(qū)地址,。采用這種方式能有效解決碎片問題,同時執(zhí)行時間是固定的[4],。
(2)任務(wù)和隊列的創(chuàng)建:與分區(qū)池的原理類似,。系統(tǒng)為相應(yīng)的任務(wù)和隊列分別分配一個TCB(任務(wù)控制塊)和QCB(隊列控制塊),并且各任務(wù)之間和各個隊列之間都通過動態(tài)的雙向鏈表進(jìn)行鏈接,。每個TCB中包含了任務(wù)優(yōu)先級,、任務(wù)狀態(tài)、任務(wù)處理函數(shù)入口地址等相關(guān)信息,。QCB包含了隊列的最大消息數(shù),、消息起始地址,、消息的結(jié)束地址等信息,。接著對存在多實(shí)例模式的三個子層進(jìn)行初始化,,將三個子層分別定義為一個多實(shí)例進(jìn)程,并為其分配一個唯一進(jìn)程標(biāo)識(processID),,同時定義可能存在的最大實(shí)例數(shù),。每個進(jìn)程和各實(shí)例的信息采用結(jié)構(gòu)體數(shù)組的形式,初始信息包括每個進(jìn)程的狀態(tài)機(jī)入口函數(shù),、各實(shí)例的初始狀態(tài)等,。
至此,與多實(shí)例相關(guān)的初始化已完成,,系統(tǒng)其他組件初始化這里不再敘述,。初始化完成之后,就進(jìn)入Nucleus操作系統(tǒng)的主控程序調(diào)度,。
3.2 多實(shí)例管理模塊
協(xié)議棧層間原語通信是通過Nucleus系統(tǒng)隊列來實(shí)現(xiàn)的,。一旦主控程序檢測到某層任務(wù)被激活,系統(tǒng)將從任務(wù)棧中取出當(dāng)前任務(wù)所包含的所有控制信息并跳轉(zhuǎn)至任務(wù)處理函數(shù),。在任務(wù)處理函數(shù)中,,處理函數(shù)將從相應(yīng)的任務(wù)隊列中取出消息。協(xié)議棧的開發(fā)也是基于有限狀態(tài)機(jī)的思想,,每收到一條消息,,就要進(jìn)行消息處理。對于多實(shí)例模式,,要進(jìn)行消息的處理,,就必須知道該消息所屬實(shí)例的狀態(tài)、該狀態(tài)下對應(yīng)著這條消息的處理函數(shù)以及處理結(jié)束后躍遷到的狀態(tài)[5-6],。因此,,在前期開發(fā)中定義了每個子層的狀態(tài)和接口原語,并為每條原語分配一個信令標(biāo)識(signlingID),,同時每個狀態(tài)對應(yīng)一個消息分組,。為保證消息傳遞到對應(yīng)的進(jìn)程實(shí)例中,為三個多實(shí)例模式的子層設(shè)計了一個多實(shí)例管理模塊,,圖2為該模塊的處理流程,。從隊列取出消息后,先從消息頭中獲得實(shí)例號InstID,,將其作為入口函數(shù)的參數(shù)之一,;然后調(diào)用多實(shí)例處理函數(shù)。在函數(shù)內(nèi)部,,首先對入口函數(shù)中相應(yīng)的InstID和processID進(jìn)行有效性判斷,,對于錯誤的InstID和processID直接轉(zhuǎn)入消息內(nèi)存釋放分支,,并返回多實(shí)例處理不正常的標(biāo)識。反之,,通過有效的processID獲得相應(yīng)進(jìn)程的狀態(tài)入口函數(shù),,有效的InstID獲得相應(yīng)的實(shí)例狀態(tài)地址,接著轉(zhuǎn)入狀態(tài)機(jī)處理函數(shù)分支,;最后對調(diào)用函數(shù)返回的狀態(tài)機(jī)處理標(biāo)識進(jìn)行判斷,,對于正常標(biāo)志,返回多實(shí)例處理正常的標(biāo)識,,否則返回多實(shí)例處理不正常的標(biāo)識,。這樣通過返回的處理流程標(biāo)志,可容易地檢測和定位出錯的位置,。
3.3 狀態(tài)機(jī)處理模塊
以PDCP子層為例說明狀態(tài)機(jī)處理模塊的實(shí)現(xiàn)流程,。如圖3所示,通過對入口函數(shù)中攜帶的狀態(tài)進(jìn)行有效性驗證,,如果沒有找到匹配的狀態(tài)就對該消息所占內(nèi)存進(jìn)行釋放,;反之,在匹配的狀態(tài)下通過消息頭指針獲得消息的signalID,。同樣對signalID進(jìn)行判斷,,如果是無效消息標(biāo)識,則轉(zhuǎn)入釋放消息內(nèi)存分支,,并向多實(shí)例模塊返回狀態(tài)機(jī)處理不正常的標(biāo)識,;否則將消息轉(zhuǎn)入相應(yīng)的消息處理函數(shù)。在消息處理函數(shù)中,,各實(shí)例所用的數(shù)據(jù)緩存都通過分區(qū)內(nèi)存池進(jìn)行申請,,再由分區(qū)池對其內(nèi)存進(jìn)行統(tǒng)一分配和釋放。消息處理完之后,,返回當(dāng)前實(shí)例的狀態(tài)賦給入口函數(shù)中的狀態(tài)指針,,通過實(shí)例狀態(tài)指針的地址對其狀態(tài)進(jìn)行更新。同樣,,正常流程處理完之后,,對消息所占內(nèi)存進(jìn)行釋放,以免發(fā)生內(nèi)存泄露,。最后向多實(shí)例模塊返回狀態(tài)機(jī)處理正常的標(biāo)識,。
3.4 多實(shí)例模式實(shí)現(xiàn)流程
在Nucleus操作系統(tǒng)完成所有與目標(biāo)硬件相關(guān)的低級初始化和相關(guān)組件的高級初始化子程序后,調(diào)用對用戶開放的子程序Application_Initialize模塊,。在其中完成分區(qū)內(nèi)存池和動態(tài)內(nèi)存池的分配,、為每個子層創(chuàng)建隊列和任務(wù)、三個多實(shí)例子層的相關(guān)信息的初始化以及其他系統(tǒng)組件的初始化,。Application_Initialize完成后,,Nucleus的初始化完畢,,開始進(jìn)入主控調(diào)度程序TCT_Schedule,圖4所示為多實(shí)例模式實(shí)現(xiàn)流程,。 Nucleus主控程序采用等待檢測機(jī)制,,不斷循環(huán)檢測當(dāng)前執(zhí)行任務(wù)[7]。當(dāng)向某個多實(shí)例子層的隊列發(fā)送消息時,,將激活掛起在此隊列的任務(wù),。一旦主控程序檢測到某個多實(shí)例子層任務(wù)被激活,,則轉(zhuǎn)入相應(yīng)子層的任務(wù)處理函數(shù),。在任務(wù)處理函數(shù)中,處理函數(shù)將從相應(yīng)的任務(wù)隊列中取出消息,,然后將消息遞交給多實(shí)例管理模塊,,通過一些異常情況的檢測后,調(diào)用相應(yīng)多實(shí)例進(jìn)程的狀態(tài)機(jī)處理函數(shù),。在狀態(tài)機(jī)處理函數(shù)中將消息遞交給當(dāng)前實(shí)例狀態(tài)下的消息處理函數(shù),。在實(shí)現(xiàn)過程中,為了避免內(nèi)存泄露,,每次處理完消息之后都及時回收所占內(nèi)存,。同樣如果要釋放某個承載,對應(yīng)的實(shí)例中所開辟的數(shù)據(jù)存儲區(qū)也要進(jìn)行釋放,,釋放后的內(nèi)存可被再次使用,。處理完某個隊列的消息后,又將此隊列的任務(wù)掛起,,并返回系統(tǒng)的循環(huán)檢測控制塊中,。
本文給出了項目協(xié)議棧中基于Nucleus操作系統(tǒng)的多實(shí)例模式實(shí)現(xiàn)機(jī)制。Nucleus為用戶提供了靈活的內(nèi)存管理機(jī)制,,通過自定義池的大小和不同密度的分區(qū)大小,,以滿足不同內(nèi)存的需要。同時增加了一個判斷模塊,,將申請任務(wù)指定到適應(yīng)它的最小分區(qū),,從而有效地減小了分區(qū)內(nèi)碎片問題。本文設(shè)計的多實(shí)例管理模塊,,能完成異常情況的處理,,保證消息順利到達(dá)相應(yīng)進(jìn)程的狀態(tài)機(jī)處理函數(shù)。結(jié)合Nucleus提供的其他任務(wù),、隊列等組件功能,,該設(shè)計方案能實(shí)現(xiàn)多實(shí)例模式的功能。
參考文獻(xiàn)
[1] 蔣遠(yuǎn).移動通信新技術(shù)—LTE快速發(fā)展[J].電信工程技術(shù)與標(biāo)準(zhǔn)化,,2011,,24(9):1-4.
[2] 沈嘉.3GPP長期演進(jìn)(LTE)技術(shù)原理與系統(tǒng)設(shè)計[M].北京:人民郵電出版社,,2008.
[3] 管武.基于ARM的嵌入式測控平臺的設(shè)計及實(shí)現(xiàn)[D].上海:上海大學(xué),2008.
[4] 左利云,,吳良海.基于內(nèi)存管理的多重查詢調(diào)度算法[J].計算機(jī)研究與發(fā)展,,2010,20(7):121-124.
[5] 李小文,,陳賢亮.TD-SCDMA第三代移動通信系統(tǒng),、信令及實(shí)現(xiàn)[M].北京:人民郵電出版社,2003.
[6] 宋茂強(qiáng).通信軟件設(shè)計基礎(chǔ)(第2版)[M].北京:北京郵電大學(xué)出版社,,2008.
[7] 魏振華.嵌入式實(shí)時操作系統(tǒng)Nucleus中線程控制部件的實(shí)現(xiàn)方法[J].計算機(jī)應(yīng)用研究,,2003,20(4):97-99.