天天看点

OPNET Modeler 核心函数学习一

核心函数命名规则

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

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

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

函数名的第三部分是子函数集名,对核心函数进一步进行了分类。

核心函数主要用于对对象的操作。在函数名中,对象总是出现在动作之前,比如名称中的 attr_set和subq_flush就将对象(attribute和subqueue)放在动作(set和flush)之前。

参数类型

大部分核心函数的参数和返回值都是标准的C/C++数据类型,如 int、double、char*。另外,在仿真数据结构中,还通过C/C++的typedef 语句定义了许多参数和返回值作为特殊的OPNET数据类型。

  • Animation Entity

动画集由操作中特定动画实体的ID号表示。

  • Boolean
  • 核心函数返回布尔值用来表示结果是否正确。布尔值可与符号常量OPC_TRUE和OPC_FALSE进行比较。
  • Compcode
  • 核心函数返回Compcode值来表示操作是否正确完成。Compcode的值可与符号常量OPC_COMPCODE_SUCCESS和OPC_COMPCODE_FAILURE进行比较。
  • Distribution
  • Distribution是一种与概率密度函数(PDF)一致的数据结构,它包含一张对映射进行编码的数字表,指出完成该映射的算法。基于表格的Distribution,数据从PDF编辑器的PDF模型文件中读入。这些结构均由Dist函数集中核心函数操作。
  • Even Handle
  • 事件句柄是唯一一种确定未决仿真事件(中断)的数据结构。该结构主要在Intrp核心函数集中使用。因此可通过它们处理预设的中断。
  • Statistic Handle
  • 统计量句柄是一种确定动态产生的全局和局部统计量的数据结构。统计量句柄的数据类型为Stathandle, 获得统计量句柄的唯一方法是通过核心函数的Stat函数集来注册统计量。
  • ICI
  • 接口控制信息,是与仿真中断相关的结构化数据的集合用于进程间通信机制,传输分层协议接口的控制信息。由ici函数集中 的核心函数操作。
  • List
  • 存储在双向链表中的数据元素的集合。主要用于临时存储数据结构组,可包含各种不同类型的元素,但通常不这样用。大小没有限制,可在任意位置插入或移除元素。List 由Prg 函数集的List子函数集操作。
  • Object ID
  • 对象ID唯一的确定了一个仿真对象。通过使用Objid数据类型声明该标识符,供Id、Ima、Topo和Pk函数集使用。
  • Packet
  • 是数据封装和传输建模中的基本仿真实体。由Pk函数集中的核心函数操作。
  • Memory Object Type
  • 某些建模需要为其动态分配内存来存储各种信息。每个相同大小数据组成的集合记为一个池,内核为每个池分配大量的数据条目以提高标准内存分配器的效率。每个汇聚池中的内存对象必须通过调用核心函数op_prg_pmo_define()来创建,该函数将返回一个汇聚内存对象句柄来标识池,用Pmohandle表示。创建汇聚内存对象时都为其分配了一个唯一的名称,仿真模型中的实体可以共享汇聚内存对象。
  • Log Handle
  • 仿真调试或数据分析中创建仿真日志时,日志句柄对于每个日志项非常必要。
  • Procedure
  • 某些核心函数将C/C++函数指针作为参数,但并不声明这些参数作为指向返回整型值的函数的指针,而是定义了一种特殊的数据类型——Procedure。
  • Process Handle
  • 进程句柄是唯一一种标识仿真中活动进程的数据结构,由Pro函数集中的核心函数使用。需注意进程句柄是数据结构,而不是整形或指针,因而不能将它们存储在整型或指针变量中。
  • Sar Buffer Handle
  • Sar 缓冲句柄是唯一一种标识Sar(Segmentation&Reassemblly,分短与重组)缓冲区的数据结构。Sar缓冲区缓存包序列,并可对包进行分段和重装。Sar缓冲区由Sar函数集中的核心函数创建,该函数返回访问新缓冲区的Sar缓冲句柄。Sar 函数集函数利用Sar缓冲名柄来处理被标识的Sar缓冲区。与其他OPNET数据结构一样,不能将Sar缓冲句柄分配到整型或指针变量中。
  • Vartype
  • 除了标准C/C++数据类型和特殊的仿真内核数据类型外,OPNET还提供了另一种数据类型——Vartype。可用在变量声明或类型转换语句中,是OPNET文档中的特殊关键词,表示函数参数可能是多种可能的数据类型之一。类型参数的传递由C描述的调用函数确定, Vartype 用于确定那个函数参数可用来传递多种数据类型。但需要注意的是,Vartype并不像C中的varargs那样可以传递多种参数,每个Vartype参数一次只能接受一个传递值。

多线程安全

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

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

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

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

继续阅读