timer.rs 833 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. use super::interrupt::end_of_interrupt;
  2. use core::sync::atomic::{AtomicUsize, Ordering};
  3. use eonix_runtime::scheduler::Scheduler;
  4. static TICKS: AtomicUsize = AtomicUsize::new(0);
  5. pub struct Ticks(usize);
  6. impl Ticks {
  7. pub fn in_secs(&self) -> usize {
  8. self.0 / 100
  9. }
  10. #[allow(dead_code)]
  11. pub fn in_msecs(&self) -> usize {
  12. self.0 * 10
  13. }
  14. pub fn in_usecs(&self) -> usize {
  15. self.0 * 10_000
  16. }
  17. pub fn in_nsecs(&self) -> usize {
  18. self.0 * 10_000_000
  19. }
  20. }
  21. pub fn timer_interrupt() {
  22. end_of_interrupt();
  23. TICKS.fetch_add(1, Ordering::Relaxed);
  24. if eonix_preempt::count() == 0 {
  25. // To make scheduler satisfied.
  26. eonix_preempt::disable();
  27. Scheduler::schedule();
  28. }
  29. }
  30. pub fn ticks() -> Ticks {
  31. Ticks(TICKS.load(Ordering::Relaxed))
  32. }