mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-19 04:56:30 +00:00
🔧 改用local apic定时器进行进程时间片更新
This commit is contained in:
@ -3,7 +3,12 @@
|
||||
#include <common/unistd.h>
|
||||
#include "apic.h"
|
||||
|
||||
extern uint64_t apic_timer_ticksIn1ms;
|
||||
extern uint64_t apic_timer_ticks_result;
|
||||
// 5ms产生一次中断
|
||||
#define APIC_TIMER_INTERVAL 5
|
||||
#define APIC_TIMER_DIVISOR 3
|
||||
|
||||
#define APIC_TIMER_IRQ_NUM 151
|
||||
|
||||
/**
|
||||
* @brief 设置apic定时器的分频计数
|
||||
@ -27,34 +32,50 @@ extern uint64_t apic_timer_ticksIn1ms;
|
||||
wrmsr(0x838, init_cnt); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* @brief 停止apic定时器
|
||||
*
|
||||
*/
|
||||
#define apic_timer_stop() \
|
||||
do \
|
||||
{ \
|
||||
wrmsr(0x832, APIC_LVT_INT_MASKED); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* @brief 设置apic定时器的lvt,并启动定时器
|
||||
*
|
||||
* @param vector 中断向量号
|
||||
* @param mask 是否屏蔽(1:屏蔽, 0:不屏蔽)
|
||||
* @param mode 计时模式
|
||||
*/
|
||||
#define apic_timer_set_LVT(vector, mode) \
|
||||
do \
|
||||
{ \
|
||||
wrmsr(0x832, (mode << 17) | vector); \
|
||||
io_mfence(); \
|
||||
#define apic_timer_set_LVT(vector, mask, mode) \
|
||||
do \
|
||||
{ \
|
||||
wrmsr(0x832, (mode << 17) | vector | (mask ? (APIC_LVT_INT_MASKED) : 0)); \
|
||||
} while (0)
|
||||
|
||||
#define apic_timer_write_LVT(value) \
|
||||
do \
|
||||
{ \
|
||||
wrmsr(0x832, value); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* @brief 获取apic定时器的LVT的值
|
||||
*
|
||||
*
|
||||
*/
|
||||
#define apic_timer_get_LVT() (rdmsr(0x832))
|
||||
/**
|
||||
* @brief 获取apic定时器当前计数值
|
||||
*
|
||||
*/
|
||||
#define apic_timer_get_current() (rdmsr(0x839))
|
||||
#define apic_timer_get_current() (rdmsr(0x839))
|
||||
|
||||
/**
|
||||
* @brief 停止apic定时器
|
||||
*
|
||||
*/
|
||||
#define apic_timer_stop() \
|
||||
do \
|
||||
{ \
|
||||
uint64_t val = apic_timer_get_LVT(); \
|
||||
val |= APIC_LVT_INT_MASKED; \
|
||||
apic_timer_write_LVT(val); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* @brief 初始化local APIC定时器
|
||||
*
|
||||
*/
|
||||
void apic_timer_init();
|
Reference in New Issue
Block a user