1,定时器添加
openLTE中的定时器统一由LTE_fdd_enb_timer_mgr来进行管理.举例流程如下:
RLC中的轮询重传定时器添加方法如下:
rlc_start_t_poll_retransmit{ LTE_fdd_enb_timer_mgr *timer_mgr = LTE_fdd_enb_timer_mgr::get_instance(); LTE_fdd_enb_timer_cb timer_expiry_cb(<E_fdd_enb_timer_cb_wrapper<LTE_fdd_enb_rb, <E_fdd_enb_rb::handle_t_poll_retransmit_timer_expiry>, this); timer_mgr->start_timer(45, timer_expiry_cb, &t_poll_retransmit_timer_id);}
其中就定义了timer的超时时间为45ms,
超时后需要执行的函数为handle_t_poll_retransmit_timer_expiry
上述timer被添加到timer_mgr后,则会被定时来判断其是否超时,在超时时执行超时函数
2,定时器计时机制
timer_manager中的timer自添加开始,就会在每次handle_tick函数中自加,并且被判断是否已经超时,如果超时,则会添加到expired_list中,执行完相应的超时函数后,则删除该timer.
handle_tick是由handle_ready_to_send调用时执行,为什么用这个函数呢?因为这个函数是由handle_phy_msg调用,而handle_phy_msg函数是phy_cb的回调函数.phy_cb对应到phy_comm_msgq消息队列,而该消息队列在process_dl以及process_ul函数中都会被填充,而只有process_dl中的message类型才会触发handle_ready_to_send,如下代码
(phy_mac_mq为phy_comm_msgq的调用名称):
TE_fdd_enb_msgq::send(phy_mac_mq, LTE_FDD_ENB_MESSAGE_TYPE_READY_TO_SEND, LTE_FDD_ENB_DEST_LAYER_MAC, (LTE_FDD_ENB_MESSAGE_UNION *)&rts, sizeof(rts));
process_dl由radio_interface调用,而radio_interface在radio_thread_func线程函数中1ms会被调用一次.如下:
sleep_time.tv_nsec = 10000001000000ns即为1ms每sleep一次,即为1ms时长,也即1ms后会再次调用radio_interface,也即最终会调用handle_tick
(1ms的时长也对应到了1个子帧的长度)