《基于OPNET的通信網(wǎng)仿真》課件-第五章 進(jìn)程域編程_第1頁
《基于OPNET的通信網(wǎng)仿真》課件-第五章 進(jìn)程域編程_第2頁
《基于OPNET的通信網(wǎng)仿真》課件-第五章 進(jìn)程域編程_第3頁
《基于OPNET的通信網(wǎng)仿真》課件-第五章 進(jìn)程域編程_第4頁
《基于OPNET的通信網(wǎng)仿真》課件-第五章 進(jìn)程域編程_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第五章進(jìn)程域編程5.1

ProtoC編程方法5.2

多進(jìn)程與多隊(duì)列

在OPNET中,仿真的行為和過程是通過代碼實(shí)現(xiàn)的,而代碼的編寫是在進(jìn)程域中完成的。為了提高進(jìn)程域建模效率,OPNET提供了有限狀態(tài)機(jī)的編程架構(gòu)和支持編程的核心函數(shù)庫,構(gòu)成了ProtoC編程方法。同時(shí),OPNET提供了多進(jìn)程、多隊(duì)列的機(jī)制。在進(jìn)程域中,通過對(duì)進(jìn)程/隊(duì)列模型的編程,可實(shí)現(xiàn)動(dòng)態(tài)進(jìn)程和子隊(duì)列。5.1

ProtoC編程方法

ProtoC由有限狀態(tài)機(jī)、OPNET核心函數(shù)、標(biāo)準(zhǔn)的C/C++構(gòu)成,是一種高效描述離散事件系統(tǒng)行為的方法。一有限狀態(tài)機(jī)

有限狀態(tài)機(jī)(FiniteStateMachine,FSM)是由狀態(tài)和轉(zhuǎn)移構(gòu)成的。所謂狀態(tài),是由單個(gè)或多個(gè)完成一個(gè)任務(wù)的進(jìn)程所構(gòu)成的進(jìn)程載體,其可以處理事件或等待事件的觸發(fā)。而轉(zhuǎn)移表征狀態(tài)之間的關(guān)系。當(dāng)收到中斷請(qǐng)求后,進(jìn)程將根據(jù)狀態(tài)轉(zhuǎn)移條件發(fā)生狀態(tài)的轉(zhuǎn)移。1)狀態(tài)狀態(tài)由入口代碼和出口代碼組成:入口代碼模擬進(jìn)入狀態(tài)時(shí)所進(jìn)行的動(dòng)作;出口代碼模擬離開進(jìn)程時(shí)狀態(tài)所進(jìn)行的動(dòng)作。ProtoC的狀態(tài)按是否阻塞,可分為強(qiáng)制狀態(tài)和非強(qiáng)制狀態(tài);按是否進(jìn)程的首個(gè)狀態(tài)可分為初始狀態(tài)和非初始狀態(tài)。非強(qiáng)制狀態(tài):每執(zhí)行完入口代碼后(仿真系統(tǒng)保存進(jìn)程相關(guān)信息),非強(qiáng)制狀態(tài)處于阻塞狀態(tài),等待新的激活。

強(qiáng)制狀態(tài):系統(tǒng)執(zhí)行完強(qiáng)制狀態(tài)的入口代碼后就直接執(zhí)行出口代碼;執(zhí)行完出口代碼后,直接進(jìn)入到條件轉(zhuǎn)移的下一個(gè)狀態(tài)。初始狀態(tài):是第一次調(diào)用進(jìn)程的狀態(tài)

進(jìn)程的初始化可以由初始中斷(在進(jìn)程接口中的begsimintrpt屬性中設(shè)置)引發(fā);也可以由其他中斷引發(fā),如由數(shù)據(jù)包到達(dá)引起的流中斷引發(fā)。如,由數(shù)據(jù)包到達(dá)引起的流中斷引發(fā)。

初始狀態(tài)的強(qiáng)制類型和初始化過程的中斷方式在建模中相互結(jié)合,形成四種邏輯關(guān)系:初始狀態(tài)為強(qiáng)制狀態(tài),初始中斷啟用

