文档介绍:陈敏《物联网仿真》 IOT模型代码解析
传感节点模型
应用层进程
当程序开始时,即event进行到803时,整个程序进入到WAIT模块,,然后所有节点的该事件开始竞争进行初始化,所以所有的Wait进程模块中的语句op_intrpt_schedule_self,op_intrpt_schedule_self ()本身是自中断函数。当他的第一个参数是op_sim_time()时他将当前时间的自中断放入中断列表中。那么程序同样会在当前时间执行该中断,也就是说在当前时间程序将离开这个unforced状态。
实际上,总是用这样一种方式来处理在初始化时多个进程的代码之间相互制约的问题。假设对于该节点下的进程初始化时要完成的工作=工作1+工作2+工作3。而工作2是总是需要所有的节点的进程在完成了工作1他才可以执行,而工作3总是需要网络内所有节点的进程在完成了工作2才可以执行。同时因为初始化工作必须在同一时刻完成,所以程序采用了这样的方式。这种方式就是让工作1,工作2,工作3分别对应于三个连续的unforced state ,在工作1和工作2的进入代码的最后部分调用op_intrpt_schedule_self (op_sim_time (), 0)。这样实际上程序的执行过程变成了这样:开始仿真--》begin intrpt中断执行所有节点进程的工作1--》自中断开始执行所有节点进程的工作2--》自中断开始执行所有节点进程的工作3--》返回仿真核心----。注意:这样一个过程一般是用来处理仿真开始初始化时代码相互影响的问题,这个过程都在同一时刻执行,并不占用系统的仿真时间。
假如另外一个模块下的进程必须等到该进程执行完工作3才可以执行自己的初始化代码,那么他必须设定四个这样的连续的unforced states来等待该进程下的工作3完成后才可以初始化自己的进程.
当进入init模块后,其目的为获得节点属性以及设置一个开始生成数据包的中断计划,执行的动作有:
获得当前节点编号下的packet size;
获得父节点的ID作为节点ID;
获得目的节点ID;
;
如果获得的属性中source_flag为1时,每隔设置时间就生成一个数据产生自中断;
设置初始化进程ID;
完成初始化后被强制进入idle状态,等待中断,根据获得的属性不同,work_data_arv中断、work_stop;
work_data_arv中断时,获得属性sink_flag为1时,接收包,然后销毁包;
当收到pkt_gen中断,即这个节点被设置为源节点,则进行如下动作:
调用功能函数m_generate_packet()进行数据包生成;
设置下一次自中断;
其中m_generate_packet()的内容为:
根据预设好的SENSED_DATA创建一个数据包格式
根据数据包格式以及读取到的数据包大小来设置数据包size
通过stream传输数据包到更低的层
记录全局变量app_data_transmitted,感觉有错误,应当是求和,而不是单纯设置为包大小
发送远程中断
work_stop中断,如果作为源节点:调用m_stop_source();在一个时间窗口内,没有收到新的interest,而原有的in