文獻(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.