初始狀態(tài)為強(qiáng)制狀態(tài),初始中斷未啟用初始狀態(tài)為非強(qiáng)制狀態(tài),初始中斷啟用初始狀態(tài)為非強(qiáng)制狀態(tài),初始中斷未啟用2)轉(zhuǎn)移

轉(zhuǎn)移描述從一個(gè)狀態(tài)到另一個(gè)狀態(tài)的過程和條件,其由源狀態(tài)、目的狀態(tài)、轉(zhuǎn)移條件和轉(zhuǎn)移執(zhí)行代碼四個(gè)組件組成。在源狀態(tài)的轉(zhuǎn)移條件滿足時(shí),將發(fā)生狀態(tài)轉(zhuǎn)移,運(yùn)行轉(zhuǎn)移執(zhí)行代碼并轉(zhuǎn)移到目的狀態(tài)。

一個(gè)原狀態(tài)可以連接多條狀態(tài)轉(zhuǎn)移線,但相互之間必須是互斥的和互補(bǔ)的——在轉(zhuǎn)移時(shí)刻僅能有一條狀態(tài)轉(zhuǎn)移線滿足條件,否則將出現(xiàn)多個(gè)轉(zhuǎn)移方向,在仿真運(yùn)行中將發(fā)生異常;同時(shí),必須能夠找到滿足條件的狀態(tài)轉(zhuǎn)移線,否則將不能轉(zhuǎn)出,也將發(fā)生異常。用戶在有限狀態(tài)機(jī)建模中,需認(rèn)真驗(yàn)證轉(zhuǎn)移互斥和互補(bǔ)關(guān)系。為了防止不能轉(zhuǎn)出,經(jīng)常采用建立缺省狀態(tài)轉(zhuǎn)移線的方法(將轉(zhuǎn)移條件設(shè)置為“default”)——在其他轉(zhuǎn)移條件都不滿足時(shí),按缺省狀態(tài)轉(zhuǎn)移線方向轉(zhuǎn)移到目的狀態(tài)。二文件結(jié)構(gòu)

ProtoC代碼本質(zhì)上是C代碼,除由有限狀態(tài)機(jī)的圖形結(jié)構(gòu)和狀態(tài)的入口、出口代碼生成外,還必須包含狀態(tài)變量和臨時(shí)變量的定義。根據(jù)編程需要,還可編寫頭塊、函數(shù)塊和外部文件等文件類型的代碼。頭塊:相當(dāng)于C語言中的頭文件,通常用于文件包含、函數(shù)聲明、全局變量的定義、轉(zhuǎn)移條件及常數(shù)的宏定義等函數(shù)塊:為在頭塊中聲明的函數(shù)進(jìn)行具體的定義。所定義的函數(shù)可作為轉(zhuǎn)移執(zhí)行代碼,也可用于狀態(tài)的代碼中。外部文件:函數(shù)定義和全局變量定義除了放在頭塊,還可放在進(jìn)程模型的外部文件中。三進(jìn)程中的變量

ProtoC支持狀態(tài)變量、臨時(shí)變量和全局變量三種變量類型。狀態(tài)變量(statevariable,SV):是在進(jìn)程模型的同一對(duì)象中,被所有的狀態(tài)所共有的變量類型。其作用域?yàn)闉檫M(jìn)程模型的對(duì)象,即進(jìn)程的一個(gè)實(shí)例。臨時(shí)變量(temporaryvariable,TV):不同于狀態(tài)變量,臨時(shí)變量是動(dòng)態(tài)存貯,其變量值在進(jìn)程阻塞和激活的過程中將不會(huì)被保留。

全局變量:為不同的模塊、不同類型的多個(gè)進(jìn)程存儲(chǔ)共同信息。其用法與C\C++中的全局變量是一致的,只是數(shù)據(jù)類型做了擴(kuò)展(可以是C預(yù)先定義或用戶定義的數(shù)據(jù)類型,也可以是OPNET預(yù)先定義的數(shù)據(jù)類型)。需要注意的是,定義全局變量的進(jìn)程不能對(duì)象化為多個(gè)實(shí)例。否則,由于每個(gè)實(shí)例對(duì)象的模型是相同的(具有相同的頭文件),將出現(xiàn)重復(fù)定義全局變量的錯(cuò)誤。

