一. 整理一下project中的中断和相互之间的调度关系
涉及的主要Parameters_initGlobal_Timer MRO和 UE RRM UE_Mobility eNodeB RRM
Parameters_init模块
产生INTRPT_SYS_INIT中断触发Global_Timer MRO UE RRM UE_Mobility eNodeB RRM模块。中断类型为广播中断。
最后send_sys_init状态有语句:
op_intrpt_schedule_mcast_global(op_sim_time(),INTRPT_SYS_INIT);
产生广播类型的INTRPT_SYS_INIT
Global_Timer模块
空闲状态的出口函数处都会调用:
tvi_intrpt_type =op_intrpt_type();
tvi_intrpt_code =op_intrpt_code();
头函数处有定义:(即上面语句获得中断类型和中断码)
#define RCV_SYS_INIT(tvi_intrpt_type ==OPC_INTRPT_MCAST && tvi_intrpt_code == INTRPT_SYS_INIT)
#define SLOT_TIMER (tvi_intrpt_type == OPC_INTRPT_SELF && tvi_intrpt_code ==INTRPT_SLOT_TIMER)
#define SIM_END(tvi_intrpt_type ==OPC_INTRPT_ENDSIM)
Init状态函数开头:
这里为什么把产生中断的语句放在前面:这里就和OPNET的仿真机制有关系了:执行事件不需要任何时间,事件和事件之间可能跨越仿真时间,但是不消耗物理时间,事件执行过程直至事件执行完毕,仿真时间不推进,但需要物理时间,这个物理时间是受机器CPU 的限制。详细见上面的笔记部分,不赘述。
总之init状态产生SLOT_TIMER 中断
下面Time_Forward 状态末尾有:
op_intrpt_schedule_self(op_sim_time() +lvd_slot_duration, INTRPT_SLOT_TIMER);
产生SLOT_TIMER 中断
在send_signal 状态有
op_intrpt_schedule_remote(op_sim_time(),INTRPT_MRO,gvi_MRO_module_id);
触发MRO中断
Simend状态最后有
op_intrpt_schedule_mcast_global(op_sim_time(),INTRPT_ SYS_INIT);
产生RCV_SYS_INIT
eNodeBRRM模块
头函数有:
其中SCHEDULING中断由Global_Timer模块中的send_signal状态产生:
其中send_slot_timer_to_BS函数定义如下:
static void
send_slot_timer_to_BS(void)
{
intlvi_BS_index;
FIN(send_slot_timer_to_BS());
for(lvi_BS_index = 0; lvi_BS_index < gvi_BS_number; lvi_BS_index++)
{
op_intrpt_schedule_remote(op_sim_time(),INTRPT_DL_SCHEDULING,gvo_BS_property[lvi_BS_index].RRM_module_id);
}
FOUT;
}
RCV_ACK 中断由UE RRM模块的Demodu状态函数HARQ_feedback()产生。
RCV_CQI中断由UE RRM模块的Feedback状态调用recommend_CQI()函数产生
UE RRM模块:
头函数有:
其中中断RCV_PDSCH由ENodeB模块中的scheduling状态产生
UE Mobility模块
头函数:
INTRPT_HANDOVER中断:由UE Mobility模块得handover状态得
INTRPT_MOVE_UPDATE中断:由UE Mobility模块得move_update状态得到
注意这两个模块的初始INTRPT_HANDOVER和INTRPT_MOVE_UPDATE中断程序中没有给出:(问题,怎么从Idle进去handover和move_update这两个状态)