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