OPNET中常用函數

1、與調度相關:

1Evhandle  op_intrpt_schedule_self(op_sim_time()+ 仿真推進的時間T,中斷碼),爲調用進程調度一個自中斷。通過調用它,你可以設置在何時產生一次中斷,然後針對中斷類型,作出相應的處理。其中,參數time指定了中斷時間,而code 是你自己定義的一箇中斷標識,通過這個標識可以知道當前的中斷類型。返回類型就是此中斷事件的句柄。

     a)你可以利用這個函數來表示一次time out。譬如,接收機正在等待接收數據包,如果2s後仍然沒有收到相應數據,於是產生一個超時中斷,便可以這樣用:op_intrpt_schedule_self(op_sim_time( )+2, PKT_TIMEOUT)。如果在2s內收到了數據包,需要用op_ev_cancel(PKT_TIMEOUT)來取消中斷。

     b)另一種用法是表示一次處理延時。例如,發送方需要一定的時間來產生一個數據包,在這段時間後,才能發送數據包。

比如:

/* self interrupt scheduling */

evh = op_intrpt_schedule_self (sch_time, 5);

/* self interrupt cancelling */

op_ev_cancel (evh);

 

2、與仿真(指仿真過程)有關:

1double op_sim_time (),獲得當前的仿真時間。.

3、與事件有關:

1Compcode  op_ev_cancel(Evhandle env),取消前面已經被調度過的一個事件。

返回值:OPC_COMPCODE_SUCCESSOPC_COMPCODE_FAILURE

(2) Evhandle op_ev_current (),獲理當前執行事件的句柄。

(3)int op_ev_type (evhandle), 獲得當前執行事件的類型。常用的type有如下所示:

OPC_INTRPT_ACCESS—access interrupt

OPC_INTRPT_BEGSIM—begin simulation interrupt

OPC_INTRPT_ENDSIM—end simulation interrupt

OPC_INTRPT_PROCEDURE—procedure interrupt

OPC_INTRPT_PROCESS—process interrupt

OPC_INTRPT_RECOVER—node/link recovery interrupt

OPC_INTRPT_REGULAR—regular interrupt

OPC_INTRPT_REMOTE—remote interrupt)

OPC_INTRPT_SELF—self interrupt

OPC_INTRPT_STAT—statistic interrupt

OPC_INTRPT_STRM—stream interrupt

4、與分配/布相關:

1double op_dist_uniform (double limit),產生[0.0-limit)的隨機數。

2Distribution* op_dist_load (const char* dist_name, double dist_arg0, double dist_arg1), 函數的返回值是:指向裝入的分佈的分佈指針出錯返回常量 OPC_NIL.作用是產生arg0arg1符合分佈dist_name(分佈名,比如泊松)的隨機數。

3double op_dist_outcome(Distribution* dist_ptr), 由指定分佈產生一個浮點數.如果出錯的話,返回OPC_DBL_INVALID.

5、與數據包相關(fd爲無格式包操作,nfd爲有格式包操作):

1Packet* op_pk_create (OpT_Packet_Size bulk_size), 創建一個無格式的數據包,大小爲bulk_size.返回值:返回指向新創建的數據包的指針, or OPC_NIL

2Packet* op_pk_create_fmt (const char* format_name), 新建一個先前定義好的格式數據包。返回指向新數據包的指針,失敗返回OPC_NIL

(3) void op_pk_destroy (Packet* pkptr), 銷燬包,釋放內存空間。

(4) void op_pk_format (Packet* pkptr, char* fmt_name), 獲得pkptr所指向的數據包的包格式類型,賦給fmt_name

(5)Compcode op_pk_nfd_get (Packet* pkptr, const char* fd_name,void*  value_ptr),作用是將pkptr所指向的包的fd_name域的值讀入到value_ptr中。返回值:如果成功,則返回相應的成功代碼,失敗則返回 OPC_COMPCODE_FAILURE。比如:

op_pk_nfd_get (pkptr, "int_value", &i);

5void op_pk_send (Packet* pkptr, int outstrm_index),pkptr所指向的包發送到outstrm_index所指向的輸出流中。

6Packet* op_pk_get (int instrm_index),instrm_index所指向的輸入流中讀入數據包,返回指向包的指針。

7Packet* op_pk_copy (Packet* pkptr),pkptr所指向的數據包複製一份,並返回指向新數據包的指針。

8Compcode op_pk_fd_get(pkptr, field_index, value_ptr), 返回值是:成功爲OPC_COMPCODE_FAILUREOPC_COMPCODE_SUCCESS otherwise。比如:

op_pk_fd_get(pkptr, 0, &i);

9Compcode op_pk_fd_set (Packet* pkptr, int fd_index, int type, void* value, int/double/OpT_Int64 size),作用是設定pkptr所指向的數據包的字段索引,字段數據類型,字段值,及大小。

