opnet的simple_source模块学习 分类: opnet 2014-05-18 09:50 170人阅读 评论(0) 收藏
simple_source模块可以在外部设置的属性
有四个局部统计量,分别为产生的bit速率、包速率、包大小,包间隔
状态机为三个非强制对象,在头文件里定义了自中断和转移条件。
/*Include files. */
#include <oms_dist_support.h>
/*Special attribute values. */
#define SSC_INFINITE_TIME -1.0
/*Interrupt code values. */ 自定义中断
#define SSC_START 0
#define SSC_GENERATE 1
#define SSC_STOP 2
/* Nodeconfiguration constants. */
#define SSC_STRM_TO_LOW 0
/* Macrodefinitions for state */
/*transitions. */定义转移条件
#define START (intrpt_code == SSC_START)
#define DISABLED (intrpt_code == SSC_STOP)
#define STOP (intrpt_code == SSC_STOP)
#define PACKET_GENERATE (intrpt_code == SSC_GENERATE)
/*Function prototypes. */
staticvoid ss_packet_generate(void);
Init非强制状态的入口程序为
/* Atthis initial state, we read the values of source attributes */包含源的属性定义
/* andschedule a selt interrupt that will indicate our start time */表明开始的时间
/* forpacket generation. */
/* Obtainthe object id of the surrounding module. */
own_id = op_id_self ();获得所属处理器或队列的对象ID
/* Readthe values of the packet generation parameters, i.e. the */
/*attribute values of the surrounding module. */获取给定对象的某属性
op_ima_obj_attr_get
(own_id,"Packet Interarrival Time", interarrival_str);包间隔
op_ima_obj_attr_get(own_id, "Packet Size", size_str); 包大小
op_ima_obj_attr_get(own_id, "Packet Format", format_str);包格式
op_ima_obj_attr_get(own_id, "Start Time", &start_time);开始时间
op_ima_obj_attr_get(own_id, "Stop Time", &stop_time);停止时间
/* Loadthe PDFs that will be used in computing the packet */
/*interarrival times and packet sizes. */从PDF中加载分布
interarrival_dist_ptr= oms_dist_load_from_string (interarrival_str);
pksize_dist_ptr = oms_dist_load_from_string (size_str);
/* Verifythe existence of the packet format to be used for */
/*generated packets. */
if(strcmp (format_str, "NONE") == 0) 检查是否为无格式的包
{
/* We will generate unformattedpackets. Set the flag. */
generate_unformatted = OPC_TRUE;
}
else
{
/* We will generate formatted packets.Turn off the flag. */
generate_unformatted = OPC_FALSE;
/* Get the list of all available packetformats.*/函数返回一系列包格式的名字
pk_format_names_lptr =prg_tfile_name_list_get (PrgC_Tfile_Type_Packet_Format);
/* Search the list for the requestedpacket format.*/查找所需要的包格式
format_found = OPC_FALSE;
for (i = prg_list_size(pk_format_names_lptr); ((format_found == OPC_FALSE) && (i > 0));i--)
{
/* Access the next formatname and compare with requested */
/* format name. */
found_format_str = (char *)prg_list_access (pk_format_names_lptr, i - 1);
if (strcmp (found_format_str,format_str) == 0)
format_found =OPC_TRUE;找到了所需要的包格式
}
if (format_found == OPC_FALSE)
{
/* The requested format doesnot exist. Generate */
/* unformatted packets. */
generate_unformatted =OPC_TRUE;
/* Display an appropriatewarning.*/没有找到需要的包格式,输出警告
op_prg_odb_print_major("Warning from simple packet generator model (simple_source):",
"Thespecified packet format", format_str,
"isnot found. Generating unformatted packets instead.", OPC_NIL);
}
/* Destroy the lits and its elementssince we don't need it */
/* anymore. */
prg_list_free(pk_format_names_lptr);释放内存
prg_mem_free (pk_format_names_lptr);
}
/* Makesure we have valid start and stop times, i.e. stop time is */
/* notearlier than start time. */
if((stop_time <= start_time) && (stop_time != SSC_INFINITE_TIME))
{如果结束时间早于开始时间或结束时间不为无穷
/* Stop time is earlier than starttime. Disable the source. */
start_time = SSC_INFINITE_TIME;
设置开始时间为无穷并且输出警告
/* Display an appropriate warning. */
op_prg_odb_print_major ("Warningfrom simple packet generator model (simple_source):",
"Althoughthe generator is not disabled (start time is set to a finite value),",
"astop time that is not later than the start time is specified.",
"Disablingthe generator.", OPC_NIL);
}
/*Schedule a self interrupt that will indicate our start time for */
/* packetgeneration activities. If the source is disabled, */
/*schedule it at current time with the appropriate code value. */
if(start_time == SSC_INFINITE_TIME)
如果开始时间是无穷,安排自中断开始时间为仿真时间,否则为实际开始时间
{
op_intrpt_schedule_self (op_sim_time(),
SSC_STOP);
}
else
{
op_intrpt_schedule_self (start_time,
SSC_START);
/* In this case, also schedule theinterrupt when we will stop */
/* generating packets, unless we areconfigured to run until */
/* the end of the simulation. */
仿真结束时间安排一个自中断
if (stop_time != SSC_INFINITE_TIME)
{
op_intrpt_schedule_self(stop_time,SSC_STOP);
}
next_intarr_time = oms_dist_outcome(interarrival_dist_ptr);通过一个分布生成一个浮点数
/* Make sure that interarrival time isnot negative. In that case it */
/* will be set to 0. */
if (next_intarr_time <0)
{
next_intarr_time = 0.0;
}
}
/*Register the statistics that will be maintained by this model. */声明局部统计量
bits_sent_hndl =op_stat_reg ("Generator.Traffic Sent (bits/sec)", OPC_STAT_INDEX_NONE,OPC_STAT_LOCAL);
packets_sent_hndl = op_stat_reg ("Generator.Traffic Sent(packets/sec)", OPC_STAT_INDEX_NONE,OPC_STAT_LOCAL);
packet_size_hndl = op_stat_reg ("Generator.Packet Size(bits)", OPC_STAT_INDEX_NONE, OPC_STAT_LOCAL);
interarrivals_hndl = op_stat_reg ("Generator.PacketInterarrival Time (secs)", OPC_STAT_INDEX_NONE, OPC_STAT_LOCAL);
init出口程序
/*Determine the code of the interrupt, which is used in evaluating */
/* statetransition conditions. */
intrpt_code= op_intrpt_code ();
init转到generate状态时的执行的函数代码
staticvoid
ss_packet_generate(void)
{
Packet* pkptr;
double pksize;
/** This function creates a packetbased on the packet generation**/
/** specifications of the source modeland sends it to the lower layer.**/
FIN (ss_packet_generate ());
/* Generate a packet size outcome. */
pksize = (double) ceil(oms_dist_outcome (pksize_dist_ptr));
ceil返回大于或等于指定表达式的最小整数
/* Create a packet of specified formatand size.*/
if (generate_unformatted == OPC_TRUE)
{
/* We produce unformattedpackets. Create one. */
pkptr = op_pk_create(pksize);
}
else
{
/* Create a packet with the specifiedformat.*/
pkptr = op_pk_create_fmt(format_str);创建一个预定义结构的包,返回包格式
op_pk_total_size_set (pkptr,pksize); 设置包的大小
}
/* Update the packet generationstatistics. */
op_stat_write (packets_sent_hndl, 1.0);
op_stat_write (packets_sent_hndl, 0.0);
op_stat_write (bits_sent_hndl, (double)pksize);
op_stat_write (bits_sent_hndl, 0.0);
op_stat_write (packet_size_hndl,(double) pksize);
op_stat_write (interarrivals_hndl,next_intarr_time);
/* Send the packet via the stream tothe lower layer. */
op_pk_send (pkptr, SSC_STRM_TO_LOW);将包发送到输出包流中
FOUT;
}
generate状态的入口代码
/* At theenter execs of the "generate" state we schedule the */
/*arrival of the next packet. */
next_intarr_time= oms_dist_outcome (interarrival_dist_ptr);
/* Makesure that interarrival time is not negative. In that case it */
/* will beset to 0. */ 确定包生成的间隔时间是有效的
if(next_intarr_time <0)
{
next_intarr_time = 0;
}
next_pk_evh= op_intrpt_schedule_self (op_sim_time () + next_intarr_time, SSC_GENERATE);
generate的出口代码
/*Determine the code of the interrupt, which is used in evaluating */
/* statetransition conditions. */
intrpt_code= op_intrpt_code ();
stop状态的入口代码
/* Whenwe enter into the "stop" state, it is the time for us to */
/* stopgenerating traffic. We simply cancel the generation of the */
/* nextpacket and go into a silent mode by not scheduling anything */
/* else. */
if(op_ev_valid (next_pk_evh) == OPC_TRUE)
{
op_ev_cancel (next_pk_evh);
撤销事件
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
opnet的simple_source模块学习 分类: opnet 2014-05-18 09:50 170人阅读 评论(0) 收藏的更多相关文章
- C# IIS应用程序池辅助类 分类: C# Helper 2014-07-19 09:50 249人阅读 评论(0) 收藏
using System.Collections.Generic; using System.DirectoryServices; using System.Linq; using Microsoft ...
- 网站通用登录模块代码 分类: ASP.NET 2014-12-06 10:49 615人阅读 评论(0) 收藏
1.HTML部分: <form id="form1" runat="server"> <script src=".. ...
- iOS开源库--最全的整理 分类: ios相关 2015-04-08 09:20 486人阅读 评论(0) 收藏
youtube下载神器:https://github.com/rg3/youtube-dl 我擦咧 vim插件:https://github.com/Valloric/YouCompleteMe vi ...
- Hdu 1507 Uncle Tom's Inherited Land* 分类: Brush Mode 2014-07-30 09:28 112人阅读 评论(0) 收藏
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- Jquery easy UI 上中下三栏布局 分类: ASP.NET 2015-02-06 09:19 368人阅读 评论(0) 收藏
效果图: 源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- JqueryEasyUI 解决IE下加载时页面错乱的问题 分类: JavaScript JqueryEasyUI 2014-09-20 09:50 545人阅读 评论(1) 收藏
问题描述: 一直觉得jqueryeasyui在IE下的渲染效果不大好,尤其刚进入页面时的加载,页面会出现布局错乱,虽然是一闪而过,但是给用户的体验不好: 可以通过在页面onload时,增加一个遮罩层, ...
- PIGS 分类: POJ 图论 2015-08-10 09:15 3人阅读 评论(0) 收藏
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18209 Accepted: 8277 Description Mir ...
- Babelfish 分类: 哈希 2015-08-04 09:25 2人阅读 评论(0) 收藏
Babelfish Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 36398 Accepted: 15554 Descripti ...
- 多校3- RGCDQ 分类: 比赛 HDU 2015-07-31 10:50 2人阅读 评论(0) 收藏
RGCDQ Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practic ...
随机推荐
- Python中如何调用Linux命令
一.使用os模块 In [1]: import os #导入os模块 In [2]: os.system('ls') anaconda-ks.cfg epel-release-7-5.noarch.r ...
- Ubuntu ADSL拨号上网
一直在家用接ADSL的无线wifi上网,最近用了很久的NetGear无线路由器被我毁了,只好暂时用有线了.在Ubuntu Linux下也可直接使用ADSL拨号上网. 1.连接设备 这没什么可多说的,一 ...
- JavaScript中的string对象及方法
string对象 string对象的两种创建 var a="hello"; var b=new String("hello"); //下面是方法 //charA ...
- VSTO在幻灯片里面添加按钮对象
//添加Form窗体,窗体中添加Image控件,单击弹出"PPT"信息提示 //命名引用:using MF = Microsoft.Vbe.Interop.Forms; priva ...
- thinkphp获取特定字段的两种方法
thinkphp getField( )和field( ) 2014年10月05日 ⁄ 综合 ⁄ 共 1509字 ⁄ 字号 小 中 大 ⁄ 评论关闭 做数据库查询的时候,比较经常用到这两个,总是查手册 ...
- Vue实战Vue-cli项目构建(Vue+webpack系列之一)
用Vue比较长一段时间了,大大小小做了一些项目,最近想总结一下知识点,出一个Vue+webpack系列,先从项目构建说起--vue-cli. 由于是Vue+webpack这里就不赘述git那些东西,默 ...
- 基于FPGA的IIR滤波器
基于FPGA的IIR滤波器 by方阳 版权声明:本文为博主原创文章,转载请指明转载地址 ...
- thinkphp导出csv格式的表格
<?php /** * Created by PhpStorm. * User: hanks * Date: 2016/4/20 * Time: 13:51 */ namespace Home\ ...
- QPS的计算方法
每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量. 原理:每天80%的访问集中在20%的时间里,这20%时 ...
- GC机制总结
一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...