Instead of keeping track of the current time and rescheduling when interval has passed, keep track of the next expected reschedule time. This prevents theoretically missing every second pre-emption when scheduler's timer is interrupting at same rate as the interval.