可用的type有:

OPC_FIELD_TYPE_INTEGER,OPC_FIELD_TYPE_INT64,OPC_FIELD_TYPE_DOUBLE,OPC_FIELD_TYPE_PACKET_ID,OPC_FIELD_TYPE_OBJECT_ID,andOPC_FIELD_TYPE_ PACKET。比如:

/* create an unformatted packet */

uf_pkptr = op_pk_create (64);

/* assign integer fields in the packet */

op_pk_fd_set (uf_pkptr, 0, OPC_FIELD_TYPE_INTEGER, 2511, 16);

int64_value = 5 * 200000000000;

op_pk_fd_set (uf_pkptr, 1, OPC_FIELD_TYPE_INT64, int64_value, 16);

...

/* encapsulate a higher-level packet in the packet */

enc_pkptr = op_pk_create (24);

op_pk_fd_set (uf_pkptr, 4, OPC_FIELD_TYPE_PACKET, enc_pkptr, -1);

10Compcode op_pk_nfd_get_objid (Packet* pkptr, const char* fd_name, Objid* value_ptr),作用是將pkptr所指向的包中域名爲fd_name的值賦給value_ptr所指向的地址,比如:op_pk_nfd_get_objid (pkptr, "prev node id", &prev_node_id);

11Compcode op_pk_nfd_set (Packet* pkptr,const char*  fd_name, void* value),將pkptr所指向的包中域名爲fd_name域賦值爲value。比如:

op_pk_nfd_set (f_pkptr, "fd_int_1", 2511);

12void op_pk_send_forced (Packet* pkptr, int outstrm_index),立即將指定的數據包發送到指定的輸入輸出索引。

13double op_pk_creation_time_get (Packet* pkptr) ,獲得指定包創建的時間。

14void op_pk_send_quiet (Packet* pkptr, int outstrm_index) ,將包發出去,當到達目的模塊時不會調度一箇中斷或調用,由目的模塊主動來發現和獲取。

15OpT_Packet_Size op_pk_bulk_size_get (Packet* pkptr),獲得指定數據包的大小(以bit記)。如

/* obtain the arriving packet */

pkptr = op_pk_get (INPUT_STRM);

/* determine the bulk size of the packet */

bulk_size = op_pk_bulk_size_get (pkptr);

/* Compute the total time required to service the packet based on its size. */

/* Keep track of the service time as a global statistic. */

svc_time = bulk_size / svc_rate;

op_stat_global_write (svc_time_glob_stat, svc_time);

15Compcode op_pk_total_size_set (Packet* pkptr,OpT_Packet_Size 
total_size);
給指定的數據包設定大小。如:

/* create a packet to send to mac */

pkptr = op_pk_create_fmt ("fddi_llc_fr");

/* assign its overall size. */

op_pk_total_size_set (pkptr, pklen);

/* assign the time of creation */

op_pk_nfd_set (pkptr, "cr_time", op_sim_time ());

16Compcode op_pk_total_size_get (pkptr),獲得指定數據包的大小。

