diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/sys/core.c | 3 | ||||
-rw-r--r-- | src/sys/schedule.S | 13 | ||||
-rw-r--r-- | src/sys/schedule.c | 5 |
3 files changed, 11 insertions, 10 deletions
diff --git a/src/sys/core.c b/src/sys/core.c index 302e629..384add5 100644 --- a/src/sys/core.c +++ b/src/sys/core.c @@ -62,7 +62,7 @@ void sysinit(void) add_thread(testlocal, 0); add_thread(testlocal, 5); add_thread(testlocal, 8); - delay(0x20000000); + //delay(0x20000000); schedule(); } @@ -96,7 +96,6 @@ void testlocal(void) } else if (t->data.pid == 5) { add_thread(testlocal1, 1); schedule(); - sched_info(); } uart_string("Done!\n"); } diff --git a/src/sys/schedule.S b/src/sys/schedule.S index 18130d0..302c4d8 100644 --- a/src/sys/schedule.S +++ b/src/sys/schedule.S @@ -1,10 +1,9 @@ .section .text .globl schedule +// TODO: Implement Scheduler for IRQ + // Implemented the scheduler in Assembly since the C defined was messing around with the program stacks // This way, I can be confident that the stacks will be unchanged -// -// TODO: Mark threads as READY and RUNNING -// schedule: ldr r3, =scheduler // r3 = struct Scheduler* @@ -38,12 +37,17 @@ schedule.current_thread_exists: // Next is not the same as the current // Preserve stack of current ldr r2, [r1, #0x8] // struct Thread* current + mov r1, #0 // THREAD_READY + strh r1, [r2, #0x0e] str sp, [r2, #0x4] // void* stack // Preserve stack // Preserve program counter of current str lr, [r2, #0x0] // void* thread // Preserve pc ldr r2, [r0, #0x8] // struct Thread* next // Set new stack pointer ldr sp, [r2, #0x4] + // Set the thread as running + mov r1, #1 // THREAD_RUNNING + strh r1, [r2, #0x0e] // unsigned short status add r2, r2, #0x18 // Set new running thread str r0, [r3, #0x0] // struct LL* next_thread_ll // Set new running thread @@ -71,6 +75,9 @@ schedule.dont_overwrite_sys_stack: ldr sp, [r1, #0x4] // void* stack // Store the running thread ll entry str r0, [r3, #0x0] // struct LL* rthread_ll + ldr r2, [r0, #0x8] // struct Thread* thread + mov r0, #1 // THREAD_RUNNING + strh r0, [r2, #0x0e] // Set context add r1, r1, #0x18 // struct cpu_context* str r1, [r3, #0x4] // store to scheduler.ctx diff --git a/src/sys/schedule.c b/src/sys/schedule.c index 4b071c3..7dc2205 100644 --- a/src/sys/schedule.c +++ b/src/sys/schedule.c @@ -156,15 +156,11 @@ void cleanup(void) scheduler.rthread_ll = 0; } // Schedule next thread - //uart_string("Scheduling from cleanup!\n"); - //sched_info(); - //schedule(); schedule(); } void sched_info(void) { - disableirq(); uart_string("Scheduler Information\n"); for(unsigned long i = 0; i < PRIORITIES; i++) { struct LL* ll = scheduler.tlist[i].next; @@ -186,5 +182,4 @@ void sched_info(void) } uart_char('\n'); } - enableirq(); } |