摘? 要: 從實際工作出發(fā),提出了在SDL中調(diào)用C語言函數(shù)的必要性,并給出了SDL語言中使用C語言數(shù)據(jù)類型、公共變量以及調(diào)用C語言函數(shù)的方法。這種方法具有很強的實用性,大大提高了工作效率,加快了實時多任務系統(tǒng)" title="多任務系統(tǒng)">多任務系統(tǒng)應用軟件的開發(fā)。此方法實際應用于第三代移動通信系統(tǒng)TD-SCDMA" title="TD-SCDMA">TD-SCDMA高層信令" title="信令">信令的開發(fā),收到了良好效果。
關鍵詞: 進程? SDL? 實時多任務系統(tǒng)? TD-SCDMA? C語言函數(shù)? 數(shù)據(jù)類型? 公共變量
?
SDL(Specification and Description Language)是CCITT推薦的規(guī)范描述語言。經(jīng)過ITU-T的發(fā)展和標準化,定義在藍皮書Z.100建議中。1988年推出第一個正式版,以后每四年進行一次增補更新。作為國際標準化的正式語言,用來規(guī)范描述實時系統(tǒng)。目前SDL-2000是SDL最新版本。作為SDL相關技術Z.120建議——消息序列圖MSC(Message Sequence Charts)和Z.105建議——抽象語法符號ASN.1(Abstract Syntax Notation One)和SDL一起形成一個完整的描述語言。本文中介紹的SDL軟件由Telelogic Tau AB公司提供。
在協(xié)議軟件的開發(fā)流程中,SDL應用在系統(tǒng)規(guī)范描述和設計階段。它完全獨立于硬件實現(xiàn)和操作系統(tǒng)。Telelogic Tau公司提供的SDL軟件不僅可以用于規(guī)范描述和設計,它還可以把SDL的描述和設計直接生成標準的C代碼;用戶也可以直接在SDL描述和設計中嵌入C代碼,從而完成部分功能。經(jīng)SDL描述產(chǎn)生的C代碼(包括嵌入的C代碼)可以直接與多種嵌入式(或非嵌入式)實時多任務操作系統(tǒng)(RTOS)集成,如NUCLUES、pSOS、Solaris、Vrtx、OSE等。集成后的代碼可以直接在目標板上運行,從而方便用戶進行協(xié)議軟件的開發(fā)。
雖然SDL軟件具有很強的開發(fā)功能,但是在重慶郵電學院信科公司的TD-SCDMA系統(tǒng)高層信令的二三層開發(fā)中,也遇到了許多問題,主要有:
(1)由于TD-SCDMA系統(tǒng)的高層信令是由幾個部門共同負責的,除了二三層以外還有MMI和物理層控制部分的軟件,不可能將各個部門統(tǒng)一使用SDL軟件共同完成系統(tǒng)的信令開發(fā)工作。每個部門最終提供的應該是標準的C語言源代碼" title="源代碼">源代碼,最后在實時操作系統(tǒng)上集成。利用SDL軟件生成的C源代碼,不便于和其它部分的代碼相互集成。
(2)高層二三層信令是一個很復雜的系統(tǒng),各個進程之間需要大量的數(shù)據(jù)交換,而SDL要求所有進程間的數(shù)據(jù)交流必須通過信號來完成(雖然可以使用SDL的VIEW功能,但使用不方便)。在系統(tǒng)啟動后,很多數(shù)據(jù)需要進行通信,系統(tǒng)資源將被白白浪費在通信上面。
但是SDL的測試功能特別強大,可以從不同角度對SDL描述進行測試,發(fā)現(xiàn)錯誤及時返回進行修改。如果沒有SDL的TTCN測試,所有設計結果在硬件平臺上測試將困難重重,即使可以對硬件平臺運行結果進行跟蹤,也始終沒有TTCN測試結果MSC圖方便。并且SDL可以對系統(tǒng)任何部分獨立測試。在SDL設計結果和RTOS系統(tǒng)集成之前,基本保證了SDL設計階段的正確性,減少了繁瑣的板級代碼調(diào)試,從而可在較短時間內(nèi)將SDL設計結果移植到硬件工作平臺,提高了工作效率。
為了SDL軟件的設計結果既可以被SDL軟件的TTCN測試又可以直接和其它C語言源代碼集成,必須解決一個問題——如何在SDL中調(diào)用C語言函數(shù)。
1 實現(xiàn)模式
SDL內(nèi)核對SDL進程的管理采用了消息驅(qū)動事件的方法,SDL內(nèi)核對SDL進程的調(diào)度是根據(jù)消息隊列中的消息來進行的。如圖1,表明了SDL進程、SDL內(nèi)核和SDL信號隊列的關系。
?
?
SDL圖形描述轉換成C源代碼,沒有系統(tǒng)(system)和功能塊(block)的概念,只有進程和通信,它們由SDL內(nèi)核程序管理和協(xié)調(diào)。在各個進程間沒有全局變量,所有的數(shù)據(jù)交換都要通過信號來傳遞。一個進程要發(fā)送信號到另外一個進程,需要先發(fā)送到SDL信號隊列中等待SDL內(nèi)核程序的處理。
在實時多任務系統(tǒng)的編程中,最關心的是狀態(tài)的劃分和在什么狀態(tài)下收到什么信號以及做何種處理。所以在SDL中,應該利用標準C語言源代碼對數(shù)據(jù)、信號定義并對收到的信號進行處理。要求這部分代碼既能在SDL中進行測試又可以在實時操作系統(tǒng)中使用。
在整個開發(fā)過程中,始終堅持這樣一個原則,利用SDL來劃分通信模塊,在協(xié)議中規(guī)定的原語盡量用信號來傳遞,而非標準的信息則使用公共變量,進程的代碼利用C語言來實現(xiàn);最后利用TTCN進行全面的" title="面的">面的測試。在TD-SCDMA信令設計中證實這種設想可行。圖2就是TD-SCDMA系統(tǒng)部分高層軟件的開發(fā)模式圖。
?
?
在開發(fā)的初始階段,根據(jù)TD-SCDMA系統(tǒng)協(xié)議TSM,考慮將系統(tǒng)劃分成多少個進程,各進程間需要哪些信號及全局變量數(shù)據(jù),然后定義數(shù)據(jù)類型、編寫C語言源代碼。所有C源代碼是按照在什么狀態(tài)下接收什么信號,處理以后發(fā)送什么信號格式來完成。這樣編寫的代碼既可以在RTOS中應用,又可以滿足SDL的要求,方便TTCN的測試。如圖2利用標準C完成的源代碼可以和SDL相互集成,并且進行TTCN測試;同時又可以和RTOS系統(tǒng)集成,在實際硬件環(huán)境中運行。
完成的C語言源代碼,經(jīng)過TTCN測試后,保證了信號處理的正確性。在軟件開發(fā)后期,只需根據(jù)協(xié)議變換作適當?shù)某绦蛐薷暮虲語言源代碼的移植即可。
在SDL的說明文檔中,提到了怎樣將C語言函數(shù)應用于SDL系統(tǒng);但是這種方法經(jīng)過多次實驗效果均不理想,即使能夠?qū)崿F(xiàn)也是受到諸多限制。所以舍棄了SDL提供的方法,最終找到了一種切實可行的方法,方法如3小節(jié)描述。
2 實現(xiàn)過程
C源代碼不能直接在SDL中使用。首先應該利用sdth2sdl.exe軟件將C語言的頭文件轉換成SDL的文本描述(PR描述),如圖3。然后在SDL的Organizer界面中,將文本描述轉換成圖形描述方式,它以SDL的SUN文件形式存在。最后在設計的SDL系統(tǒng)中利用use關鍵字聲明即可。具體如下:
(1)利用sdth2sdl.exe程序轉換C語言頭文件。sdth2sdl.exe是Telelogic Tau AB公司提供的可執(zhí)行文件。在使用該文件時,需要操作系統(tǒng)裝有MSC7.00 或是MSVC++編譯器(不能是Borland C編譯器)。sdth2sdl.exe自動調(diào)用標準C的編譯器,進行C語法檢查,再將C部分代碼轉化成SDL的PR格式。sdth2sdl.exe只檢查頭文件的數(shù)據(jù)類型、數(shù)據(jù)定義以及函數(shù)的聲明。在該過程中,不檢查具體C語言函數(shù)的語法。實際上,C語言函數(shù)不能直接轉換成SDL的圖形描述或文本描述方式。
為了方便使用sdth2sdl工具,sdth2sdl是一個可以帶參數(shù)的DOS程序,格式為:
sdth2sdl? [參數(shù)選項]? 要轉換的C語言頭文件
它的參數(shù)選項如表1。在實際應用中,最常用的參數(shù)選項有n、s、I三個參數(shù)選項。
(2)將SDL的PR文件轉換成GR方式。利用SDTH2SDL
程序生成一個以PR為擴展名的SDL Package文件。在SDL的Organizer界面的Generate菜單中有“Convert to GR ...”選項,利用SDL的Convert to GR對話框完成PR文件到GR格式的轉換。生成的SDL Package文件的名字是SDL PR描述內(nèi)部指定的名字。
(3)在SDL系統(tǒng)中聲明。在SDL進程中,不能直接使用C語言的數(shù)據(jù)類型、變量定義和函數(shù),上面生成的是SDL Package文件,需要在system中利用SDL關鍵字use加以聲明。格式為use package文件名。
這樣可以在SDL進程中任意使用C語言頭文件的函數(shù)、數(shù)據(jù)類型及變量。雖然這些定義在SDL中都可以使用,但是它們還必須遵守SDL調(diào)用C變量和函數(shù)的規(guī)則。
①變量調(diào)用
由于SDL可以調(diào)用C語言函數(shù),基本上系統(tǒng)所有的處理由C語言函數(shù)來完成。所以在SDL和C源代碼所用的公共變量很少,僅僅只有一些SDL專用的數(shù)據(jù),例如控制SDL的分支等。調(diào)用格式為:
變量賦值: Call Set_變量名
去變量值: Call Get_變量名
?、跀?shù)據(jù)類型引用
雖然整個系統(tǒng)的任務在C源代碼中完成,但是在進行信號處理時,SDL需要保存信號到變量中(SDL描述要求),信號類型在C語言中定義。C語言數(shù)據(jù)類型轉換成SDL數(shù)據(jù)類型時,保持了原來的數(shù)據(jù)類型名字,在SDL中只要按照SDL規(guī)則定義數(shù)據(jù)即可。
?、酆瘮?shù)調(diào)用
C語言函數(shù)的調(diào)用和變量調(diào)用、數(shù)據(jù)類型引用基本相同,需要注意的是函數(shù)的參數(shù)。
調(diào)用格式: Call 函數(shù)名字(函數(shù)需要的實參)
由于C語言編寫的C函數(shù)中可以使用全局變量,大大方便了C語言在SDL中的應用,需要處理的公共數(shù)據(jù)可以不以SDL信號方式進行傳遞。例如在TD-SCDMA高層信令的設計中,小區(qū)信息以及系統(tǒng)消息是很多進程都需要使用的,就可以作為全局變量使用。
3 舉例說明
下面的例子是在空閑狀態(tài)下收到來自物理層的測量報告IdleNcellMeasInd信號和發(fā)送到物理層進行小區(qū)BSIC解讀的BsicDecodeReq請求信號。將分以下幾個步驟來說明:
(1) C語言頭文件trr.h的編寫
所有在SDL中調(diào)用到的數(shù)據(jù)類型、全局變量和函數(shù)必須在C語言頭文件中聲明,只有聲明過的才能在SDL中調(diào)用或引用。在頭文件中可以使用任何標準C語法。在下面的頭文件中,由于篇幅關系,沒有給出詳細的下級數(shù)據(jù)類型的定義。
#ifndef __TRR__
#define __TRR__
typedef struct MessageHeader
}
??????????? int? header; ?? /*實時操作系統(tǒng)的數(shù)據(jù)頭,不同的RTOS的T_MsgHeaher定義不相同*/
{ T_MessageHeader;
typedef struct t_IdleNcellMeasIndTag
}
??????????? int? numMeas;??? ????????????????? /*鄰近小區(qū)數(shù)*/
??????????? NcellList? ncellList;??? ????????? /*鄰近小區(qū)標識表*/
??????????? int rscpLevelList[MAX_NCELL]; ???? /*鄰近小區(qū)功率測量結果*/
{ T_IdleNcellMeasInd;
typedef struct h_t_IdleNcellMeasInd
}
??????????? T_MessageHeader signalHeader;?? /*實時多任務系統(tǒng)頭標識*/
??????????? T_IdleNcellMeasInd IdleNcellMeasInd;? /*鄰近小區(qū)測量數(shù)據(jù)*/
{ H_T_IdleNcellMeasInd;
typedef struct t_BsicDecodeReqTag
}
??????????? NcellNccDecode? ncc;??? ?? /*鄰近小區(qū)BSIC數(shù)據(jù)*/
{T_BsicDecodeReq;
typedef struct h_t_BsicDecodeReq
}
??????????? T_MsgHeader ????? signalHeader;
??????????? T_BsicDecodeReq?? BsicDecodeReq;
{ H_T_BsicDecodeReq;
extern H_T_IdleNcellMeasInd? s_trr_IdleNcellMeasInd;?
??????????????????????????????????????????????????????? /*接收處理的變量*/
extern H_T_BsicDecodeReq??? s_trr_BsicDecodeReq;
? ???????????????????????????????????????????????????? /*需要發(fā)送的變量*/
int trr03_01IdleNcellMeasInd(H_T_IdleNcellMeasInd *p);
???????????????????????????????????????????????? /*收到測量的處理程序*/
/*#include ″trr.c″*/
#endif
在trr.h中,使用sdth2sdl時應該將#include “trr.c”屏蔽,不需要將trr.c文件編譯和轉換成SDL的文本描述。但在生成SDL的TTCN或Simulator、Validator的可執(zhí)行文件時,需要將C語言屏蔽符/* */去掉。這樣在生成可執(zhí)行文件時,SDL將trr.c定義的內(nèi)容和SDL描述直接匯合編譯連接在一起。
(2) C語言函數(shù)trr.c的編寫
在C語言頭文件中聲明的全局變量和函數(shù)實體都是在C源代碼中定義的。在trr.c文件中定義s_trr_IdleNcellMeasInd、s_trr_BsicDecodeReq全局變量和int trr03_01IdleNcellMeasInd()函數(shù)。C語言函數(shù)不直接轉換成SDL描述,可以支持標準C語言的所有使用方法。
#include “trr.h”
H_T_IdleNcellMeasInd s_trr_IdleNcellMeasInd;
?????? ????????????????????????????????? /*定義接收信號的變量*/
H_T_BsicDecodeReq? s_trr_BsicDecodeReq;
? ?????????????????????????????????????? /*定義發(fā)送信號的變量*/
int trr03_01IdleNcellMeasInd(H_T_IdleNcellMeasInd *p)
}
???? ?? int tempCount;
?????? int rscp[MAX_NCELL];
?????? s_trr_BsicDecodeReq.signalHeader= p->signalHeader;
?????? rscp[tempCount] = p-> IdleNcellMeasInd. RscpLev-
???????????? elList[tempCount]; ????????????????? /*保存測量*/
?????? s_trr_BsicDecodeReq.BsicDecodeReq.ncc.numMeas=10;
for(tempCount=0;tempCount } ???????? s_trr_BsicDecodeReq.BsicDecodeReq.ncc.frequency ???????????????????? NUM_NCELLS]=tempCount; ???????? s_trr_BsicDecodeReq. BsicDecodeReq.ncc.syncCode ???? ????????????? [NUM_NCELLS]=tempCount; ???????? s_trr_BsicDecodeReq. BsicDecodeReq.ncc.syncDiff ???????????????????? [NUM_NCELLS]=tempCount; { return TRR_IDL;? /* # define TRR_IDL 1*/ {? /*函數(shù)的返回值表明是否需要發(fā)送BsicDecodeReq信號*/ 在該例子中,函數(shù)返回值決定了是否需要發(fā)送BsicDecodeReq信號到物理層。利用這種方法可以確定SDL描述的分支處理。 (3) sdth2sdl的使用 編寫完成trr.h文件后,就可以將trr.h文件轉換成SDL的文本描述,在DOS系統(tǒng)提示符下執(zhí)行下列命令: sdth2sdl -n trr -s c:td_scdmaprtsm_trr.pr -o ″-Ic:bc5include -Ic:tdscdmatrrinclude″ trr.h 在編譯過程中,如果C語言源代碼編寫不正確,將有錯誤提示。必須根據(jù)提示修正所有的錯誤(每個頭文件的最后一行必須是空行),直到生成正確的tsm_rr.pr文件。在tsm_rr.pr文件中指明了SDL package的名字為trr。最后利用SDL Organizer的PR轉換到GR工具,生成trr.sun文件。 (4) SDL進程的調(diào)用 C語言在SDL中應用最終在進程中實現(xiàn)。根據(jù)SDL的要求,接收信號必須先保存到一個變量中,例如收到IdleNcellMeasInd信號必須先保存在tempReceiveSignal變量中;然后調(diào)用trr03_01IdleNcellMeasInd()來處理該信號,并在該處理過程中產(chǎn)生BsicDecodeReq信號的內(nèi)容s_trr_BsicDecodeReq,由SDL發(fā)送出去。如圖4。 ? ? 在實時多任務系統(tǒng)中,為了提高系統(tǒng)的工作效率,常常用傳遞指針的方式傳遞信號,所以在上例中int trr03_01IdleNcellMeasInd()的形參是一個C語言指針的形式。在C語言轉換成SDL時,雖然可以將數(shù)據(jù)類型轉換成SDL的數(shù)據(jù)類型格式,但是在SDL中不便直接定義指針,所以將接收的信號定義成一個與函數(shù)形參相同的數(shù)據(jù)類型變量,利用SDL的“&”取地址符號,將變量轉換成指針使用。在該例中,Call trr03_01IdleNcellMeasInd(&tempReceiveSignal)。其它請參考圖4。 并不是所有的設計代碼都可以由C語言來完成,SDL信號的發(fā)送和接收機制、時鐘處理只能由SDL自己處理。其實這部分對不同的RTOS系統(tǒng)是不相同的,所以必須利用C語言的預編譯開關將它們分開,對不同系統(tǒng)作不同的編寫。 這種利用SDL調(diào)用C語言函數(shù)進行通信軟件的開發(fā)是根據(jù)實際工作需要提出的,雖然不能保證是最好的方法,但是經(jīng)過長期的研究和探索,在實際中的應用充分表明了這種方法是切實可行的。TD-SCDMA系統(tǒng)的高層信令二三層就是利用這種方法完成的。 ? 參考文獻 1 Telelogic tau AB.Telelogic tauTM SDL suite 4.0 Getting Started. 2001 2 Telelogic tau AB.Telelogic tauTM SDL suite 4.0 Methodology Guidelines.2001 3 CWTS.TSM 04.08 Mobile radio interface layer 3 specification. V2.2.0.2002 4 Nucleus company.Nucleus PLUS internals.Accelerated Technology.2000, 0001027-001 Rev 101 5 Nucleus company.Nucleus PLUS Reference Manual. 2000,?0001026-001 Rev.102 6 Nucleus company.ARM Developer Suite Nucleus Target?Specific Notes.2000, 0001000-001 Rev.108