opnet 学习

来源:互联网 发布:电脑编程教学 编辑:程序博客网 时间:2024/04/28 02:48

1、关于opnet的离散事件仿真机制的理解

仿真核心、进程、中断,仿真核心负责整个仿真的调度,进程是中断的处理者,中断有事件产生。

当网络状态发生变化,产生此事件的中断,仿真核心根据中断类型安排相应的进程对中断进行处理。进程执行到非强制状态的入口代码后,就把仿真控制权交还给仿真核心,等待新的事件发生。

当有新事件发生时,产生中断,从而由中断激励仿真核心执行非强制状态的出口,这一过程是由仿真核心根据中断类型进行处理的。

2、关于对进程的理解

   进程是进程模型的一个实例,一般一个进程模型只有一个进程(根进程),但为了增强模块性和降低设计复杂性,QP(Q指队列Queue,P指处理器 processors)也采用multiple processes。process可以通过调用op_pro_create()创建新的processes,也就是所谓的dynamic processes。

3、关于自中断op_intrpt_schedule_self (T,Code)

op_intrpt_schedule_self (T,Code)中有两个参数,第一个参数是指当前仿真时间,是指仿真时间,不是指程序运行时间,第二个参数是中断码,用于区别不同的自中断,其本身没有实际意义。

自中断一般发生在进程执行过程中,用于做定时器或延时。当自中断发生时,进程停止执行,把仿真控制权交还给仿真核心或者调用发生自中断的进程(出现在动态进程有子进程的情况下),此时仿真核心可以安排其它中断或者空闲等待直到T时间的到来,重新激活发生自中断的进程,然后进程在发生自中断处继续执行。

4、关于ICI接口控制信息

       在OPNET中,可以使用ICI来进行层与层之间的数值传递。所谓的ICI就是Interface Control Information的简称,表示接口控制信息,它是一种特殊的数据结构,它的格式可以用ICI Editor进行定义,设计你自己需要的ICI格式。使用的上,大致可以分为如下几步:

       1.定义你需要的ICI格式,方法是用ICI Editor来编辑。比如我们编辑一个如下格式的ICI,字段名称 field1 ,数据类型int ,默认值 0。我们将这ICI格式的名称保存为test_ici_fmt。
       2.在程序中你需要的地方定义一个ICI指针,如 Ici* iciptr;
       3.创建一个ici,iciptr=op_ici_create("test_ici_fmt")。
       4.给ici中的字段赋值,可以根据需要进行。方法:op_ici_attr_set(iciptr,"field1",1),就是把指针iciptr所指向的那个ici数据的field1字段赋值为1。
       5.用op_ici_install()把你定义的ici绑定到一个输出中断,注意在任何时间仅有一个ici可以绑定到一个中断。绑定之后,你的ici就可以随着这个输出的包发送函数或其他的发送函数输出到另外的进程(模型中的其他层)。
      6.然后,就可以在接收到的层里面获取ici里面的值了,所用的函数是op_ici_attr_get()。在接收之前你需要定义一个与你想获得的字段类型一致的变量,用来保存数值。如,前面我们定义的field1是int型的,我们就需要在接收的层里定义 int   rec1。接收是这样op_ici_attr_get(iciptr,"field1",&rec1)。
      7.Over

 ICI应用场合主要有同一节点模型的不同模块之间、不同节点模型之间以及同一节点模型的相同模块内。主要是用于那些不适合利用数据包进行信息传递的场合,即为当前某事件要向未来要发生的某事件进行信息传递时,可以将ICI和将来的事件绑定,将来事件发生时就可以把信息传递到。

5、wlan_mac_interface模型的理解

INIT中的wlan_mac_higher_layer_intf_sv_init ()函数主要功能是进行初始化设置,获得终端地址(指数据包发送的目的地址)和服务类型,并设置一个接口控制信息(ICI)向下层传递服务信息和协议类型。

wlan_mac_higher_layer_register_as_arp ()函数的作用是建立进程注册机制,建立了一个arp进程,该进程主要是在有applition时进行地址解析功能,相当于TCP/IP协议时上层或写层来的数据包协议解析为本层地址。 

以上只是个人愚见,若有错误请指正。

6、一个重要的问题是在编程中-1在计算机里面表示的是111111。。。最大值。在simple source里面#define  SSC_INFINITE_TIME  -1.0就是被定义为最大值。

 7、进程注册是为了其它层的进程模型能找到该层的进程模型,从而与该层进程模型建立连接端口,向下传递信息。

8、函数oms_aa_dest_addr_get_core(OmsT_Aa_Address_Handle oms_aa_handle, int* dest_address_ptr, int source_addr),该函数的作用是若dest_address_ptr附值OMSC_AA_AUTO_ASSIGN,则在 OmsT_Aa_Address_Handle定义的地址空间内找到一个和source_addr不同的地址,然后赋给 dest_address_ptr,若dest_address_ptr赋值为一明确的地址就不用在查找了,直接返回改地址就可以了。

9、关于OMSC_AA_AUTO_ASSIGN的理解,在模型中经常会见到这个变量,其实这个变量没有分配具体地址,只是其到标识作用,标识是自动随机地址分配,真是分配地址是靠oms_aa_dest_addr_get_core(OmsT_Aa_Address_Handle oms_aa_handle, int* dest_address_ptr, int source_addr)来实现的。

10、关于opnet模型属性的定义:有时候opnet模型属性需要定义为复合属性compound,包含多个属性,这时候就需要点击下面的 Edit properties扩展命令进行定义,这个问题困扰了好久,今天终于发现解决,吸取教训,opnet是一款很精细的软件,每个命令都有重要用处,以后在学习中要细心!

11、opnet和VC联调:

                 1.运行需要调试的模型,启动opnet console

                 2.启动VC

                 3.在VC的Build的attach to process里选中当前的进程

                 4.打开需要调试的源程序

                  OVER了:)