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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值