建模中的解決方法參看教材

四核心函數(shù)

在OPNET中,核心函數(shù)(KernelProcedure,KP)是仿真建模的應(yīng)用編程接口(ApplicationProgramInterface,API),可被進(jìn)程模型、收/發(fā)信機(jī)管道階段以及C/C++函數(shù)調(diào)用??砂雌涔δ軐?duì)核心函數(shù)進(jìn)行分類,將每一類函數(shù)視為核心函數(shù)的一個(gè)子集(將全部核心函數(shù)視為一個(gè)集合),如數(shù)據(jù)包子集、分布子集等。子集內(nèi)的核心函數(shù)根據(jù)其具體實(shí)現(xiàn)的功能,又可以被進(jìn)一步地分類。例如,數(shù)據(jù)包子集又被分為包的創(chuàng)建、傳輸、銷毀等子子集。在OPNET中,核心函數(shù)的的一般命名形式為:op_函數(shù)子集名_函數(shù)功能()。以包子集的op_pk_create()為例,第一字段“op”表示該函數(shù)為一個(gè)核心函數(shù),第二字段表示該函數(shù)屬于包子集,第三字段表示該函數(shù)的函數(shù)功能(對(duì)應(yīng)于子子集)是創(chuàng)建數(shù)據(jù)包。在OPNET中包含如下核心函數(shù)的子集:動(dòng)畫(animation)分布(distribution)外部系統(tǒng)(externalsystem)事件(event)數(shù)據(jù)包(packet)數(shù)據(jù)流(stream)標(biāo)識(shí)(identification)接口控制信息(ICI)中斷(interrupt)內(nèi)部模型訪問(internalmodelaccess)程序(programming)進(jìn)程(process)隊(duì)列(queue)子隊(duì)列(subqueue)分割與封裝(segmentationandReassembly)仿真(simulation)統(tǒng)計(jì)(statistic)無線(radio)表格(table)傳輸(transmissiondata)拓?fù)洌╰opology)數(shù)值矢量(valuevector)各類核心函數(shù)的應(yīng)用方法和代碼實(shí)例參看教材五程序調(diào)試方法在OPNET中,程序調(diào)試主要是通過仿真調(diào)試器進(jìn)行的。仿真調(diào)試器(ODB)是仿真核心固有的一個(gè)組成部分,可為用戶提供分析程序運(yùn)行的環(huán)境。用戶可以通過ODB交互地控制仿真,并獲取事件和對(duì)象的信息。ODB的調(diào)試機(jī)制

ODB支持?jǐn)帱c(diǎn)、跟蹤、映射等多種命令,可通過在ODB窗口輸入help命令查看命令的分類在ODB調(diào)試過程中,最有效的調(diào)試手段是斷點(diǎn)(stop)和跟蹤(trace):斷點(diǎn):ODB執(zhí)行期間有“開通”和“閉合”兩個(gè)狀態(tài),而狀態(tài)的閉合就是由斷點(diǎn)引發(fā)的

跟蹤:反應(yīng)仿真內(nèi)核對(duì)事件調(diào)用的過程,體現(xiàn)仿真中進(jìn)程執(zhí)行的邏輯關(guān)系。

應(yīng)當(dāng)指出,斷點(diǎn)和跟蹤主要是針對(duì)函數(shù)、進(jìn)程等仿真總體邏輯的;而在調(diào)試過程中往往需要深入到變量的微觀層面,去發(fā)現(xiàn)和解決問題。OPNET提供了診斷塊(DB)和OPNET\VC聯(lián)調(diào)兩種觀察變量的方式,其中:前者只能用于狀態(tài)變量的觀察;而后者可應(yīng)用于所有的變量類型。診斷塊OPNET與VC的聯(lián)合調(diào)試

兩種變量觀察方式的應(yīng)用方法和代碼實(shí)例參看教材5.2

多進(jìn)程與多隊(duì)列

一動(dòng)態(tài)進(jìn)程機(jī)制

