opnet进程执行过程解读
来源:互联网 发布:淘宝管控资金什么事到 编辑:程序博客网 时间:2024/04/24 01:47
一、进程概念
在opnet中,进程模型是执行的最小单位,进程模型实际上就是一个函数,不同于操作系统中进程的概念。
在操作系统中,进程执行贯穿始终,从创建开始,到退出结束。
在opnet中,进程只是一个函数,每次由opnet内核调用,进程从调用开始,到return退出,整个过程,就是一次函数调用。每次调用时,对于临时变量都会重新初始化,不会保留上次调用后的值。
C语言opnet
对应关系
全局变量
状态变量和全局变量
对应关系局部变量
临时变量
二、状态模型
1)强制状态
执行过程:opnet核心调用进程模型时,如果当前状态是强制状态时,首先执行其进入代码,然后跳转到离开代码,再判断转移条件,直接跳转到目标状态的进入代码,执行,跳转过程是通过加标号label和跳转语句goto实现的,整个过程没有离开进程函数。
2)非强制状态
执行过程:opnet核心调用进程模型时,如果当前状态是非强制状态时,首先执行其进入代码,然后设置下一状态为该状态的离开代码,然后函数返回return,等待下次调用。当再次调用进程函数时,此时状态已是离开代码,执行完后判断转移条件,直接跳转到目标状态的进入代码,再次执行,跳转过程同样是通过加标号label和跳转语句goto实现的,整个过程也没有离开进程函数。
3)综述
进程函数只有在执行完非强制状态的进入代码后开返回,离开进程函数,返回到opnet核心。
状态转移是按照常归的switch语句实现的。
接下来看一次标红处的宏是什么(P_fsm_dec.h):
采用常归的switch语句实现状态转移
强制状态进入宏,通过case先择执行哪个状态
强制状态离开后转移过程,通和设置标号label和goto语句实现跳转
非强制状态进入宏,通过case先择执行哪个状态
进入非强制状态后,执行return,返回opnet核心
非强制状态离开后转移过程,同样通和设置标号label和goto语句实现跳转
在opnet中,进程模型是执行的最小单位,进程模型实际上就是一个函数,不同于操作系统中进程的概念。
在操作系统中,进程执行贯穿始终,从创建开始,到退出结束。
在opnet中,进程只是一个函数,每次由opnet内核调用,进程从调用开始,到return退出,整个过程,就是一次函数调用。每次调用时,对于临时变量都会重新初始化,不会保留上次调用后的值。
对于状态变量和全局变量,是整个项目可见的,这点可以参照C语言编程中的全局变量和局部变量的概念。
C语言opnet
对应关系
全局变量
状态变量和全局变量
对应关系局部变量
临时变量
二、状态模型
1)强制状态
执行过程:opnet核心调用进程模型时,如果当前状态是强制状态时,首先执行其进入代码,然后跳转到离开代码,再判断转移条件,直接跳转到目标状态的进入代码,执行,跳转过程是通过加标号label和跳转语句goto实现的,整个过程没有离开进程函数。
2)非强制状态
执行过程:opnet核心调用进程模型时,如果当前状态是非强制状态时,首先执行其进入代码,然后设置下一状态为该状态的离开代码,然后函数返回return,等待下次调用。当再次调用进程函数时,此时状态已是离开代码,执行完后判断转移条件,直接跳转到目标状态的进入代码,再次执行,跳转过程同样是通过加标号label和跳转语句goto实现的,整个过程也没有离开进程函数。
3)综述
进程函数只有在执行完非强制状态的进入代码后开返回,离开进程函数,返回到opnet核心。
状态转移是按照常归的switch语句实现的。
三、案例分析
一个进程模型的部份源代码:
voidcsma_tx (OP_SIM_CONTEXT_ARG_OPT){....//其它代码FIN_MT (csma_tx ());{/* Temporary Variables */Boolean state_reentered = OPC_FALSE;/* End of Temporary Variables */FSM_ENTER ("csma_tx")FSM_BLOCK_SWITCH{/*---------------------------------------------------------*//** state (init) enter executives **/FSM_STATE_ENTER_FORCED_NOLABEL (0, "init", "csma_tx [init enter execs]")FSM_PROFILE_SECTION_IN ("csma_tx [init enter execs]", state0_enter_exec){op_ima_sim_attr_get_int32("max packet count", &max_packet_count);}FSM_PROFILE_SECTION_OUT (state0_enter_exec)/** state (init) exit executives **/FSM_STATE_EXIT_FORCED (0, "init", "csma_tx [init exit execs]")/** state (init) transition processing **/FSM_TRANSIT_FORCE (1, state1_enter_exec, ;, "default", "", "init", "idle", "tr_0", "csma_tx [init -> idle : default / ]")/*---------------------------------------------------------*//** state (idle) enter executives **/FSM_STATE_ENTER_UNFORCED (1, "idle", state1_enter_exec, "csma_tx [idle enter execs]")FSM_PROFILE_SECTION_IN ("csma_tx [idle enter execs]", state1_enter_exec){if(state_reentered == OPC_FALSE){printf("进入状态\n");op_intrpt_schedule_self(op_sim_time() + 0.0001, 1);}else{printf("这个是次重入过程\n");}}FSM_PROFILE_SECTION_OUT (state1_enter_exec)/** blocking after enter executives of unforced state. **/FSM_EXIT (3,"csma_tx")//离开进程函数/** state (idle) exit executives **/FSM_STATE_EXIT_UNFORCED (1, "idle", "csma_tx [idle exit execs]")FSM_PROFILE_SECTION_IN ("csma_tx [idle exit execs]", state1_exit_exec){}FSM_PROFILE_SECTION_OUT (state1_exit_exec)/** state (idle) transition processing **/FSM_PROFILE_SECTION_IN ("csma_tx [idle trans conditions]", state1_trans_conds)FSM_INIT_COND (PKT_ARVL && FREE)FSM_TEST_COND (PKT_ARVL && !FREE)FSM_DFLT_CONDFSM_TEST_LOGIC ("idle")FSM_PROFILE_SECTION_OUT (state1_trans_conds)FSM_TRANSIT_SWITCH{FSM_CASE_TRANSIT (0, 2, state2_enter_exec, print_power_channelidle();, "PKT_ARVL && FREE", "print_power_channelidle()", "idle", "tx_pkt", "tr_1", "csma_tx [idle -> tx_pkt : PKT_ARVL && FREE / print_power_channelidle()]")FSM_CASE_TRANSIT (1, 3, state3_enter_exec, print_power_channelbusy();, "PKT_ARVL && !FREE", "print_power_channelbusy()", "idle", "wait_free", "tr_8", "csma_tx [idle -> wait_free : PKT_ARVL && !FREE / print_power_channelbusy()]")FSM_CASE_TRANSIT (2, 1, state1_enter_exec, SET_REENTRY;, "default", "SET_REENTRY", "idle", "idle", "tr_3", "csma_tx [idle -> idle : default / SET_REENTRY]")}/*---------------------------------------------------------*/....//其它代码}FSM_EXIT (0,"csma_tx")}
接下来看一次标红处的宏是什么(P_fsm_dec.h):
采用常归的switch语句实现状态转移
强制状态进入宏,通过case先择执行哪个状态
强制状态离开宏,设置离开后的下一个状态2 * sn + 1
强制状态离开后转移过程,通和设置标号label和goto语句实现跳转
非强制状态进入宏,通过case先择执行哪个状态
进入非强制状态后,执行return,返回opnet核心
非强制状态离开宏,设置离开后的下一个状态2 * sn + 1
非强制状态离开后转移过程,同样通和设置标号label和goto语句实现跳转
- opnet进程执行过程解读
- 进程的执行过程
- opnet之进程接口
- jQuery源码解读---执行过程分析
- MyBatis的Sql执行过程源码解读
- Arduino IDE的编译执行过程解读
- Python程序执行过程的整合解读
- Arduino IDE的编译执行过程解读
- MFC的进程执行过程
- opnet之sink进程模型
- opnet调试之进程调试
- Win7下OPNET安装过程
- OPNET
- OPNET
- Linux进程的分析和执行过程
- Linux进程的分析和执行过程
- UNIX Shell命令行的解释执行过程最终解读
- opnet各进程数据共享机制
- Linux下MySQL数据库常用基本操作
- ZFS 文件系统研究
- Android软件测试的日志文件抓取简介
- perl写入文件时中文乱码终极解决方案
- Android TabWidget
- opnet进程执行过程解读
- 鸟哥的Linux私房菜基础学习篇(第三版)之第四章:安装CentOS 5.x 与多重引导小技巧(略)
- 逻辑结构常见练习 Java_Note
- android UI控件学习
- Android - View - ViewPager
- APUE学习笔记——第十五章 进程间通信
- C#调用Excel模版生成Excel文件
- 常见的qq在线客服代码
- hdu1598 并查集+贪心