(1)Evhandle 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、与仿真(指仿真过程)有关:
(1)double op_sim_time (),获得当前的仿真时间。.
(1)Compcode op_ev_cancel(Evhandle env),取消前面已经被调度过的一个事件。
返回值:OPC_COMPCODE_SUCCESS或OPC_COMPCODE_FAILURE。
(2) Evhandle op_ev_current (),获理当前执行事件的句柄。
(3)int op_ev_type (evhandle), 获得当前执行事件的类型。常用的type有如下所示:
OPC_INTRPT_ACCESS—access interrupt
OPC_INTRPT_BEGSIM—begin simulationinterrupt
OPC_INTRPT_ENDSIM—end simulation interrupt
OPC_INTRPT_PROCEDURE—procedure interrupt
OPC_INTRPT_PROCESS—process interrupt
OPC_INTRPT_RECOVER—node/link recoveryinterrupt
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
(1)double op_dist_uniform (doublelimit),产生[0.0-limit)的随机数。
(2)Distribution* op_dist_load (constchar* dist_name, double dist_arg0, double dist_arg1), 函数的返回值是:指向装入的分布的分布指针. 出错返回常量 OPC_NIL.作用是产生arg0到arg1符合分布dist_name(分布名,比如泊松)的随机数。
(3)double op_dist_outcome(Distribution*dist_ptr), 由指定分布产生一个浮点数.如果出错的话,返回OPC_DBL_INVALID.
(1)Packet* op_pk_create(OpT_Packet_Size bulk_size), 创建一个无格式的数据包,大小为bulk_size.返回值:返回指向新创建的数据包的指针, or OPC_NIL。
(2)Packet* op_pk_create_fmt (constchar* 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);
(5)void op_pk_send (Packet* pkptr, intoutstrm_index),将pkptr所指向的包发送到outstrm_index所指向的输出流中。
(6)Packet* op_pk_get (intinstrm_index),从instrm_index所指向的输入流中读入数据包,返回指向包的指针。
(7)Packet* op_pk_copy (Packet* pkptr),将pkptr所指向的数据包复制一份,并返回指向新数据包的指针。
(8)Compcode op_pk_fd_get(pkptr,field_index, value_ptr), 返回值是:成功为OPC_COMPCODE_FAILURE,OPC_COMPCODE_SUCCESS otherwise。比如:
op_pk_fd_get(pkptr, 0, &i);
(9)Compcode 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 thepacket */
enc_pkptr =op_pk_create (24);
op_pk_fd_set(uf_pkptr, 4, OPC_FIELD_TYPE_PACKET, enc_pkptr, -1);
(10)Compcodeop_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);
(11)Compcodeop_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);
(12)void op_pk_send_forced (Packet*pkptr, int outstrm_index),立即将指定的数据包发送到指定的输入输出索引。
(13)double op_pk_creation_time_get(Packet* pkptr) ,获得指定包创建的时间。
(14)void op_pk_send_quiet (Packet*pkptr, int outstrm_index) ,将包发出去,当到达目的模块时不会调度一个中断或调用,由目的模块主动来发现和获取。
(15)OpT_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 toservice the packet based on its size. */
/* Keep track of the service time as aglobal statistic. */
svc_time = bulk_size / svc_rate;
op_stat_global_write (svc_time_glob_stat,svc_time);
(15)Compcode 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 ());
(16)Compcode op_pk_total_size_get(pkptr),获得指定数据包的大小。
(17)void op_pk_priority_set (Packet*pkptr, double value),给包设置优先级。(18)doubleop_pk_priority_get (Packet* pkptr),获得包的优先级。
(19)void op_pk_send_delayed (pkptr,outstrm_index, delay)
将pkptr指向的包在延时delay后传送到outstrm_index指向的输出流中。
(1)void op_stat_write (Stathandlestat_handle, double value) ,将(time,value)写入到统计量中;其中time指当前时间,而value为刚刚由统计量stat_handle所指的值,也就是op_stat_write函数刚写入的value值。
(2)stathandle op_stat_reg (const char*stat_name, int stat_index, int type),返回一个可以被用来指向一个进程/模型的节点或模块的统计量(局部或全局)句柄。其中,stat_index为相关统计量的数字索引,如果没有则为OPC_STAT_INDEX_NONE,type指OPC_STAT_GLOBAL或OPC_STAT_LOCAL 。如
ete_gsh=op_stat_reg("ETEdelay",OPC_STAT_INDEX_NONE,OPC_STAT_GLOBAL);
op_stat_write (ete_gsh,ete_delay);//ete_delay是计算得出的一个变量。
(1)Objid op_topo_parent(Objidchild_objid),获得指定实体ID的父实体的ID。
(2)Objid op_id_self (),返回所获取的周围处理器或队列的对象ID。
(1)Compcode 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);
子队列操作函数
(1)int op_subq_pk_insert (intsubq_index, Packet* pkptr,int pos_index) ,将pkptr所指向的数据包插入到subq_index队列的pos_index处。队列出0开始,依次增加,pos_index可以是OPC_QPOS_HEAD,OPC_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);
(2)Booleanop_subq_empty (subq_index),判断队列是否为空。是空返回OPC_TRUE,否则返回OPC_FALSE。
(3)Packet*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 beingaccessed */
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);
}
(4)Packet* op_subq_pk_access (intsubq_index, int pos_index),返回子队列索引subq_index所向的队列的指定位置pos_index处的数据包的指针。
(5)void op_subq_sort (int subq_index),将子列队按包相关的优先级排序。优先级越大,越靠近队首。
(1)int op_intrpt_code (),返回与调用进程当前中断相关的中断/事件码。
(2)int op_intrpt_strm (),返回与调用进程当前中断相关的流索引。
(3)int op_intrpt_type () ,返回调用进程当前中断的类型。常见的类型有:
OPC_INTRPT_ACCESS—access interrupt
OPC_INTRPT_BEGSIM—begin simulationinterrupt
OPC_INTRPT_ENDSIM—end simulation interrupt
OPC_INTRPT_PROCEDURE—procedure interrupt
OPC_INTRPT_PROCESS—process interrupt
OPC_INTRPT_RECOVER—node/link recoveryinterrupt
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
(1)void* op_strm_flush (instrm_index),清除输入流中数据包。
(2)int op_strm_max_index_in ()获得任何与周围进程或队列相连接的输入流的索引中的最大值。
(3)Boolean op_strm_connected (intstrm_type, int strm_index)判定周围处理器的指定的输入或输出流是否与一个包流实体相关联的。
(4)Boolean op_strm_empty (intinstrm_index)判断当前指定的输入流是否有包。
(5)Compcode op_strm_access (intinstrm_index)向与指定的输入流相关的模块发送一个访问中断。
/** loop through all input streams,generating an access interrupt for each **/
/* determine the number of allocated inputstreams */
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 sourcemodule. */
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);
}
}
(1)void* op_prg_mem_alloc (size),分配指定大小的内存。如:
doc_req_msg=(Doc_Req_Msg *)op_prg_mem_alloc(sizeof (Doc_Req_Msg));
(2)void op_prg_mem_free (Packet* ptr),释放指定内存。
(3)void* op_prg_mem_realloc (mem_ptr,size),为已存在的内存块重新分配大小。