17void op_pk_priority_set (Packet* pkptr, double value),給包設置優先級。(18double op_pk_priority_get (Packet* pkptr),獲得包的優先級。

19void op_pk_send_delayed (pkptr, outstrm_index, delay)

pkptr指向的包在延時delay後傳送到outstrm_index指向的輸出流中。

6、與統計相關:

1void op_stat_write (Stathandle stat_handle, double value) ,將(time,value)寫入到統計量中;其中time指當前時間,而value爲剛剛由統計量stat_handle所指的值,也就是op_stat_write函數剛寫入的value值。

2stathandle op_stat_reg (const char* stat_name, int stat_index, int type),返回一個可以被用來指向一個進程/模型的節點或模塊的統計量(局部或全局)句柄。其中,stat_index爲相關統計量的數字索引,如果沒有則爲OPC_STAT_INDEX_NONEtypeOPC_STAT_GLOBAL  OPC_STAT_LOCAL 。如

ete_gsh=op_stat_reg("ETE delay",OPC_STAT_INDEX_NONE,OPC_STAT_GLOBAL);

op_stat_write (ete_gsh, ete_delay);//ete_delay是計算得出的一個變量。

7、與拓撲結構相關:

1Objid op_topo_parent(Objid child_objid),獲得指定實體ID的父實體的ID

2Objid op_id_self (),返回所獲取的周圍處理器或隊列的對象ID

8IMA 核心函數-操作對象(的屬性等)

1Compcode  op_ima_obj_attr_get (objid objid,const char* attr_name, void* value_ptr),獲得對象objid的屬性域attr_name的值。object ID 可通過如下函數獲得:op_id_self(), op_topo_parent(), op_topo_child(), op_id_from_userid(), and op_id_from_name()。如:

op_ima_obj_attr_get (own_id, "init_value",&init_value);

op_ima_obj_attr_get(op_topo_parent(op_id_self()),"name",my_name);

9、與隊列相關:

子隊列操作函數

1int op_subq_pk_insert (int subq_index, Packet* pkptr,int pos_index) ,pkptr所指向的數據包插入到subq_index隊列的pos_index處。隊列出0開始,依次增加,pos_index可以是OPC_QPOS_HEADOPC_QPOS_TAIL,以及OPC_QPOS_PRIO。返回插入情況,可以是OPC_QINS_OK, OPC_QINS_FAIL, OPC_QINS_PK_ERROR, 
OPC_QINS_SEL_ERROR
。如:

pkptr = op_pk_get (strm_index);

op_subq_pk_insert (strm_index, pkptr, OPC_QPOS_TAIL);

2Boolean op_subq_empty (subq_index),判斷隊列是否爲空。是空返回OPC_TRUE,否則返回OPC_FALSE

3Packet* op_subq_pk_remove (int subq_index, int pos_index),刪除指定隊列的指定數據包,並返回指向該刪除數據包的指針。pos_index可以是:OPC_QPOS_HEAD, OPC_QPOS_TAIL, and OPC_QPOS_PRIO

/* determine which subqueue is being accessed */

subq_index = op_intrpt_code ();

/* check if it is empty */

if (op_subq_empty (subq_index) == OPC_FALSE)

       {

       /* access the first packet in the subqueue */

       pkptr = op_subq_pk_remove (subq_index, OPC_QPOS_HEAD);

       /* forward it to the destination over requested stream */

       /* use 'quiet' mode to avoid causing a stream interrupt. */

       op_pk_send_quiet (pkptr, subq_index);

       }

4Packet* op_subq_pk_access (int subq_index, int pos_index),返回子隊列索引subq_index所向的隊列的指定位置pos_index處的數據包的指針。

5void op_subq_sort (int subq_index),將子列隊按包相關的優先級排序。優先級越大,越靠近隊首。

10、與中斷有關:

1int op_intrpt_code (),返回與調用進程當前中斷相關的中斷/事件碼。

2int op_intrpt_strm (),返回與調用進程當前中斷相關的流索引。

3int op_intrpt_type () ,返回調用進程當前中斷的類型。常見的類型有:

OPC_INTRPT_ACCESS—access interrupt

OPC_INTRPT_BEGSIM—begin simulation interrupt

OPC_INTRPT_ENDSIM—end simulation interrupt

OPC_INTRPT_PROCEDURE—procedure interrupt

OPC_INTRPT_PROCESS—process interrupt

OPC_INTRPT_RECOVER—node/link recovery interrupt

OPC_INTRPT_REGULAR—regular interrupt

OPC_INTRPT_REMOTE—remote interrupt)

OPC_INTRPT_SELF—self interrupt

OPC_INTRPT_STAT—statistic interrupt

OPC_INTRPT_STRM—stream interrupt

11、與數據流相關:

1void* op_strm_flush (instrm_index),清除輸入流中數據包。

(2)int op_strm_max_index_in ()獲得任何與周圍進程或隊列相連接的輸入流的索引中的最大值。

(3)Boolean op_strm_connected (int strm_type, int strm_index)判定周圍處理器的指定的輸入或輸出流是否與一個包流實體相關聯的。

(4)Boolean op_strm_empty (int instrm_index)判斷當前指定的輸入流是否有包。

(5)Compcode op_strm_access (int instrm_index)向與指定的輸入流相關的模塊發送一個訪問中斷。 

/** loop through all input streams, generating an access interrupt for each **/

/* determine the number of allocated input streams */

alloc_instrms = op_strm_max_index_in ();

/* loop through each allocated stream */

for (i = 0; i <= alloc_instrms; i++)

      {

      /* if an input stream is connected, and... */

      if (op_strm_connected (OPC_STRM_IN, i) == OPC_TRUE)

             {

             /* if an input stream is connected, access a packet from the source module. */

             op_strm_access (i);

      /* Collect and forward the packet onto the bus, if one was obtained. */

             if (op_strm_empty (i) == OPC_FALSE)

                    op_pk_send (op_pk_get (i), OUTSTRM_BUS);

             }

      }

 

12、與編程(Programming)有關:

1void* op_prg_mem_alloc (size),分配指定大小的內存。如:

doc_req_msg=(Doc_Req_Msg *)op_prg_mem_alloc (sizeof (Doc_Req_Msg));

2void op_prg_mem_free (Packet* ptr),釋放指定內存。

3void* op_prg_mem_realloc (mem_ptr, size),爲已存在的內存塊重新分配大小。


原文出處:http://blog.163.com/zhoumhan_0351/blog/static/39954227200981111046599/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章