[zion] Move more initialization into the ApicTimer class.
This commit is contained in:
parent
d99624daf6
commit
f8de60e2dd
|
@ -4,11 +4,15 @@
|
||||||
#include "interrupt/apic.h"
|
#include "interrupt/apic.h"
|
||||||
#include "interrupt/timer.h"
|
#include "interrupt/timer.h"
|
||||||
|
|
||||||
|
const uint32_t kScheduleFrequency = 20;
|
||||||
ApicTimer* gApicTimer = nullptr;
|
ApicTimer* gApicTimer = nullptr;
|
||||||
|
|
||||||
void ApicTimer::Init() {
|
void ApicTimer::Init() {
|
||||||
gApicTimer = new ApicTimer();
|
gApicTimer = new ApicTimer();
|
||||||
gApicTimer->StartCalibration();
|
gApicTimer->StartCalibration();
|
||||||
|
asm("sti;");
|
||||||
|
gApicTimer->WaitCalibration();
|
||||||
|
asm("cli;");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApicTimer::StartCalibration() {
|
void ApicTimer::StartCalibration() {
|
||||||
|
@ -33,5 +37,6 @@ void ApicTimer::Calibrate() {
|
||||||
|
|
||||||
void ApicTimer::FinishCalibration() {
|
void ApicTimer::FinishCalibration() {
|
||||||
MaskPit();
|
MaskPit();
|
||||||
SetLocalTimer(calculated_frequency_ / 20, LAPIC_TIMER_PERIODIC);
|
SetLocalTimer(calculated_frequency_ / kScheduleFrequency,
|
||||||
|
LAPIC_TIMER_PERIODIC);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,12 +11,6 @@ class ApicTimer {
|
||||||
// after implementing HPET.
|
// after implementing HPET.
|
||||||
void Calibrate();
|
void Calibrate();
|
||||||
|
|
||||||
void WaitCalibration() {
|
|
||||||
while (calculated_frequency_ == 0) {
|
|
||||||
asm("hlt;");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Calibration {
|
struct Calibration {
|
||||||
uint32_t initial_measurement = 0;
|
uint32_t initial_measurement = 0;
|
||||||
|
@ -29,6 +23,12 @@ class ApicTimer {
|
||||||
ApicTimer() {}
|
ApicTimer() {}
|
||||||
void StartCalibration();
|
void StartCalibration();
|
||||||
void FinishCalibration();
|
void FinishCalibration();
|
||||||
|
|
||||||
|
void WaitCalibration() {
|
||||||
|
while (calculated_frequency_ == 0) {
|
||||||
|
asm("hlt;");
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ApicTimer* gApicTimer;
|
extern ApicTimer* gApicTimer;
|
||||||
|
|
|
@ -39,11 +39,7 @@ extern "C" void zion() {
|
||||||
dbgln("[boot] Init scheduler.");
|
dbgln("[boot] Init scheduler.");
|
||||||
ProcessManager::Init();
|
ProcessManager::Init();
|
||||||
Scheduler::Init();
|
Scheduler::Init();
|
||||||
// Schedule every 50ms.
|
|
||||||
ApicTimer::Init();
|
ApicTimer::Init();
|
||||||
asm("sti;");
|
|
||||||
gApicTimer->WaitCalibration();
|
|
||||||
asm("cli;");
|
|
||||||
|
|
||||||
dbgln("[boot] Loading sys init program.");
|
dbgln("[boot] Loading sys init program.");
|
||||||
LoadInitProgram();
|
LoadInitProgram();
|
||||||
|
|
Loading…
Reference in New Issue