1.opnet- 核心函数简介

本文介绍了OPNET核心函数的命名规则、参数类型及其多线程安全性。详细解释了特殊数据类型,如Packet、EventHandle等,并说明了如何通过Vartype参数传递多种数据类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 核心函数简介

1.1 命名规则

OPNET中的核心函数具有非常标准的命名规则,以增强函数在C/C++代码中的可视性,避免名称与非OPNET函或变量冲突。以下列出了一些简单的命名规则:

名称均采用op_作为前缀,以标识其为OPNET仿真内核提供的核心函数。

函数名的第二部分为函数集名,用小写字母表示,通常是函数所处理对象的名称缩写,如pkicistat等。

函数名的第三部分是子函数集名,对核心函数进一步进行了分类,如核心函数op_pk_nfd_set()中的nfd

核心函数主要用于对对象的操作。在函数名中,对象总是出现在动作之前,比如名称中的attr_setsubq_flush就将对象(attributesubqueue)放在动作(setflush)之前。

 

1.2 参数类型

大部分核心函数的参数和返回值都是标准的C/C++数据类型,如intdoublechar*。除此之外,在仿真数据结构中还通过C/C++typedef语句定义了许多参数和返回值作为特殊的OPNET数据类型。尽管用户通过核心函数来操作OPNET数据类型,可能对每个数据类型的基本内容都越来越熟悉,但用户并不需要关心数据类型确切的内部结构,因为OPNET仿真数据结构的内容因软件版本的不同而有所改变。表1-1列举了部分特殊的数据类型。

1-1  OPNET中部分特殊数据类型

基本数据类型

声明示例

Anvid (viewer ID)

Anvid vid;

Anmid (macro ID)

Anmid mid;

Andid (drawing ID)

Andid did;

Boolean

Boolean bool;

Compcode

Compcode comp_status;

Distribution

Distribution* dist_ptr;

Evhandle

Evhandle evh;

Stathandle

Stathandle Stat_handle;

Ici

Ici* ici_ptr;

List

List* list_ptr;

Objid

Objid objid;

Packet

Packet* pkptr;

Pmohandle

Pmohandle pmh;

Log_Handle

Log_Handle config_log_hndl;

Procedure

Procedure proc;

Prohandle

Prohandle proh;

Sbhandle

Sbhandle sbh;

 

1.2.1 Animation Entity

动画集由操作中特定动画实体的ID号表示。之所以采用ID号来代替中的指针,是因为对于动画观察函数op_vuanimID号通信超过了仿真范围。尽管ID号只是存储在规则的C/C++整型变量中的简单整数值,但OPNET也声明了特定的数据类型来准确标记ID参数和变量。三种基于ID号的动画实体包括浏览器(Viewer)、宏(Macro)和图画(Drawing)。

1.2.2 Boolean

核心函数通过返回布尔值来表示结果是否正确。布尔值可与符号常量OPC_TRUEOPC_FALSE进行比较。

1.2.3 Compcode

核心函数通过返回Compcode值来表示操作是否正确完成。Compcode的值可与符号常量OPC_COMPCOED_SUCCESSOPC_COMPCOED_FAILURE进行比较。

1.2.4.Distribution

Distribution是一种与概率密度函数(PDF)一致的数据结构,它描述了随机数到特定数字输出的映射。Distribution包含一张对映射进行编码的数字表,指出完成该映射的算法。对于基于表格的Distribution,数据从PDF编辑器的PDF模型文件中读入。这些结构均由Dist函数集中核心函数操作。

1.2.5 Event Handle

事件句柄是惟一一种确定未决仿真事件(中断)的数据结构。该结构主要在Intrpt核心函数集中使用,因此可通过它们处理预设的中断。注意,事件句柄是一种数据结构,而不是整型或指针。因此不能把它存储在整型或指针变量中。

1.2.6 Statistic Handle

统计量句柄是一种确定动态产生的全局和局部统计量的数据结构。统计量句柄的数据类型为Stathandle,获得统计量句柄的惟一方法是通过核心函数的Stat函数集来注册统计量。注册统计量时将为其指定一个惟一的名称,并和时间一起存储在一个输出矢量中。局部统计量用在特定处理器或队列中;全局统计量由仿真模型中的实体共享,每个实体分布式地作用于输出矢量。

1.2.7 ICI

ICIInterface Control Information,接口控制信息)是与仿真中断相关的结构化数据的集合用于进程间通信机制,传输分层协议接口的控制信息。ICIici函数集中的核心函数操作。

1.2.8 List

List是存储在双向链表中的数据元素的集合。List中的元素可按照从简单的C/C++数据类型在复杂的数据结构进行排列。List主要用于临时存储数据结构组,可包含各种不同类型的元素,但通常并不这样使用。对List的大小没有限制,可在其任意位置插入或移除元素。ListPrg函数集的List子函数集操作。

1.2.9 Object ID

