《 OPNET MODELER核心函数 》 .doc_第1页
《 OPNET MODELER核心函数 》 .doc_第2页
《 OPNET MODELER核心函数 》 .doc_第3页
《 OPNET MODELER核心函数 》 .doc_第4页
《 OPNET MODELER核心函数 》 .doc_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

opnet modeler核心函数1. 核心函数简介1.1 命名规则opnet中的核心函数具有非常标准的命名规则,以增强函数在c/c+代码中的可视性,避免名称与非opnet函或变量冲突。以下列出了一些简单的命名规则:l 名称均采用op_作为前缀,以标识其为opnet仿真内核提供的核心函数。l 函数名的第二部分为函数集名,用小写字母表示,通常是函数所处理对象的名称缩写,如pk、ici、stat等。l 函数名的第三部分是子函数集名,对核心函数进一步进行了分类,如核心函数op_pk_nfd_set()中的nfd。l 核心函数主要用于对对象的操作。在函数名中,对象总是出现在动作之前,比如名称中的attr_set和subq_flush就将对象(attribute和subqueue)放在动作(set和flush)之前。1.2 参数类型大部分核心函数的参数和返回值都 是标准的c/c+数据类型,如int、double、char*。除此之外,在仿真数据结构中还通过c/c+的typedef语句定义了许多参数和返回值作为特殊的opnet数据类型。尽管用户通过核心函数来操作opnet数据类型,可能对每个数据类型的基本内容都越来越熟悉,但用户并不需要关心数据类型确切的内部结构,因为opnet仿真数据结构的内容因软件版本的不同而有所改变。表1-1列举了部分特殊的数据类型。表1-1 opnet中部分特殊数据类型基本数据类型声明示例anvid (viewer id)anvid vid;anmid (macro id)anmid mid;andid (drawing id)andid did;booleanboolean bool;compcodecompcode comp_status;distributiondistribution* dist_ptr;evhandleevhandle evh;stathandlestathandle stat_handle;iciici* ici_ptr;listlist* list_ptr;objidobjid objid;packetpacket* pkptr;pmohandlepmohandle pmh;log_handlelog_handle config_log_hndl;procedureprocedure proc;prohandleprohandle proh;sbhandlesbhandle sbh;1. animation entity动画集由操作中特定动画实体的id号表示。之所以采用id号来代替中的指针,是因为对于动画观察函数op_vuanim,id号通信超过了了仿真范围。尽管id号只是存储在规则的c/c+整型变量中的简单整数值,但opnet也声明了特定的数据类型来准确标记id参数和变量。三种基于id号的动画实体包括浏览器(viewer)、宏(macro)和图画(drawing)。2. boolean核心函数通过返回布尔值来表示结果是否正确。布尔值可与符号常量opc_true和opc_false进行比较。3. compcode核心函数通过返回compcode值来表示操作是否正确完成。compcode的值可与符号常量opc_compcoed_success和opc_compcoed_failure进行比较。4. distributiondistribution是一种与概率密度函数(pdf)一致的数据结构,它描述了随机数到特定数字输出的映射。distribution包含一张对映射进行编码的数字表,指出完成该映射的算法。对于基于表格的distribution,数据从pdf编辑器的pdf模型文件中读入。这些结构均由dist函数集中核心函数操作。5. event handle事件句柄是惟一一种确定未决仿真事件(中断)的数据结构。该结构主要在intrpt核心函数集中使用,因此可通过它们处理预设的中断。注意,事件句柄是一种数据结构,而不是整型或指针。因此不能把它存储在整型或指针变量中。6. statistic handle统计量句柄是一种确定动态产生的全局和局部统计量的数据结构。统计量句柄的数据类型为stathandle,获得盲文句柄的惟一方法是通过核心函数的stat函数集来注册统计量。注册统计量时将为其指定一个惟一的名称,并和时间一起存储在一个输出矢量中。局部统计量用在特定处理器或队列中;全局统计量由仿真模型中的实体共享,每个实体分布式地作用于输出矢量。7. iciici(interface control information,接口控制信息)是与仿真中断相关的结构化数据的集合用于进程间通信机制,传输分层协议接口的控制信息。ici由ici函数集中的杧函数操作。8. listlist是存储在双向链表中的数据元素的集合。list中的元素可按照从简单的c/c+数据类型在复杂的数据结构进行排列。list学用于临时存储数据结构组,可包含各种不同类型的元素,但通常并不这样使用。对list的大小没有限制,可在其任意位置插入或移除元素。list由prg函数集的list子函数集操作。9. object id对像id惟一地确定了一个仿真对象。通过使用objid数据类型声明该标识符,供id、ima、topo和pk函数集使用。10. packetpacket是数据封装和传输建模中的基本仿真实体。它由pk函数集中的核心函数操作。11. memory object type某些建模需要为其动态分配内存来存储各种信息。每个相同大小数据组成的集合记为一个池,内核为每个池分配大量的数据条目以提高标准内存分配器的效率。每个汇聚池中的内存对象必须通过调用核心函数op_prg_pmo_define()来创建,该函数将返回一个汇聚内存对象句柄来标识池,用pmohandle表示。创建汇聚内存对象时都为其分配了一个惟一的名称,仿真模型中的实体可以共享汇聚内存对象。12. log handle当在仿真调试或数据分析中创建仿真日志时,日志句柄对于每个日志项非常必要。 13. procedure某些核心函数将c/c+函数指针作为参数,但并不声明这些参数作为指向返回整型值的函数的指针,而是定义了一种特殊的数据类型procedure。14. process handle进程句柄是惟一一种标识仿真中活动进程的数据结构,由pro函数集中的核心函数使用。需注意进程免柄是数据结构,而不是整形或指针,因而不能将它们存储在整型或指针变量中。15. sar buffer handlesar缓冲句柄是惟一一种标识sar(segmentation & reassembly,分段与重组)缓冲区的数据结构。sar缓冲区缓存包序列,并可对包进行分段和重装。sar缓冲区由sar函数集中的核心函数创建,该函数返回访问新缓冲区的sar缓冲句柄。sar函数集函数利用sar缓冲名柄来处理被标识的sar缓冲区。与其他opnet数据结构一样,不能将sar缓冲句柄分配到整型或指针变量中。16. vartype除标准的c/c+数据类型和特殊的仿真内核数据类型外,opnet还提供了另外一种数据类型vartype。vartype数据类型可用在变量声明或类型转换语句中,它是opnet文档中的特殊关键词,表示函数参数可以是多种可能的数据类型之一。类型参数的传递由c描述的调用函数确定,vartype用于确定哪个函数参数可用来传递多种数据类型。但需要注意的是,vartype并不像c中的varargs那样可传递多种参数,每个vartype参数一次只能接受一个传递值。vartype类型的参数,可接受int、double或指向数据结构的指针。vartype*是vartype的一种变体,它可接受指向变量类型的指针。vartype*类型的参数可接受的值包括:指向整型的指针、指向double的指针、指向数据结构的指针,或参数用于返回filled-in值时指向数据结构指针的指针。每个核心函数中都描述了可被vartype或vartype*参数接受的类型值。具有该类型参数的部分核心函数如表1-2所示。表1-2 带vartype参数的核心函数核心函数变量类型参数op_ima_obj_attr_set()vartypeop_ima_obj_attr_get()vartype* (fill-in)op_pk_fd_set()vartypeop_pk_fd_get()vartype* (fill-in)op_pk_nfd_set()vartypeop_pk_nfd_get()vartype* (fill-in)op_ini_attr_set()vartypeop_ini_attr_get()vartype* (fill-in)op_prg_list_insert()vartype*op_prg_mem_copy()vartype*op_prg_mem_free()vartype*返回变量类型参数的部分核心函数如表1-3所示。表1-3 返回变量类型参数的核心函数核心函数变量类型参数op_prg_list_access()vartype*op_prg_list_remove()vartype*op_prg_mem_alloc()vartype*表1-4 易冲突的函数名accept()index()send()access()kill()signal()audit()link()socket()bind()listen()stat()clear()open()tell()clock()pipe()truncate()close()poll()unlink()connect()read()wait()exit()select()1.3 多线程安全无线模块允许opnet采用多处理器进行收/发信机管道计算。为确保并行传输的正确性和尽可能快速,五个管道阶段必须采用多线程安全核心函数。核心函数定义了三个多线程安全级别,分别是mt-safe、mt-unsafe和forced serialization。(1)mt-safe:该类核心函数已手动进行重编码以支持多线程。多个线程可安全地并行执行该类核心函数。(2)mt-unsafe:在该安全级别下,若在核心函数中采用并行处理,将导致性能的下降,达不到预期的结果。使用mt-unsafe核心函数时,应当执行适当的代码序列化(serialization)。(3)forced serialization:对于所有已手动重编码以支持多线程的核心函数,仿真内核采用内部互斥来执行严格的序列化。最终每个核心函数将进行手动重编码来支持多线程,它们的状态也将由forced serialization变为mt-safe。2. 基本核心函数opnet modeler10.0提供了21个核心函数集,只有熟悉核心函数才能在建模时方便地进行代码编写。本节按照不同的功能对常用的核心函数作了详细的介绍。2.1 内部模型访问函数集ima(internal model access,内部模型访问)函数集是一系列提供对仿真实体动态访问的核心函数的集合,其中仿真实体包括仿真属性、对象属性、对象命令(object command)和进程状态变量。1. op_ima_obj_attr_get (objid,attr_name,value_ptr)此核心函数的作用是获取给定对象的某属性值,其参数说明如表2-1所示。表2-1 op_ima_obj_attr_get()函数的参数说明参 数类 型描 述objidobjid给定对象的对象idattr_nameconst char*属性名(必须是给定对象中已定义的,否则将出错)value_ptrvartype*指向存储属性值变量的指针(vartype* 可接受字符串或指向整型 、double以及复合属性对象id指针。当为字符串时,字符数组必须足够大,以容纳属性值。参数指针类型必须与给定属性的数据类型相匹配,否则将出错。如果属性类型是toggle,返回值即为opc_boolint_enabled或opc_boolint_disabled;如果属性类型是pofile,返回值即为包含访问profile所需的必要信息的pofile specification(prgt_profile_spec) 1)返回值compcode如果成功获取属性值,即返回opc_compcode_success,否则返回opc_compcode_failure。如果需要获取给定对象的复合属性值,则若复合属性相等,value_ptr的值即设为复合属性中的一个对象id,并返回opc_compcode_success;若不相等,则返回opc_compcode_failure。注意:在复合属性中,所谓的“相等”,是指复合属性中的所有属性都具有相同的名称、类型和值,并且复合忏悔的所有子对象也相等。2)详解对于网络域对象(子网、节点和链路)、节点域对象(模块)以及预先由网络、节点、进程或链路编辑器定义的复合属性,都可以获取对象属性值。提升的属性值可以从父对象中获取。要引用提升属性,必须为每个中间对象的属性名附加一个点分前缀。例如,若要在节点级获取进程属性,则属性名应在包含该进程的模块名称之前。并不是所有的对象属性都可仿真中调用该函数来获取。比如simulation/access字段被标记为n/a的属性就不能通过调用op_ima_obj_attr_get()来获取。此外,该核心函数的命令级别为forced serialization。3)目的该函数提供了一种在仿真中动态获取对象属性的机制。它可用于处理器或队列确定自身或网络中其他对象的属性值。将该函数与op_ima_obj_attr_set()结合,无需包、ici或中断递送就可提供远程进程间的通信。4)错误program abort:分段错误(由无效值指针、指针所指内存不足或指向无效的attr_name地址所引起)。recoverable error:对象无法识别属性名。recoverable error:对象id溢出。recoverable error:对象id指向受限对象(由受护模型中的相关对象引起)。5)相关函数采用op_ima_obj_attr_set()、op_ima_obj_attr_set_db1()、op_ima_obj_attr_set_int32()和op_ima_obj_attr_set_str()设置对象属性值。采用op_ima_sim_attr_get()、op_ima_sim_attr_get_db1()、op_ima_sim_attr_get_int32()和op_ima_sim_attr_get_str()获取仿真属性值。采用op_ima_obj_svar_get()获取进程状态变量值。采用op_ima_obj_command()向对象发出一个命令。采用op_id_self()获取所属处理器或队列的对象id。采用op_id_from_name()获取对象的对象id。2. op_ima_obj_attr_set (objid,attr_name,value_ptr)此核心函数的作用是设置给定对象的某属性值,其参数说明如表2-2所示。表2-2 op_ima_obj_attr_set()函数的参数说明参 数类 型描 述objidobjid给定对象的对象idattr_nameconst char*属性名value_ptrvartype*指定属性需设置的新值1)返回值compcode如果成功获取属性值,即返回opc_compcode_success,否则返回opc_compcode_failure。2)详解对于网络域对象(子网、节点和链路)、节点域对象(模块)以及预先由网络、节点、进程或链路编辑器定义的复合属性,都可以设置对象属性值。在对象中可以设置提升对象的值。并不是所有的对象属性都可仿真中调用该函数来设置。比如simulation/access字段被标记为n/a的属性就不能通过调用op_ima_obj_attr_set()来设置。此外,该核心函数的命令级别为forced serialization。3)目的该核心函数提供了一种在仿真过程中动态设置对象属性的机制,可用于处理器或队列控制其他模块。与函数op_ima_obj_attr_get()结合,无需包、ici或中断递送就可提供远程进程间的通信。不过需要注意的是,远端对象值的改变并不会引起中断,只是当修改后的对象再次调用函数op_ima_obj_attr_get()获取其属性时才会产生影响。4)错误program abort:分段错误(由无效值指针、attr_name地址无效或值类型错误所引起)。recoverable error:对象无法识别属性名。recoverable error:对象id溢出。recoverable error:对象属性为只读。recoverable error:属性值无效。recoverable error:对象id指向受限对象。5)相关函数采用op_ima_obj_attr_get()、op_ima_obj_attr_get_db1()、op_ima_obj_attr_get_int32()和op_ima_obj_attr_get_str()设置对象属性值。采用op_ima_sim_attr_get()、op_ima_sim_attr_get_db1()、op_ima_sim_attr_get_int32()和op_ima_sim_attr_get_str()获取仿真属性值。采用op_ima_obj_svar_get()获取进程状态变量值。采用op_ima_obj_command()向对象发出一个命令。采用op_id_self()获取所属处理器或队列的对象id。采用op_id_from_name()获取对象的对象id。3. op_ima_sim_attr_get (attr_type, attr_name, value_ptr)此核心函数的作用是获取仿真属性值,其说明如表2-3所示。表2-3 op_ima_sim_attr_get()函数的参数说明参 数类 型描 述attr_typeint属性类型(可以为opc_ima_integer、opc_ima_double、opc_ima_toggle或opc_ima_string)attr_nameconst char*属性名value_ptrvartype*指定存储属性值变量的指针1)返回值compcode如果成功获取属性值,即返回opc_compcode_success,否则返回opc_compcode_failure。2)详解仿真属性与子网发属性、节点属性、模块属性以及进程属性均不同,它不在制定模块规范阶段定义,而在仿真运行期间动态定义。仿真属性是通过一些环境属性机制来进行赋值的,包括仿真命令行、环境数据库(/op_admin/env_db)、shell变量或环境文件。该函数将触发仿真的内部环境数据库扫描可用值,如果无法在现有程序环境中为仿真属性找到一个值,那么它将在标准输出设备上打印一个提示(可用仿真的noprompt环境属性来取消用户提示),请求输入一个值。一旦提示出现,就将打印一个属性的默认值。注意:默认值是调用核心函数时传递给参数的value_ptr值,而不使用进程模型属性列表中的默认初始值。因此在调用该函数时,必须事先定义value_ptr。如果在仿真程序环境中能够找到给定属性,或当提升时值时被显示输入,那么认为函数执行成功并返回值opc_compcode_success。如果内核必须要引用value_ptr的值,则返回opc_compcode_failure。3)目的该核心函数提供了一种获取在仿真运行期间设置的仿真属性的机制。将该函数与用环境属性来分配仿真属性结合起来,不仅可以获取网络范围内的关键参数,还可获取影响进程逻辑操作的进程级参数。4)错误program abort:分段错误(由无效值指针、指针所指内存不足或指向畸形的attr_name参数引起)。program abort:内存分配失败。recoverable error:属性类型不可识别。5)相关函数采用op_ima_obj_attr_get()、op_ima_obj_attr_get_db1()、op_ima_obj_attr_get_int32()和op_ima_obj_attr_get_str()设置对象属性值。采用op_ima_sim_attr_set()、op_ima_sim_attr_set_db1()、op_ima_sim_attr_set_int32()和op_ima_sim_attr_set_str()设置对象属性值。采用op_ima_obj_svar_get()获取进程状态变量值。采用op_ima_obj_command()向对象发出一个命令。2.2 分布函数集dist(distribution)函数集是一系列根据特定概率分布产生随机值的核心函数集合。只要具有随机行为的仿真都可以使用这些随机值中的一种或几种,如计算中断的到达时间、产生通信量目的地址或确定节点是否应被去激活等。1. op_dist_load (dist_name, dist_arg0, dist_arg1)此核心函数的作用是加载分布以产生随机值流,其参数说明如表2-4表2-4 op_dist_load()函数的参数说明参 数类 型描 述dist_nameconst char*被加载的分布名称,通常为字符串常量dist_arg0double分布的附加参数#0dist_arg1double分布的附加参数#11)返回值distribution *指向被加载分布的指针。如果发生可恢复错误,则返回常量opc_nil。函数返回值一般存储在distribution *类型的状态变量中,稍后现传递给相关核心函数 op_dist_outcome()。2)详解分布是根据名称来确定的,可以是预定义的分析分布、采用pdf编辑器建立的用户自定义pdf模型或ema-specified pdf模型。执行预定义的分布可以看作是通过一两个数值参数调用该核心函数的参数化算法。另外两种类型的分布是后缀为“.pd.s”的表格式数据文件,调用该函数时将其加载到内存中。需要注意的是,即使预定义的分布在models/std/base文件夹中有相应的“.pd.s”文件,但这些文件都是零字节的,不包含任何分布信息,只是让分布能够显示在opnet菜单中。当加载用户自定义的pdf时,将忽略参数dist_arg0和dist_agr1。此外,该核心函数的安全级别为mt-safe。3)目的该核心函数提供作为随机数发生器的概率分布。该函数主要用于加载分布,以在处理器产生的包之间提供随机时间间隔。任何随机分布的仿真参数都可以通过该函数来获取。实际的随机值是通过调用函数op_dist_outcome()来获取的。4)错误program abort:分段错误(由无效分布名指针引起)。program abort:内存分配失败。recoverable error:分布名不可识别。5)相关函数采用op_dist_outcome()或op_dist_outcome_ext()获取已加载分布的随机值。采用op_dist_uniform()获取均匀分布的随机值。采用op_dist_unload()释放分布占用的内存。2. op_dist_outcome (dist_ptr)此核核心函数的作用是为具有特定分布的随机变量产生一个浮点数,其参数说明如表7-5。表2-5 op_dist_outcome()函数的参数说明参 数类 型描 述dist_ptrdistribution*指向被加载分布的指针1)返回值double具有特定分布随机变量的结果。如果发生可恢复错误,则返回常量 opc_dbl_invalid。2)详解特定分布可以是预定义的算法分布,也可以是之前通过函数op_dist_load()加载的数字型表格式分布。该核心函数执行表格式分布的列表查询,并对算法分布(如指数分布)进行数字计算。该核心函数使用的随机数流是调用bsd random()过程产生的,所有分布函数集中的函数和发生器模块都可共享此随机数流。随机数流依赖于初始的种子数(seed),如果仿真输入(包括相同的随机seed)相同,则仿真结果可重复。此外,该核心函数的安全级别为mt-safe。3)目的该核心函数提供了一种获取符合某概率分布的随机值的机制。该函数学用于计算处理器产生的包之间的随机时间间隔。任何随机分布的仿真参数都可以通过它来获取。4)错误program abort:分段错误(由无效分布指针引起)。recoverable error:分布指针为nil。5)相关函数采用op_dist_load()加载分布。采用op_dist_uniform()获取均匀分布的随机值。采用op_dist_unload()释放分布占用的内存。采用op_dist_outcome_ext()获取用户自定义的随机数发生器产生的随机数。采用op_intrpt_schedule_self()、op_intrpt_schedule_remote()或op_intrpt_schedule_call()分别产生自中断、远程中断和过程中断。3. op_dist_uniform(limit)此核心函数的作用是产生一个均匀分布的随机值,其参数说明如表2-6所示。表2-5 op_dist_uniform()函数的参数说明参 数类 型描 述limitdouble均匀分布的取值范围1)返回值double产生的均匀分布的随机值,范围在0.0,limit 中。2)详解该核心函数使用的随机数流是调用bsd random()过程产生的,所有分布函数集中的函数和发生器模块都可共享此随机数流。随机数流依赖于初始的种子数(seed),如果仿真输入(包括相同的随机seed)相同,则仿真结果可重复。如果参数limit为负数,则返回值将是一个大于limit的均匀分布的负数此外,该核心函数的安全级别为mt-safe。3)目的该核心函数为普通的建模提供了一种获取均匀分布随机数的机制,例如可用于数据链路协议计算随机超进。4)错误无错误捕获5)相关函数采用op_dist_load()加载一个概率分布。采用op_dist_outcome()根据已加载的概率分布,获取一随机值。2.3 进程函数集进程函数集是一系列用于在一个处理器或队列模块中创建和管理多个进程的核心函数的集合。进程是进程模型的一个实例,进程模型是在opnet的进程编辑器中开发的特定类型 进程的行为和功能规范。1. op_pro_create (model_name, ptc_mem_ptr)此核心函数的作用是创建一个新的进程作为特定进程模型的实例,并允许安装parent-to-child共享内存,作为当前进程和创建的子进程间通信机制,其参数说明如表2-7所示。表2-7 op_dist_load()函数的参数说明参 数类 型描 述model_nameconst char*进程模型名称ptc_mem_ptrvartype*当前进程和被创建进程共享的parent-to-child内存块的地址(该内存块格式是用户自定义的。通常若无内存共享,则传递值opc_nil)1)返回值prohandle进一步处理被创建子进程的进程句柄。2)详解仿真内核支持单个队列或处理器模块中任意多个不同类型进程的并存。除了根进程,其他所有进程都通过该核心函数创建。只有当提供的参数process_model引用当前仿真中已声明的进程,该核心函数才会执行成功。在为仿真系统的任一处理器或队列模块的进程模型属性赋值,或在通过进程编辑器将进程声明为另一进程的子进程时,均采用进程模型的隐式声明。每个通过该核心函数创建的进程都可以利用共享内存与创建它的进程进行通信。共享内存是用户自定义的内存块,其地址必须作为ptc_mem_ptr参数传递给该函数。此外,该核心函数的安全级别为forced serialization。3)目的该核心函数提供了一个进程,其可以创建在相同模块中操作的子进程。每个子进程作为一个进程模型实例独立存在,并维持自身的状态。4)错误program abort:核心函数需要进程上下文。program abort:无法创建进程。program abort:进程的描述符分配失败。program abort:初始化进程失败。recoverable error:进程模型未被声明。5)相关函数采用op_pro_invoke()调用进程模型。子进程采用op_pro_parmem_access()获取parent_to_child共享内存。采用op_pro_id()确定进程的惟一整数标识符。2. op_pro_destroy_options(pro_handle, options)销毁动态创建的进程和该进程的所有预设事件,其参数说明如表2-8所示。表2-8 op_pro_destroy_options ()函数的参数说明参 数类 型描 述pro_handleprohandle被销毁进程的进程句柄optionsint被执行的可选操作1)返回值compcode表示仿真内核是否成功销毁进程的完成代码,包括opc_compcode_success和opc_compcode_failure。2)详解该函数允许进程销毁同一模块中的任意其他动态进程,因此跟进程是惟一给定模块中不能被销毁的进程。此外,该函数还可移除被销毁进程的所有预设事件。其中,动态进程是通过核心函数op_pro_create()创建的,在仿真中可随时从模型中移除动态进程。适当终止进程可释放分配给进程的动态内存,但这也可能给建模带来一定影响。进程模型在销毁时会有一个特殊的逻辑片断,该片断是进程模型的终止块和销毁进程时仿真内核直接调用的包含其中的代码。代码片断中可能用到状态和临时变量。进程可以销毁自身,这时不返回任何值,除了终止块中的特定操作外,不执行任何操作。注意:内核对释放parent-to-child或参数内存不负任何责任。该核心函数可使用的option有:l opc_pro_destroy_opt_keep_events核心函数移除被销毁进程的任意预设事件。l opc_pro_destroy_opt_none默认操作。此外,该核心函数的安全级别为forced serialization。3)目的该核心函数提供了一个进程,其可以创建在相同模块中操作的子进程。每个子进程作为一个进程模型实例独立存在,并维持自身的状态。4)错误program abort:核心函数需要进程上下文。program abort: 分段错误(由畸形进程句柄导致)。recoverable error:进程句柄无效。recoverable error:进程句柄指向被销毁进程。recoverable error:进程句柄指向远程进程。recoverable error:进程句柄指向根进程。recoverable error:进程句柄指向活动进程。5)相关函数采用op_pro_create()创建新的进程并获取其句柄。采用op_prg_mem_free()释放通过函数op_prg_mem_alloc()分配的内存。采用op_pro_invoke()调用进程模型。采用op_pro_parmem_access()用于子进程获取parent_to_child共享内存。3. op_pro_self()此核心函数的作用是获取当前正在执行的进程的进行句柄。1)返回值prohandle当前正在执行的进程的进程句柄。在执行与该进程相关的操作,调用其他核心函数时可使用此句柄。2)详解当前执行的进程通常需要使用其自身的句柄作为进程和中断函数集中其他核心函数的参数。例如,该句柄可作为指针来获取父进程的句柄。其他典型应用包括获取进程的惟一id,销毁无用的进程本身。此外,该核心函数的安全级别为forced serialization。3)目的该核心函数为调用该核心函数的进程提供了一个进程句柄,作为进程和中断函数集中其他核心函数的参数。4)错误program abort:核心函数需要进程上下文。5)相关函数采用op_pro_id()获取进程的惟一整数id。采用op_prg_mem_free()销毁进程。采用op_intrpt_port_register ()为特定流或统计中断注册一个进程。采用op_intrpt_type_register()为特定类型中断注册一个进程。4. op_pro_invoke (pro_handle, argmem_ptr)该核心函数的作用是在当前事件和当前模块的止下文中调用进程。被调用进程将被暂停直到函数返回,其参数说明如表2-9所示。表2-9 op_pro_invoke()函数的参数说明参 数类 型描 述pro_handleprohandle被调用进程的进程句柄argmem_ptrvartype*通过函数op_pro_argmem_access()为被调用进程提供的参数内存块的地址1)返回值compcode表示调用是否成功的完成代码,返回代码包括opc_compcode_success和opc_compcode_failure。进程句柄过期或调用其他模块的进程都将引起调用失败。2)详解进程可调用同一模块中的其他进程。如果使用其他模块进程的进程句柄来调用该函数将引起可恢复错误。在同一事件中,对函数op_pro_invoke()的调用次数并没有任何限制。换句话说,调用函数op_pro_invoke()所导致中断的进程,可接着利用该函数调用其他进程。这种一连串的进程调用称为当前调用栈,就像c语言中的函数调用栈一样。仿真内核限制进程在当前调用栈中调用其他进程。当进行进程调用时,调用进程可建立一个内存块,供它和被调用进程共享。由于该内存可传递被调用进程的输入和输出参数,因而作为参数内存。若调用进程需要通过函数op_pro_argmem_access()来获取内存块地址,则地址必须作为参数传递给op_pro_invoke();若无此需要,则应传递常量opc_nil。此外,该核心函数的安全级别为forced serialization。3)目的多个进程可共同处理单一队列或处理器模块上下文中发生的事件。通常对进程进行分层组织,父进程根据不同事件的要求将事件处理任务交给合适的子进程。另外一种进程组织方式就是根据功能行来划分任务,如可根据进程收到的中断类型调用不同的子进程。大多数组织化机制都有一个共通处,即都需要在模块中临时传递对子进程或对等进程的执行控制权。这就需要通过函数op_pro_invoke()来完成,并提供需执行的进程句柄。4)错误program abort:核心函数需要进程上下文。program abort: 分段错误(由畸形进程句柄导致)。recoverable error:进程句柄无效。recoverable error:进程句柄指向被销毁进程。recoverable error:进程句柄指向远程进程。recoverable error:进程句柄指向活动进程。5)相关函数采用op_pro_argmem_access()获取调用参数内存的访问权。采用op_pro_parent()获取父进程的进程句柄。采用op_pro_create()创建新的进程并获取其句柄。5. op_pro_argmem_access ()此函数的作用是获取进程调用所传递的参数内存的地址。1)返回值vartype*调用进程提供的用户自定义内存块的地址。若仿真内核直接调用进程或调用进程不愿传递任何参数内存,则返回符号常量opc_nil。2)详解参数磪存是一个用户自定义的内存块,其地址由进程调用其他进程时传递。内存的格式和内容都是用户自定义的,只有其地址由仿真内核管理。仿真内核保证只有通过函数传递的内存地址阻塞时,才能被调用进程访问,并将控制权返回给调用进程。地于直接由仿真内核调用的进程,该核心函数将返回一个空地址opc_nil。直接由内核调用的进程和通过函数op_pro_invoke()调用的进程应在使用该指针访问参数值之前检查返回的地址是否为opc_nil,否则将发生分段错误。调用函数op_pro_invoke()可使用参数内存机制,这时被调用进程并不需要接收传入的值或向调用进程返回任何数据。在这种情况下,通常在需要参数内存的情况下,调用函数op_pro_invoke()应传递符号常量opc_nil。此外,该核心函数的安全级别为forced serialization。3)目的该核心函数提供了一种在调用进程和被调用进程间共享内存的机制。内存可在调用前建立,以包含输入参数值。被调用进程可以检查检查该参数值,并利用它来处理事件。同样被调用进程可修改内存,以向调用进程返回输出参数,而调用进程可在函数op_pro_invoke()返回之后检查内存的内容。该核心函数提供了一种在调用进程和被调用进程间共享内存的机制。内存可在调用前建立,以包含输入参数值。被调用进程可以检查该参数值,并利用它。4)错误program abort:核心函数需要进程上下文。5)相关函数采用op_pro_invoke()调用进程模型。采用op_pro_modmem_access()与同一模块中的其他进程共享信息。采用op_pro_parmem_access()与进程及其父进程共享信息。2.4 事件函数集op_ev_cancel(evhandle)函数的作用是撤销预设的事件,其参数说明如表2-10所示。表2-10 op_ev_cancel()函数的参数说明参 数类 型描 述evhandleevhandle被取消事件的事件句柄。事件句柄可以通过本函数集中的op_ev_seek_time()、op_ev_next()、op_intrpt_schedule_self()等函数获取1)返回值compcode表示操作是否成功的完成代码,包括符号常量opc_compcode_success和opc_compcode_failure。2)详解取消事件就是将其从仿真事件列表中移除,并阻止其向目的模块发送。该函数只能用于取消未决的事件,取消已经发送或正在执行的事件将导致错误发生。因为仿真内核将事件信息缓存到了相应的事件句柄中,这样无需查找就可很快对事件进行定位,所以利用该函数取消事件时不必考虑效率问题。在事件发送之前使用该函数将其取消将比事件发送到目的地后再将其取消更加高效。此外,该核心函数的安全级别为forced serialization。3)目的该核心函数提供了一种撤销无用事件的机制。该函数常用于取消op_intrpt_schedule_self()函数预设的超时中断事件。如果在超时前收到ack包或有其他中断发生,则该函数将取消超时事件,并重置定时器。4)错误program abort: 分段错误(由畸形进程句柄导致)。recoverable error:事件句柄指向无效或当前还未预设的事件。recoverable error:无法取消当前事件。recoverable error:无法取消正在进行的事件。recoverable error:无法取消未定位事件。5)相关函数采用op_ev_pending()确定事件是否可取消。采用op_intrpt_schedule_self()设置进程的自中断。采用op_intrpt_clear_self()撤销进程的未决中断。2.5 仿真函数集1. op_sim_time()此函数的作用是获取当前仿真时间。1)返回值double当前仿真时间。该双精度浮点数以秒为单位表示了当前的仿真时间,从仿真中断(即op_sim_time()返回零值)时刻开始计时。2)详解仿真时间是一个双精度浮点数,表示与当前仿真事件相关的时间值。在处理一个事件时,仿真时间始终保持原值,只有当在t时刻完成了该事件并在t+dt时刻开始另一个事件时,仿真才开始继续计时。我们将这种使用不规则模式计时的仿真方法称为事件驱动的仿真方法(区别于规则的时间驱动的仿真方法)。在仿真开始执行事件之前,无线发信机模块的收信机组管道阶段调用该函数,或无线域中初始回叫信号过程调用该函数时,该函数都将返回“-1”。此外,该核心函数的安全级别为forced serialization。3)目的该核心函数提供了一种获取当前仿真时间的机制,可用于将来预设事件时计算绝对时间;确定过去某事件相对于当前仿真时间的延时;在标准输出设备或其他

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论