From c8ea47bcc856e46f8be8815ed6f5d47fb1b73e46 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 29 Oct 2023 13:14:01 +0800 Subject: [PATCH] 1 --- src/xtimer.rs | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/xtimer.rs b/src/xtimer.rs index 0cb320b..8249fbd 100644 --- a/src/xtimer.rs +++ b/src/xtimer.rs @@ -244,14 +244,31 @@ impl XTimer { return ((self.timer_tick as usize) >> (TVR_BITS + index * TVN_BITS)) & TVN_MASK; } - fn fetch_work_list(&self, tick: i64) -> bool { - return true; + fn fetch_work_list(&mut self, tick: i64) -> bool { + if tick >= self.timer_tick { + let index = (self.timer_tick & (TVR_MASK as i64)) as usize; + if index == 0 && + self.cascade(0) == 0 && + self.cascade(1) == 0 && + self.cascade(2) == 0 { + self.cascade(3); + } + self.timer_tick += 1; + + //println!("timer_tick:{} index:{} empty:{}", self.timer_tick, index, self.tv1[index].borrow().empty()); + crate::ListHead::::replace_init + (&self.tv1[index], + &self.work_list); + return true; + } else { + return false; + } } pub fn update(this: &Rc::>) { let tick = (*this.borrow().get_tick_count.as_ref().unwrap())(); let work_list = this.borrow().work_list.clone(); - while this.borrow().fetch_work_list(tick) { + while this.borrow_mut().fetch_work_list(tick) { while !work_list.borrow().empty() { let timer = &work_list.borrow().first_entry(); this.borrow_mut().running_timer = timer.clone(); @@ -262,7 +279,8 @@ impl XTimer { None => { } } - match this.borrow().running_timer.upgrade() { + let running_timer = this.borrow().running_timer.clone(); + match running_timer.upgrade() { Some(v) => { match v.borrow().timer_type { TimerType::Timeout => { @@ -423,6 +441,15 @@ impl XTimer { } } + fn internal_modify(&mut self, timer_wp: XTimerWp, expire_time: i32) { + self.detach_timer(&timer_wp.upgrade().unwrap()); + timer_wp.upgrade().unwrap().borrow_mut().expire_time = expire_time; + timer_wp.upgrade().unwrap().borrow_mut().expires = + (*self.get_tick_count.as_ref().unwrap())() + + expire_time as i64; + self.internal_add2(&timer_wp.upgrade().unwrap()); + } + pub fn set_timeout(&mut self, time: i32, cb: TimerCb) -> XTimerWp { return self.internal_add(TimerType::Timeout, time, cb, None); } @@ -463,7 +490,7 @@ impl XTimer { pub fn modify(&mut self, timer_wp: XTimerWp, expire_time: i32) { match timer_wp.upgrade() { Some(_) => { - self.modify(timer_wp, expire_time); + self.internal_modify(timer_wp, expire_time); } None => { }