aboutsummaryrefslogtreecommitdiff
path: root/kernel/kernel.c
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-06-05 14:17:25 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-06-05 14:17:25 +0000
commiteff91acdf661803516ae159f49fd8daa64e13b6a (patch)
tree506d597bcc8d3a5d4b6d90b073b29ca175b1fa00 /kernel/kernel.c
parentfa1d7b1dedc1c4a34312c1e42d8d4e32d02b17f5 (diff)
force task switch on reschedule
Diffstat (limited to 'kernel/kernel.c')
-rw-r--r--kernel/kernel.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 9fce17b..0afd44a 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -64,23 +64,6 @@ struct kern {
uint8_t reboot;
} kern;
-ISR(TIMER1_OVF_vect)
-{
- if (!kern.reboot)
- wdt_reset();
-
- ++kern.cycles;
-
- /* reschedule current task if it's still at head of runq */
- if (kern.cur == TAILQ_FIRST(kern.cur->rq)) {
- TAILQ_REMOVE(kern.cur->rq, kern.cur, r_link);
- if (kern.cur->prio > RT && kern.cur->prio < RR)
- kern.cur->prio++;
- kern.cur->rq = &kern.rq[kern.cur->prio];
- TAILQ_INSERT_TAIL(kern.cur->rq, kern.cur, r_link);
- }
-}
-
ISR(TIMER1_COMPA_vect, ISR_NAKED)
{
struct task *tp, *tmp;
@@ -123,6 +106,26 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED)
reti();
}
+ISR(TIMER1_OVF_vect)
+{
+ if (!kern.reboot)
+ wdt_reset();
+
+ ++kern.cycles;
+
+ /* reschedule current task if it's still at head of runq */
+ if (kern.cur == TAILQ_FIRST(kern.cur->rq)) {
+ TAILQ_REMOVE(kern.cur->rq, kern.cur, r_link);
+ if (kern.cur->prio > RT && kern.cur->prio < RR)
+ kern.cur->prio++;
+ kern.cur->rq = &kern.rq[kern.cur->prio];
+ TAILQ_INSERT_TAIL(kern.cur->rq, kern.cur, r_link);
+
+ SCHEDULE();
+ }
+
+}
+
void
init(uint8_t sema, uint8_t stack)
{