某人笔记Word文档格式.docx
《某人笔记Word文档格式.docx》由会员分享,可在线阅读,更多相关《某人笔记Word文档格式.docx(9页珍藏版)》请在冰点文库上搜索。
*/
staticvoidus_frm_arvl(void)
{
Packet*pkptr;
doublepk_delay;
//包延时
FIN(us_frm_arvl())
pkptr=op_pk_get(op_intrpt_strm());
op_pk_nfd_get(pkptr,"
onu_ID_from"
&
source_ID);
//从自定义的包中读取源ID号"
oun_ID_from"
到变量source_ID(在HB中定义)中
//若源ID号在正常范围内,则开始读取包中的数据至变量中。
if(source_ID<
N)
bwr_1"
bwr_1);
//将包中"
读出,赋给在HB中定义的变量bwr_1(表示该onu中第一种类型带宽的申请量)
bwr_2"
bwr_2);
bwr_3"
bwr_3);
bwr_4"
bwr_4);
bwr_5"
bwr_5);
bwr_table[source_ID][0]+=bwr_1;
//将该onu中第1类带宽的申请量计入带宽申请表中
bwr_table[source_ID][1]+=bwr_2;
bwr_table[source_ID][2]+=bwr_3;
bwr_table[source_ID][3]+=bwr_4;
bwr_table[source_ID][4]+=bwr_5;
pk_delay=op_sim_time()-op_pk_creation_time_get(pkptr);
op_stat_write(us_delay,pk_delay);
//us_delay是一个统计变量,在SB中定义,计算上行包延时
}
op_pk_destroy(pkptr);
FOUT
/*************************************************不晓得是不是正确*haha**********************************/
09-04-24
两种发送packet的方式:
一种是使用主动的,也就是A要发packet给B的时候直接用op_pk_send()(或者加上时延、forced等)。
那么在B就会收到一个OPC_INITRPT_STRM中断,B响应这个流中断时就把packet取出来。
一般都是这样用的。
一种是被动的,就是A不主动给B发packet,因为B可能还没准备好接收。
那么等B准备好接收后就通过op_strm_access()告诉A我准备好了,要packet。
op_strm_access()产生一个OPC_INTRPT_ACCESS中断。
A响应这个accessintrpt才把packet发给B。
这时候用op_pk_send_quiet()来发送,就不会给B一个strmintrpt。
那么B如何知道packet什么时候到来呢?
因为是B自己要求发packet的,那么它已经做好了接收packet的准备,在它响应下一个中断的时候可以用op_strm_empty()来判断是否有pacekt来了。
队列模块pc_fifo展示了这种被动用法。
09-04-25
子队列插入函数:
op_subq_pk_insert()
函数描述:
op_subq_pk_insert(subq_index,pkptr,pos_index)
功
能:
把接收到的包加入到相应的队列中;
返回值:
OPC_QINS_OK,OPC_QINS_FAIL,
OPC_QINS_PK_ERROR,OPC_QINS_SEL_ERROR;
说明:
subq:
int型,指要插入的队列号;
pkptr:
要排队的队列;
pos_index:
插入方式,共有三种:
OPC_QPOS_PRIO,
根据优先权插入队列;
OPC_QPOS_HEAD,
插入队头;
OPC_QPOS_TAIL,
插入队尾;
注:
1、OPC_QPOS_PRIO需要由op_pk_priority_set()来设置,并且要使用op_subq_sort()进行排序才可以使用。
2、如果pos_index<
0,包将插入到队头,如果pos_index>
队列中最大包数,则包将插到队尾。
举例:
/*Composeamacframefromalltheseelements*/
mac_frame_ptr=op_pk_create_fmt("
fddi_mac_fr"
);
op_pk_nfd_set(mac_frame_ptr,"
svc_class"
svc_class);
dest_addr"
dest_addr);
src_addr"
my_address);
info"
pdu_ptr);
if(svc_class==FDDI_SVC_ASYNC)
tk_class"
req_tk_class);
pri"
req_pri);
/*Assigntheframecontrolfield...*/
fc"
FDDI_FC_FRAME);
/*Enqueuetheframeatthetailofthequeue.*/
op_subq_pk_insert(0,mac_frame_ptr,OPC_QPOS_TAIL);
09-04-27
simple_source模块
学习OPNET,一看在线帮助,二看OPNET自带的各种模块。
这些模块都有很好的编程风格,结构清晰,并且能让我们更好理解OPNET的有限状态机工作方式。
一个网络节点最常见的组成结构是:
数据源模块+数据处理模块+发送模块。
首先介绍数据源模块,也就是负责产生数据包的。
OPNET已经自带有simple_source模块,用于简单且方便地产生各种需要的数据包。
用户可以定义包的产生和结束时间、密度分布函数、包的大小和格式等。
其工作原理如下:
初始化---->
开始时间到,则调用ss_packet_generate()产生数据包
---->
按概率密度分布函数计算下一个包的产生时间,定时
定时到,则ss_packet_generate()。
其中,各种定时中断是由op_intrpt_schedule_self(time,code)实现的。
simple_source的头文件:
#defineSSC_START
0
//数据包开始时间到
#defineSSC_GENERATE1
//数据包产生定时到
#defineSSC_STOP
2
//数据包产生结束时间到
//以上定义了各种定时中断的代码,当调用op_intrpt_schedule_self()设置一个定时中断的时候,会返回相应的中断代码,以便程序可以正确执行相应的操作。
#defineSTART
(intrpt_code==SCR_START)
//从初始化转向数据包产生的状态
#defineDISABLE
(intrpt_code==SSC_STOP)
//从数据包产生转向停止
#defineSTOP
(intrpt_code==SSC_STOP)
//从初始化转向停止
#definePACKET_GENERATE
(intrpt_code==SSC_GENERATE)
//继续执行数据包产生的状态
//以上定义的是各个状态之间转换的条件。
当有中断产生时(确切说,是当OPNET获得离散事件列表中的一个事件时),判断相应的中断码,如果条件成立,则跳转。
初始化程序:
确定产生有格式(formatted)或无格式(unformatted)的包
检查开始和结束时间
op_intrpt_schedule_self(start_time,SSC_START)。
如果指明结束时间,还要op_intrpt_schedule_self(stop_time,SSC_STOP)
intrpt_code=op_intrpt_code()获得中断代码。
数据包产生程序:
next_intarr_time=oms_dist_outcome(interarrival_dist_ptr);
//计算下一个数据包产生时间
next_pk_evh
=op_intrpt_schedule_self(op_sim_time()+next_intarr_time,SSC_GENERATE);
数据包产生函数ss_packet_generate():
按要求产生数据包,并统计发送量等。
统计方法如下:
op_stat_write(packets_send_hndl,1.0);
op_stat_write(pacekts_send_hndl,0);
//计算trafficsent(packets/s)
op_stat_write(bits_sent_hndl,(double)pksize);
op_stat_write(bits_sent_hndl,0);
//计算trafficsent(bits/s)
注明出处:
09-04-30
要用ON/OFF模型(10个或者40个)构成自相似业务源。
ON/OFF模型:
节点级模型里,弄一个Processer,然后EditAttributes,在“Processmodle”里
选"
bursty_source"
,然后设置它的参数(业务开始时间,业务结束时间,ON的
持续时间,OFF的持续时间,包长度,包到达间隔等)。
ON/OFF模型下:
平均数据总负载=(业务结束时间-业务开始时间)×
平均ON的持续时间/(平均ON的持续时间+平均OFF的持续时间)
×
包长度均值/包到达间隔均值
学了几天的OPNET,发现最难的其实不是这个软件,难的是我自己对要仿真的网络没有完全搞清楚,不能做到胸有成竹,于是放下OPNET回头去踏踏实实弄PON网络的细节,把问题归归类,弄清一个流程,会有很大的帮助。
关于几天前我提的一个问题,指定时间发送包,指定时间结束发送包。
下面是simplesource里init中的一段,先在start_time的时候产生自中断SSC_START,接着立刻又规定:
在stop_time时产生SSC_STOP自中断,看到这里忽然明白一匡在答我的问题中所说:
“设置一个自中断,自中断后面的程序不是不执行了而是在你指定的时间以后产生中断不会影响后面的程序,除非像op_intrpt_schedule_self(op_sim_time(),SSC_STOP);
在当前仿真时间调用中断才会不执行后面的程序进入中断”
op_intrpt_schedule_self(start_time,SSC_START);
/*Inthiscase,alsoscheduletheinterruptwhenwewillstop*/
/*generatingpackets,unlessweareconfiguredtorununtil*/
/*theendofthesimulation.
if(stop_time!
=SSC_INFINITE_TIME)
op_intrpt_schedule_self(stop_time,SSC_STOP);
09-05-03
如何获得产生包的节点的id
op_id_self():
本处理器或队列的对象ID。
提供了得到自身ID的机制,之后仿真可以通过
op_ima_obj_attr_get()来获取对对象的属性。
op_topo_parent():
父对象的对象ID。
(错误返回OPC_OBJID_INVALID)
如果需要有分组获得ID可以使用OP_PK_ID()--获得一个复制包的包ID.
如果要获得其产生节点的ID需要先获得其产生模块的ID,产生模块的ID可以通过函数op_pk_creation_mod_get()获得。
如有需要可见原文帮助文档中对op_pk_creation_mod_get()的解释和举例。
定义结构体:
先在HB中定义你所需要的结构体类型,再在TV中定义该结构体类型的变量。
统计一些速率方面的参数:
统计流速率的时候,首先应该在LocalStatistics中将这个统计项的CaptureMode
设成sum/time,然后在程序中每次收到一个数据包,就将这个包的长度L写入,
比如op_stat_write(handle,L),随后再马上调用一个op_stat_write(handle,0)来结束
这次写入,就可以了。
09-05-04
op_td_get_int()好像有好多种不同的用途?
在bus结构中可以用来记录信道中碰撞的次数。
“/*Ifthepreviouspacketendsjustasthenewonebegins,thisisnot
acollision(justanearmiss,orperhapsback-to-backpackets).””
在RadioPipelineStages中,对每一个帧都会计算它的信道速率,接收功率,信噪比,错误比特数,误比特率等参数。
但是,这些参数的获取以及设置都是用的形如
op_td_get_int(),op_td_get_dbl(),op_td_set_int(),op_td_set_dbl()这样的函数。
09-05-05
发送时延:
第一个比特发送到最后一个比特传输结束之间的时间间隔。
所有的链路类型中,均可复用下层模型
或管道阶段来计算时延值,也可由用户定制。
默认:
由发送机模块的数据速率和被传送数据包的长
度来计算发送时延。
TDA:
TransmissionDataAttributes传输数据属性,是包中的一块在存储区里的值,用于携带标准的和用户自定义的管道
信息。
TDA被指定于包中特定位置,可是整数或浮点数。
TDA的位置通过整数索引标识,不同的位置基于特定的链路
类型及管道阶段达成的协议。
当包进入管道后,仿真内核自动分配一定数目TDA,提供有关传输的管道阶段信息。
点到点链路模型,其中的参数txdelmodel(发送延时)和propdelmodel(传播延时)两个不能使用建立时的默认参数(dbu_txdel
和dbu_propdel),否则总出现“Error:
Tdaindex(15)isout-of-rangeforpacket(5)”的错误,我先是将这两个参数改为NONE,
错误没有了,但不符合实际情况,后来将二者分别改为:
dpt_txdel/dpt_propdel(因为我的这个链路模型是“双工点到点的”)。
最后错误消失了,而且从ODB中能够看出发送延时已经是正确的:
发送延时=链路速率×
包大小
09-05-09
今天这个错误是这样的:
<
RecoverableError>
>
*Time:
09:
06:
49&
ETH;
Ç
AElig;
Ú
Á
ù
Î
å
Ô
Â
09
*Product:
modeler
*Program:
op_runsim(Version10.0.APL1Build2291)
*System:
WindowsNT5.1Build2600
*Package:
process(process_onu)atmodule(top.OfficeNetwork.onu.buffer)
*Function:
sim_pro_err_livelock
*Error:
livelock_thresh(8192)transitionsperformedwithoutblockinginanunforcedstate,
indicatingpossiblelivelockinprocessdefinition.
T(1.5627e-005),EV(100),MOD(top.OfficeNetwork.onu.buffer),PROC(sim_pro_err_livelock)
原因:
HB中定义状态转移条件的宏时,两个自中断判断中没有加"
op_intrpt_type()==OPC_INTRPT_SELF"
造成了两个状态转移条件同时成立,于是系统迷茫了……
搜到别人出现这个错误的另一个原因:
将一个processmodel里的ldle状态设置成force类型了,(那个model
里只有1个state)
形成一个活锁。
昨天仿真系统差点崩溃,内存都不够用了,重新启动电脑N次,教训:
创建完Packets以后,尤其是用多个数据源产生了大量的数据,一定要及时地给这些包找个去处-op_pk_destroy(pkptr)或者弄一个sink模块直接把包op_pk_send(pkptr,SINK_INDEX)发给sink模块,让它去处理,否则内存可能就要被这些新产生而又没有销毁的包吞噬光了。