《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于Nucleus Plus操作系統(tǒng)的多實(shí)例模式的實(shí)現(xiàn)
基于Nucleus Plus操作系統(tǒng)的多實(shí)例模式的實(shí)現(xiàn)
來(lái)源:電子技術(shù)應(yīng)用2012年第9期
陳發(fā)堂,庹 勤
重慶郵電大學(xué) 重慶市移動(dòng)通信技術(shù)重點(diǎn)實(shí)驗(yàn)室,重慶400065
摘要: 在對(duì)TD_LTE射頻一致性測(cè)試儀表的開(kāi)發(fā)中,針對(duì)同時(shí)建立多個(gè)承載的需求,引入了多實(shí)例管理模式。著重介紹了項(xiàng)目協(xié)議棧中基于Nucleus Plus操作系統(tǒng)多實(shí)例模式的實(shí)現(xiàn)機(jī)制。該機(jī)制中包含了系統(tǒng)的內(nèi)存池、隊(duì)列、任務(wù)等組件的初始化,其多實(shí)例管理模塊有效地完成了消息的路由,同時(shí)采用優(yōu)化后的分區(qū)內(nèi)存池對(duì)消息和各實(shí)例數(shù)據(jù)內(nèi)存進(jìn)行分配和釋放,使內(nèi)存分配中產(chǎn)生的內(nèi)碎片降到最低。
中圖分類號(hào): TN929
文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2012)09-0014-04
Implementation of multiple instances mode based on the Nucleus Plus operating system
Chen Fatang,Tuo Qin
Chongqing Key Laboratory of Mobile Communication, Chongqing University of Posts and Telecommunications, Chongqing 400065,China
Abstract: On the basis of the development of TD_LTE radio frequency consistency testing instrument, multiple instances mode is introduced in order to meet the establish of multiple radio bearers at the same time. This paper presents the realization mechanism of multiple instances pattern, which is based on the Nucleus Plus operating system. This mechanism includes system module initialization such as memory pool, queue, task and so on. The design of multiple instances management module accomplishes message routing. The memory of message and instances data are managed by optimized partition memory pool, which minimizes the inner fragment.
Key words : Nucleus Plus;multiple instances;partition memory pool

    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.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。