apic_timer.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #pragma once
  2. #include <common/unistd.h>
  3. #include "apic.h"
  4. extern uint64_t apic_timer_ticks_result;
  5. // 5ms产生一次中断
  6. #define APIC_TIMER_INTERVAL 5
  7. #define APIC_TIMER_DIVISOR 3
  8. #define APIC_TIMER_IRQ_NUM 151
  9. #pragma GCC push_options
  10. #pragma GCC optimize("O0")
  11. /**
  12. * @brief 设置apic定时器的分频计数
  13. *
  14. * @param divider 分频除数
  15. */
  16. #define apic_timer_set_div(divider) \
  17. do \
  18. { \
  19. wrmsr(0x83e, divider); \
  20. } while (0)
  21. /**
  22. * @brief 设置apic定时器的初始计数值
  23. *
  24. * @param init_cnt 初始计数值
  25. */
  26. #define apic_timer_set_init_cnt(init_cnt) \
  27. do \
  28. { \
  29. wrmsr(0x838, init_cnt); \
  30. } while (0)
  31. /**
  32. * @brief 设置apic定时器的lvt,并启动定时器
  33. *
  34. * @param vector 中断向量号
  35. * @param mask 是否屏蔽(1:屏蔽, 0:不屏蔽)
  36. * @param mode 计时模式
  37. */
  38. #define apic_timer_set_LVT(vector, mask, mode) \
  39. do \
  40. { \
  41. wrmsr(0x832, (mode << 17) | vector | (mask ? (APIC_LVT_INT_MASKED) : 0)); \
  42. } while (0)
  43. #define apic_timer_write_LVT(value) \
  44. do \
  45. { \
  46. wrmsr(0x832, value); \
  47. } while (0)
  48. /**
  49. * @brief 获取apic定时器的LVT的值
  50. *
  51. */
  52. #define apic_timer_get_LVT() (rdmsr(0x832))
  53. /**
  54. * @brief 获取apic定时器当前计数值
  55. *
  56. */
  57. #define apic_timer_get_current() (rdmsr(0x839))
  58. /**
  59. * @brief 停止apic定时器
  60. *
  61. */
  62. #define apic_timer_stop() \
  63. do \
  64. { \
  65. uint64_t val = apic_timer_get_LVT(); \
  66. val |= APIC_LVT_INT_MASKED; \
  67. apic_timer_write_LVT(val); \
  68. } while (0)
  69. /**
  70. * @brief 初始化local APIC定时器
  71. *
  72. */
  73. void apic_timer_init();
  74. #pragma GCC pop_options