From 05a6f2fcf4556ba9f3d0384c07554c387f6efba2 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Tue, 4 Jul 2017 22:23:37 +0200 Subject: got scheduling of task A and B working (now graphics output and termination is broken) --- src/kernel/kernel.c | 31 ++++++++++++++++++++++++++++++- src/kernel/tasks.c | 2 +- src/kernel/tasks.h | 2 +- 3 files changed, 32 insertions(+), 3 deletions(-) (limited to 'src/kernel') diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 9a9f32e..b9beeb1 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -26,6 +26,8 @@ #include "text_widget.h" #include "window.h" +#include "tasks.h" + static jmp_buf panic_jmp_buf; static void handle_keyboard_event( keyboard_event_t *event, void *context ); @@ -53,6 +55,9 @@ typedef struct { static global_context_t global_context; +static void funcA( ); +static void funcB( ); + // must be first entry in kernel.bin (0x8800) as stage 2 of // the boot loader expects the entry point to be here! void kernel_main( void ) @@ -83,9 +88,19 @@ void kernel_main( void ) goto TERMINATE; } + // TODO: two demo tasks for now, later we should do something useful in a task + task_manager_t task_manager; + task_manager_init( &task_manager ); + task_t taskA; + task_init( &taskA, GDT_CODE_SEGMENT_SELECTOR, &funcA ); + task_manager_add_task( &task_manager, &taskA ); + task_t taskB; + task_init( &taskB, GDT_CODE_SEGMENT_SELECTOR, &funcB ); + task_manager_add_task( &task_manager, &taskB ); + puts( "Initializing interrupts" ); interrupt_t interrupt; - interrupts_init( &interrupt ); + interrupts_init( &interrupt, GDT_CODE_SEGMENT_SELECTOR, &task_manager ); puts( "Initializing drivers" ); driver_manager_init( &global_context.driver_manager ); @@ -362,3 +377,17 @@ static void handle_mouse_event( mouse_event_t *event, void *context ) break; } } + +static void funcA( ) +{ + while( true ) { + printf( "A" ); + } +} + +static void funcB( ) +{ + while( true ) { + printf( "B" ); + } +} diff --git a/src/kernel/tasks.c b/src/kernel/tasks.c index 164409a..4dd7f38 100644 --- a/src/kernel/tasks.c +++ b/src/kernel/tasks.c @@ -3,7 +3,7 @@ #include "kernel.h" #include "string.h" -void task_init( task_t *task, uint16_t gdt_code_segment_selector, task_func_t *entrypoint ) +void task_init( task_t *task, uint16_t gdt_code_segment_selector, task_func_t entrypoint ) { memset( task, 0, sizeof( task_t ) ); diff --git a/src/kernel/tasks.h b/src/kernel/tasks.h index 604c463..523631b 100644 --- a/src/kernel/tasks.h +++ b/src/kernel/tasks.h @@ -47,7 +47,7 @@ typedef struct { typedef void (*task_func_t)( void ); -void task_init( task_t *task, uint16_t gdt_code_segment_selector, task_func_t *entrypoint ); +void task_init( task_t *task, uint16_t gdt_code_segment_selector, task_func_t entrypoint ); #define MAX_NOF_TASKS 256 -- cgit v1.2.3-54-g00ecf