对像ID惟一地确定了一个仿真对象。通过使用Objid数据类型声明该标识符,供IdImaTopoPk函数集使用。

1.2.10 Packet

Packet是数据封装和传输建模中的基本仿真实体。它由Pk函数集中的核心函数操作。

1.2.11 Memory Object Type

某些建模需要为其动态分配内存来存储各种信息。每个相同大小数据组成的集合记为一个池,内核为每个池分配大量的数据条目以提高标准内存分配器的效率。每个汇聚池中的内存对象必须通过调用核心函数op_prg_pmo_define()来创建,该函数将返回一个汇聚内存对象句柄来标识池,用Pmohandle表示。创建汇聚内存对象时都为其分配了一个惟一的名称,仿真模型中的实体可以共享汇聚内存对象。

1.2.12 Log Handle

当在仿真调试或数据分析中创建仿真日志时,日志句柄对于每个日志项非常必要。

1.2.13 Procedure

某些核心函数将C/C++函数指针作为参数,但并不声明这些参数作为指向返回整型值的函数的指针,而是定义了一种特殊的数据类型——Procedure

1.2.14 Process Handle

进程句柄是惟一一种标识仿真中活动进程的数据结构,由Pro函数集中的核心函数使用。需注意进程句柄是数据结构,而不是整形或指针,因而不能将它们存储在整型或指针变量中。

1.2.15 Sar Buffer Handle

Sar缓冲句柄是惟一一种标识SarSegmentation & Reassembly,分段与重组)缓冲区的数据结构。Sar缓冲区缓存包序列,并可对包进行分段和重装。Sar缓冲区由Sar函数集中的核心函数创建,该函数返回访问新缓冲区的Sar缓冲句柄。Sar函数集函数利用Sar缓冲名柄来处理被标识的Sar缓冲区。与其他OPNET数据结构一样,不能将Sar缓冲句柄分配到整型或指针变量中。

1.2.16 Vartype

除标准的C/C++数据类型和特殊的仿真内核数据类型外,OPNET还提供了另外一种数据类型——VartypeVartype数据类型可用在变量声明或类型转换语句中,它是OPNET文档中的特殊关键词,表示函数参数可以是多种可能的数据类型之一。类型参数的传递由C描述的调用函数确定,Vartype用于确定哪个函数参数可用来传递多种数据类型。但需要注意的是,Vartype并不像C中的varargs那样可传递多种参数,每个Vartype参数一次只能接受一个传递值。

Vartype类型的参数,可接受intdouble或指向数据结构的指针。Vartype*Vartype的一种变体,它可接受指向变量类型的指针。Vartype*类型的参数可接受的值包括:指向整型的指针、指向double的指针、指向数据结构的指针,或参数用于返回filled-in值时指向数据结构指针的指针。

每个核心函数中都描述了可被VartypeVartype*参数接受的类型值。具有该类型参数的部分核心函数如表1-2所示。

1-2  Vartype参数的核心函数

核心函数

变量类型参数

op_ima_obj_attr_set()

Vartype

op_ima_obj_attr_get()

Vartype* (fill-in)

op_pk_fd_set()

Vartype

op_pk_fd_get()

Vartype* (fill-in)

op_pk_nfd_set()

Vartype

op_pk_nfd_get()

Vartype* (fill-in)

op_ini_attr_set()

Vartype

op_ini_attr_get()

Vartype* (fill-in)

op_prg_list_insert()

Vartype*

op_prg_mem_copy()

Vartype*

op_prg_mem_free()

Vartype*

 

返回变量类型参数的部分核心函数如表1-3所示。

1-3  返回变量类型参数的核心函数

核心函数

变量类型参数

op_prg_list_access()

Vartype*

op_prg_list_remove()

Vartype*

op_prg_mem_alloc()

Vartype*

1-4  易冲突的函数名

accept()

index()

send()

access()

kill()

signal()

audit()

link()

socket()

bind()

listen()

stat()

clear()

open()

tell()

clock()

pipe()

truncate()

close()

poll()

unlink()

connect()

read()

wait()

exit()

select()

 

 

1.3 多线程安全

无线模块允许OPNET采用多处理器进行收/发信机管道计算。为确保并行传输的正确性和尽可能快速,五个管道阶段必须采用多线程安全核心函数。核心函数定义了三个多线程安全级别,分别是MT-safeMT-unsafeForced serialization

1MT-safe:该类核心函数已手动进行重编码以支持多线程。多个线程可安全地并行执行该类核心函数。

2MT-unsafe:在该安全级别下,若在核心函数中采用并行处理,将导致性能的下降,达不到预期的结果。使用MT-unsafe核心函数时,应当执行适当的代码序列化(Serialization)。

3Forced serialization:对于所有已手动重编码以支持多线程的核心函数,仿真内核采用内部互斥来执行严格的序列化。最终每个核心函数将进行手动重编码来支持多线程,它们的状态也将由Forced serialization变为MT-safe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值