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