diff --git a/part13-interrupts/kernel/irq.c b/part13-interrupts/kernel/irq.c index 0d157e2..2addf6e 100644 --- a/part13-interrupts/kernel/irq.c +++ b/part13-interrupts/kernel/irq.c @@ -26,6 +26,10 @@ void enable_interrupt_controller() { REGS_IRQ->irq0_enable_0 = AUX_IRQ | SYS_TIMER_IRQ_1 | SYS_TIMER_IRQ_3; } +void disable_interrupt_controller() { + REGS_IRQ->irq0_enable_0 = AUX_IRQ; +} + void handle_irq() { unsigned int irq = REGS_IRQ->irq0_pending_0; diff --git a/part13-interrupts/kernel/kernel.c b/part13-interrupts/kernel/kernel.c index 9125830..c134c5e 100644 --- a/part13-interrupts/kernel/kernel.c +++ b/part13-interrupts/kernel/kernel.c @@ -30,11 +30,19 @@ void core0_main(void) { unsigned int core0_val = 0; - while (1) { + while (core0_val <= 100) { wait_msec(0x100000); drawProgress(0, core0_val); - if (core0_val < 100) core0_val++; + core0_val++; } + + debugstr("Core 0 done."); + debugcrlf(); + + irq_disable(); + disable_interrupt_controller(); + + while(1); } void core1_main(void) @@ -43,11 +51,16 @@ void core1_main(void) clear_core1(); // Only run once - while (1) { + while (core1_val <= 100) { wait_msec(0x3FFFF); drawProgress(1, core1_val); - if (core1_val < 100) core1_val++; + core1_val++; } + + debugstr("Core 1 done."); + debugcrlf(); + + while(1); } // TIMER FUNCTIONS @@ -73,7 +86,12 @@ void handle_timer_1() { REGS_TIMER->control_status |= SYS_TIMER_IRQ_1; unsigned int progval = timer1_val / timer1_int; - if (progval <= 100) drawProgress(2, progval); + if (progval <= 100) { + drawProgress(2, progval); + } else { + debugstr("Timer 1 done."); + debugcrlf(); + } } void handle_timer_3() { diff --git a/part13-interrupts/kernel/kernel.h b/part13-interrupts/kernel/kernel.h index 4bdae32..0796c2a 100644 --- a/part13-interrupts/kernel/kernel.h +++ b/part13-interrupts/kernel/kernel.h @@ -40,6 +40,7 @@ void irq_init_vectors(); void irq_enable(); void irq_disable(); void enable_interrupt_controller(); +void disable_interrupt_controller(); void handle_timer_1(); void handle_timer_3();