在仿真中,進(jìn)程經(jīng)常被設(shè)計(jì)為執(zhí)行一系列的復(fù)雜任務(wù),如分多階段處理信息、管理多個(gè)隊(duì)列、同時(shí)與多個(gè)終端通信等。如果采用單一進(jìn)程結(jié)構(gòu),該進(jìn)程就會(huì)變得十分復(fù)雜。為了提高設(shè)計(jì)的模塊化,減小復(fù)雜性,有必要采用動(dòng)態(tài)進(jìn)程方法。動(dòng)態(tài)進(jìn)程是可以在仿真過程中動(dòng)態(tài)創(chuàng)建、銷毀的進(jìn)程。不同于根進(jìn)程(由仿真核心創(chuàng)建,不能動(dòng)態(tài)銷毀),動(dòng)態(tài)進(jìn)程由用戶在父進(jìn)程中創(chuàng)建,并可在模塊中動(dòng)態(tài)銷毀。子進(jìn)程是由用戶在父進(jìn)程中創(chuàng)建的:1、建立子進(jìn)程模型2、在父進(jìn)程中聲明子進(jìn)程。3、在父進(jìn)程中調(diào)用進(jìn)程類核心函數(shù)op_pro_create(),創(chuàng)建子進(jìn)程。

子進(jìn)程被創(chuàng)建后即被掛起。子進(jìn)程的初始化通常要通過父進(jìn)程調(diào)用op_pro_invoke(),對(duì)其喚醒(invoke)來完成。應(yīng)當(dāng)注意,對(duì)于設(shè)置初始中斷的根進(jìn)程,其初始化是在仿真初始時(shí)刻進(jìn)行的。而子進(jìn)程的初始化需要父進(jìn)程的喚醒;該初始化不是由初始中斷產(chǎn)生的,而被視作仿真過程中的一般事件。

子進(jìn)程初始化后,可通過進(jìn)程導(dǎo)向(processsteering)機(jī)制,對(duì)其進(jìn)行操作。其中,又伴隨著子進(jìn)程的內(nèi)存共享問題。1)內(nèi)存共享機(jī)制

多進(jìn)程間的協(xié)同工作需要在進(jìn)程間傳遞參數(shù)。參數(shù)傳遞具有狀態(tài)變量和共享內(nèi)存兩種方式。

調(diào)用進(jìn)程類op_pro_svar_get(),可以獲取指向特定進(jìn)程中狀態(tài)變量的指針,從而實(shí)現(xiàn)基于狀態(tài)變量的參數(shù)傳遞。而基于共享內(nèi)存的參數(shù)傳遞可通過模塊、父子、參數(shù)三種方法實(shí)現(xiàn):模塊內(nèi)存(modulememory)父子內(nèi)存(parent_to_childmemory)

參數(shù)內(nèi)存(argumentmemory)

應(yīng)用方法和代碼實(shí)例參看教材2)進(jìn)程導(dǎo)向機(jī)制手動(dòng)導(dǎo)向(manualsteering)常規(guī)導(dǎo)向(normalsteering)中斷類型注冊(cè)導(dǎo)向(type-basedsteering)流端口注冊(cè)導(dǎo)向(port-basedsteering)。應(yīng)用方法和代碼實(shí)例參看教材

二子隊(duì)列機(jī)制

隊(duì)列僅能應(yīng)用于隊(duì)列模塊中,一個(gè)隊(duì)列模塊至少擁有且僅能擁有一個(gè)隊(duì)列對(duì)象,該對(duì)象是系統(tǒng)的內(nèi)建對(duì)象。一個(gè)隊(duì)列對(duì)象至少擁有一個(gè)(可擁有多個(gè))子隊(duì)列對(duì)象,子隊(duì)列是隊(duì)列對(duì)象的子對(duì)象。對(duì)數(shù)據(jù)包的具體操作(如插入、訪問、刪除等)通常是通過子隊(duì)列實(shí)現(xiàn)的,而隊(duì)列可看做是子隊(duì)列的集合。

用戶可以控制進(jìn)程模型執(zhí)行的隊(duì)列,從而可以通過定義隊(duì)列的訪問和管理方式對(duì)任何排隊(duì)協(xié)議進(jìn)行建模。用戶也可以根據(jù)建模隊(duì)列的特征

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論