git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
basic process support and some syscalls
[lunaix-os.git]
/
lunaix-os
/
kernel
/
time
/
timer.c
diff --git
a/lunaix-os/kernel/time/timer.c
b/lunaix-os/kernel/time/timer.c
index 03ef2b4c2f4167dbb88df56124e2a0d16bef2d48..42a9ac214262d655a3e4b628091fce92d397373b 100644
(file)
--- a/
lunaix-os/kernel/time/timer.c
+++ b/
lunaix-os/kernel/time/timer.c
@@
-16,6
+16,7
@@
#include <lunaix/spike.h>
#include <lunaix/syslog.h>
#include <lunaix/timer.h>
#include <lunaix/spike.h>
#include <lunaix/syslog.h>
#include <lunaix/timer.h>
+#include <lunaix/sched.h>
#define LVT_ENTRY_TIMER(vector, mode) (LVT_DELIVERY_FIXED | mode | vector)
#define LVT_ENTRY_TIMER(vector, mode) (LVT_DELIVERY_FIXED | mode | vector)
@@
-38,6
+39,9
@@
static volatile struct lx_timer_context* timer_ctx = NULL;
static volatile uint32_t rtc_counter = 0;
static volatile uint8_t apic_timer_done = 0;
static volatile uint32_t rtc_counter = 0;
static volatile uint8_t apic_timer_done = 0;
+static volatile uint32_t sched_ticks = 0;
+static volatile uint32_t sched_ticks_counter = 0;
+
#define APIC_CALIBRATION_CONST 0x100000
void
#define APIC_CALIBRATION_CONST 0x100000
void
@@
-51,6
+55,7
@@
timer_init_context()
timer_ctx->active_timers =
(struct lx_timer*)lxmalloc(sizeof(struct lx_timer));
llist_init_head(timer_ctx->active_timers);
timer_ctx->active_timers =
(struct lx_timer*)lxmalloc(sizeof(struct lx_timer));
llist_init_head(timer_ctx->active_timers);
+
}
void
}
void
@@
-131,6
+136,9
@@
timer_init(uint32_t frequency)
intr_subscribe(APIC_TIMER_IV, timer_update);
apic_write_reg(APIC_TIMER_ICR, timer_ctx->tphz);
intr_subscribe(APIC_TIMER_IV, timer_update);
apic_write_reg(APIC_TIMER_ICR, timer_ctx->tphz);
+
+ sched_ticks = timer_ctx->running_frequency / 1000 * SCHED_TIME_SLICE;
+ sched_ticks_counter = 0;
}
int
}
int
@@
-184,6
+192,13
@@
timer_update(const isr_param* param)
lxfree(pos);
}
}
lxfree(pos);
}
}
+
+ sched_ticks_counter++;
+
+ if (sched_ticks_counter >= sched_ticks) {
+ sched_ticks_counter = 0;
+ schedule();
+ }
}
static void
}
static void