opnet编程类核心函数(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
opnet编程类核⼼函数(1)
编程类核⼼函数(1)
编程(Prg,Programming)类核⼼函数可以分为五个部分,它们针对不同场合的需求,⽽且基本上互相独⽴,以下分别介绍这些⼦类函数:
(1)通⽤数据⽂件(General Data File)⼦类
通⽤数据⽂件是以*.gdf 为后缀的ASCII 码⽂件,可以⽤来存储⽤户⾃定义的路由表、地址映射表以及进程模型配置表等,op_prg_gdf_read()⽀持对通⽤数据⽂件采⽤列表的⽅式进⾏访问。
(2)列表⼦类
列表⼦类包含9 个核⼼函数,它们管理数据元素的集合。
列表有以下属性(21)列表数据元素可以是任意类型,从常⽤的整型或双精度型到复杂的⾃定义的数据结构。
(22)列表可以包含不同种类的数据元素。
(23)列表⼤⼩没有限制,可以按照需求任意添加新的元素。
(24)列表包含的异质的数据结构通过指针相连。
列表的两端分别称为表⾸和表尾,它们是封装在列表数据结构
(List*)的指针。
(25)列表指针可以保存在List*型的变量中。
List*变量可以在很多地⽅定义,如进程模型的临时变量块、状态变量块、头块(全局变量),以及外部C ⽂件。
List*变量还可以写⼊包域中,这样可以将它从⼀个进程模块捎带到另⼀个进程模块中。
(26)有关列表的操作有元素的插⼊、访问和删除等。
对于排序的列表,prg_list 类函数提供查找算法将元素插⼊到合适的位置。
(27)列表属性可以是排序的或⾮排序的,因此相应地元素的插⼊有以下两种⽅法:
a、op_prg_list_insert()在指定位置插⼊元素,并将列表属性更改为⾮排序的。
b、op_prg_list_insert_sorted()只针对排序的列表,将新的元素插⼊到合适的位置并保持列表属性(排序的)不变。
分配列表内存有两种⽅法,分别是动态分配和静态分配。
动态分配的列表在仿真需要时通过op_prg_list_create()创建,使⽤完可以通过op_prg_mem_free()销毁,它还有可在进程模块间移植的优点。
静态分配的列表必须先通过op_prg_list_init()进⾏初始化。
⼀旦列表被创建或者初始化,就可以对它进⾏元素的插⼊、访问和删除等操作,进⾏这些操作之前必须知道元素的位置。
元素的位置由索引号来标识,0 表⽰表⾸,中间元素依次增1,表尾索引号最⼤。
op_prg_list_insert()插⼊⼀个元
素,op_prg_list_remove()移除⼀个元素并返回指向该元素的指针,op_prg_list_access()得到元素的指针但是不删除元素。
op_prg_list_size() 得到列表中元素的个数,它⼀般被⽤作循环调⽤的次数,与op_prg_list_access() 配合使⽤可以访问列表中所有元素,同时也可以使⽤op_prg_list_remove()移除想要得到的元素。
op_prg_list_sort()使⽤⾃定义的元素⽐较程序对列表排序,这样针对元素内容提供灵活的排序⽅法。
op_prg_list_elems_copy()将源列表的内容复制到⽬的列表中。
如果⼀个列表不再使⽤,可以通过op_prg_list_free()释放内存。
(3)内存和池内存(Pmo:Pooled memory)⼦类
在OPNET 进程模型中,⼤多数数据都通过申明静态变量的⽅式来存储,然⽽变量对内存的需求量随着不同事件⽽变化时,就需要⽤到动态内存分配。
除了传统的malloc()和free()分配和释放内存的⽅法,OPNET 还提供为增强调试功能⽽设计的内存分配和释放函数,分别是op_prg_mem_alloc()和op_prg_mem_free()。
当某块内存被⼤量使⽤,并且重复被分配和释放,这时如果把它设置为池内存Pmo 可以增加仿真的性能。
当内存块通过
op_prg_pmo_define()被指定为池内存时,就成为⼀个单独的对象,称为池内存对象(pooled memory
object)。
op_prg_pmo_define()返回Pmohandle 供后续操作的依据,以该Pmohandle为输⼊参数,op_prg_pmo_alloc()可以指定池内存块的⼤⼩。
池内存有三个属性,分别是name、size 和increment size。
name 作为ODB 调试时跟踪内存使⽤情况的依据;size 的单位为byte,标识池内存的⼤⼩;increment size 指定⼀次能够获取Pmo 对象的个数,这个值越⼤Pmo 内存分配器的执⾏速度越快,但是会降低系统内存的使⽤效率当系统内存资源不⾜时该值不能设置得过⼤,⼀般在25~100 之间取值⽐较合适。
(4)ODB ⼦类
ODB 为控制和管理仿真⾏为提供⼀个交互式环境。
ODB ⽀持断点(Breakpoint)定义,跟踪并显⽰仿真诊断信息。
ODB 功能的实现有赖于进程模型中编写相应的程序⽀持,作为ODB 命令激活调试状态(breakpoint、trace 和action)的依
据,ODB ⼦类函数⽤来编写这些ODB ⽀持程序。
op_prg_odb_bkpt()在进程模型中设置⼀个断点,这个断点以断点标签来标识,通过ODB命令lstop(针对所有断点标签)和mlstop(针对指定模块的断点标签)激活断点标签,则程序运⾏到op_prg_odb_bkpt()设置过该标签的地⽅就会中断。
ODB ⽀持⼏种显⽰跟踪信息的命令。
fulltrace 显⽰所有事件调⽤过的程序,不过这样可能会因为内容太多⽽不容易找到想要的信息。
mtrace 针对某个指定模块,显⽰与调⽤该模块所执⾏的程序。
pktrace(针对某个包)和pttrace(针对⼀个包树)显⽰包参与执⾏的所有程序。
ltrace 和mltrace(范围更⼩,只针对某个指定模块)显⽰标签界定的程序段所⽣成的诊断信息。
对应以上命令,分别有⼀些ODB ⼦类函数⽀持它们的实现,在进程模型中判断是否激活相应调试信息的显
⽰。
op_prg_odb_trace_active() ⽀持fulltrace 和mtrace ;op_prg_odb_pktrace_active()⽀
持pktrace;op_prg_odb_ltrace_active()⽀持ltrace 和mltrace。
除了传统的printf()可以将信息打印在ODB 窗⼝外,OPNET 还提供显⽰标准ODB 跟踪信息的函
数:op_prg_odb_print_major 和op_prg_odb_print_minor()。
(5)字符串(Str,String)⼦类
Str ⼦类函数只有⼀个op_prg_str_decomp(),它⼀般与op_prg_gdf_read()配合使⽤,在op_prg_gdf_read()得到GDF(通
⽤数据⽂件)句柄后,op_prg_str_decomp()将GDF ⽂件中的字符串解释为列表域,这种解释是基于对⽂件中逗号、跳格符和冒号等符号的识别。