2.9中断函数集
Intrpt(Interrupt)函数集是提供具有输入中断信息的进程并可预设输出中断的核心函数的集合。
1. op_intrpt_schedule_self (time, code)
此核心函数的作用是为调用进程预设一个中断,其参数说明如表2-24所示。
表2-24 op_intrpt_schedule_self ()函数的参数说明
参数 | 类型 | 描 述 |
time | double | 预设的中断时间(该值为绝对仿真时间,而不是当前仿真时间的时延) |
code | int | 与中断关联的用户自定义数值代码(该值是一个完全由用户自定义的整数值,可作为预设中断的标识代码。当中断调用进程时,可通过函数op_intrpt_code()获取该代码) |
1)返回值
Evhandle——预设中断的事件句柄。该返回值可存储在一个状态变量中,以用于以后调用函数op_ev_cancel()时取消中断。
2)详解
调用该函数时将在仿真事件列表中加入一个代表预设自中断的新事件。一旦预设了事件,函数将立即返回调用进程的控制权。在延时期间,调用进程可自由进行其他任何活动。如果没有其他高优先级事件,预设的事件将会按时发生。当执行完所有的前期事件后且自中断事件位于仿真事件列表的表头时,即将其仿真时间设为当前仿真时间并执行事件,引发调用进程的自中断。进程可通过函数op_intrpt_code()获取与中断相关的代码。
当自中断表示超时或其他类似事件时,有必要取消无用的自中断。如在超时前收到了ack,则重置计时器。该函数返回的事件句柄将存储在一个状态变量中,将来就可利用该事件句柄调用函数op_ev_cancel()来取消中断,程序如下所示:
/*State variable declaration*/
Evhandle evh;
/*Self interrupt scheduling*/
evh=op_intrpt_schedule_self(sch_time,5);
/*Self interrupt canceling.*/
op_ev_cancel(evh);
此外,该核心函数的安全级别为Forced serialization。
3)目的
该核心函数提供了预设自中断的机制,常用来限制某个进程状态的持续时间。当模拟超时时,状态将保持在等待包的到达,而超时自中断就表示该状态的结束。当模拟延时时,状态将保持在执行任务,而“结束任务”自中断意味着任务完成并释放资源。时间间隔结束后,进程通常转入空闲状态或确定是否有其他未决任务需要执行。
4)错误
Program Abort:内存分配失败。
Program Abort:核心函数需要进程上下文。
Recoverable Error:预设时间小于当前时间。
Recoverable Error:预设时间是一个无效的double值。
5)相关函数
采用op_intrpt_schedule_remote()预设一个远程中断。
采用op_intrpt_force_remote()强制预设远程中断。
采用op_intrpt_schedule_call()预设一个过程中断。
采用op_ev_cancel()取消未决的自中断、远程中断或过程中断。
采用op_intrpt_code()获取与中断相关的代码。
2. op_intrpt_schedule_remote (time, code, mod_objid)
此核心函数的作用是为给定处理器或队列预设一个远程中断,其参数说明如表2-25所示。
表2-25 op_intrpt_schedule_remote()函数的参数说明
参数 | 类型 | 描 述 |
time | double | 预设的中断时间 |
code | int | 与中断相关的用户自定义数值代码 |
mod_objid | Objid | 给定处理器或队列的对象ID(处理器或队列ID可通过Id函数集中的op_id_self()、op_topo_child()和op_id_from_name()函数来获取) |
1)返回值
Evhandle——预设中断的事件句柄。该返回值可存储在一个状态变量中,用于以后调用函数op_ev_cancel()时取消中断。
2)详解
调用该函数时将在仿真事件列表中加入一个代表预设自中断的新事件。一旦预设了事件,函数将立即返回调用进程的控制权。在延时期间,调用进程可自由进行其他任何活动。如果没有其他高优先级事件,预设的事件将会按时发生。当执行完所有的前期事件后且自中断事件位于仿真事件列表的表头时,即将其仿真时间设为当前仿真时间并执行事件,引发调用进程的自中断。进程可通过函数op_intrpt_code()获取与中断相关的代码。
该函数返回事件句柄并将其存储在一个状态变量中,当发生条件改变需要取消中断时,可以利用该事件句柄,调用函数op_ev_cancel()取消预设的远程中断,程序如下所示:
/*Sstate variable declaration*/
Evhandle \evh;
/*Remote interrupt scheduling*/
evh=op_intrpt_schedule_remote(stime,22,mod_objid);
/*Remote interrupt canceling.*/
op_ev_cancel(evh);
此外,该核心函数的安全级别为Forced serialization。
3)目的
该核心函数提供了无需物理包流或统计线的连接,进程可远程调用另一进程的机制,进程可用它来警告另一进程某事件的发生。
注意:远程中断只能传递到处理器或队列,否则将引发错误。
4)错误
Program Abort:内存分配失败。
Recoverable Error:预设时间小于当前时间。
Recoverable Error:预设时间是一个无效的double值。
Recoverable Error:对象ID溢出。
Recoverable Error:对象类型错误。
5)相关函数
采用op_intrpt_schedule_self()预设一个自中断。
采用op_intrpt_schedule_call()预设一个过程中断。
采用op_ev_cancel()取消未决中断。
采用op_intrpt_code()获取与中断相关的代码。
3. op_intrpt_type ()
此核心函数的作用是获取调用进程的当前中断类型。
1)返回值
int——当前中断类型。
2)详解
该函数返回的中断类型包括:
OPC_INTRPT_FAIL(节点或链路失败中断);
OPC_INTRPT_RECOVER(节点或链路失败中断);
OPC_INTRPT_PROCEDURE(过程中断);
OPC_INTRPT_SELF(自中断);
OPC_INTRPT_STRM(流中断);
OPC_INTRPT_REGULAR(常规中断);
OPC_INTRPT_STAT(统计中断);
OPC_INTRPT_REMOTE(远程中断);
OPC_INTRPT_BEGSIM(仿真起始中断);
OPC_INTRPT_ENDSIM(仿真结束中断);
OPC_INTRPT_ACCESS(访问中断);
OPC_INTRPT_PROCESS(进程中断);
OPC_INTRPT_MCAST(广播中断);
此外,该核心函数的安全级别为Forced serialization。
3)目的
该核心函数提供了一种机制来确定是何原因“唤醒”调用进程。该函数是最基本的核心函数,几乎每个进程模型都会使用它。进程模型大多都有一个或多个“分支状态”,分支状态将该过程返回的值存储在一个临时变量中,然后根据该返回值来选取输出转换。
4)错误
该核心函数无错误捕获。
5)相关函数
采用op_intrpt_code()确定与当前中断相关的代码。
采用op_intrpt_strm()确定与当前中断相关的流索引。
采用op_intrpt_stat()确定与当前中断相关的输入统计索引。
采用op_intrpt_ici()获取与当前中断相关的ICI。
4. op_intrpt_strm ()
此核心函数的作用是获取与调用进程当前中断相关联的流索引。
1)返回值
int——与当前中断相关联的流索引。当使用函数op_pk_deliver…()将包传递到指定输入流时,将显式设置该值;当使用函数op_pk_send…()向包流中发送包或通过函数op_strm_access()访问包流时,将隐式设置该值。
2)详解
在与流相关联的中断后调用该函数,将只产生一个有效值。与流相关联的中断有两类:流中断和访问中断。前者的流是指包到达的输入流,而后者的流是指与之相连的模块访问的输出流。
此外,该核心函数的安全级别为Forced serialization。
3)目的
对于流中断,该函数确定了包是通过哪个输入流到达的;而对于访问中断,函数可确定所连处理器或队列访问的是哪个输入流。
4)错误
Program Abort:核心函数需要进程上下文。
Recoverable Error:当前事件不是流中断或访问中断。
5)相关函数
采用op_intrpt_type()确定当前中断的类型。
采用op_intrpt_code()确定与当前中断相关的代码。
采用op_intrpt_stat()确定与当前中断相关的输入统计索引。
采用op_pk_send…()和op_pk_deliver…()将包发送或传递到模块输入流中。
采用op_strm_access()访问处理器或队列的输出流。
5. op_intrpt_ici ()
该核心函数的作用是获取与当前中断相关联的ICI。
1)返回值
Ici*——指向与当前中断相关联的ICI的指针。
2)详解
进程中断中携带的信息类型包括中断类型、与中断相关的标记或代码,有时还携带ICI信息。获取ICI的指针允许接收进程撮其内容。将ICI的内容完全处理后,可通过op_ici_destroy()重复利用该ICI。但只有当源进程为每个输出中断创建了新的ICI,才能销毁ICI。
此外,该核心函数的安全级别为Forced serialization。
3)目的
该核心函数为进程提供了一种获取与当前中断相关的ICI指针的机制。一旦获取该指针,便可使用函数op_ici_attr_get()来提取ICI内容。
4)错误
该核心函数无错误捕获。
5)相关函数
采用op_ici_create()创建ICI。
采用op_ici_install()为输出中断建立一个ICI。
采用op_ici_destroy()解除已处理的ICI。
采用op_intrpt_type()确定当前中断类型。
采用op_ici_attr_get()获取ICI属性值。
采用op_ici_attr_exists()确定ICI是否包含特殊属性。
6. op_intrpt_code ()
此核心函数的作用是获取与调用进程当前中断相关联的数值代码。
1)返回值
int——与当前中断相关联的数值代码。
2)详解
当在具有与代码相关联的中断之后调用该函数时,将只产生有效值。支持代码的中断类型为自中断、进程中断和远程中断。
此外,该核心函数的安全级别为Forced serialization。
3)目的
该核心函数提供了一种机制来确定与中断相关联的用户自定义数值代码,从而确定其目的,主要用于存在多个相同类型、不同目的的中断的情况下。
4)错误
该核心函数无错误捕获。
5)相关函数
采用op_intrpt_type()确定当前中断类型。
采用op_intrpt_strm()确定与当前中断相关的流索引。
采用op_intrpt_stat()确定与统计中断相关的输入统计索引。
采用op_intrpt_source()确定当前中断的源对象。
采用op_intrpt_ici()获取与当前中断相关的ICI。