[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH 1/8] kernel2: Idle-Task



+ kernel2: Ein Idle-Task, der dann zum Zug kommt, wenn alle anderen
  Tasks blockiert sind. Im Moment passiert das am Anfang des
  Bootvorgangs ein paarmal.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/kernel2/src/tasks/pm.c        |   25 ++++++++++++++++++++++++-
 src/kernel2/src/tasks/scheduler.c |   13 +++++++++++--
 2 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/src/kernel2/src/tasks/pm.c b/src/kernel2/src/tasks/pm.c
index b066493..94fbbbf 100644
--- a/src/kernel2/src/tasks/pm.c
+++ b/src/kernel2/src/tasks/pm.c
@@ -60,15 +60,38 @@ static pid_t next_pid = 1;
 
 extern void scheduler_init(void);
 extern pm_process_t init_process;
+extern pm_thread_t* idle_task;
+
+/**
+ * Implementierung des Idle-Task
+ */
+static void idle(void)
+{
+    while(1) {
+        asm volatile("hlt");
+    }
+}
 
 /**
  * Die Prozessverwaltung initialisieren
  */
 void pm_init()
 {
+    interrupt_stack_frame_t* isf;
+
     // Prozessliste erstellen
     process_list = list_create();
-    
+
+    // Idle-Task erstellen
+    idle_task = pm_thread_create(&init_process, &idle);
+    isf = (interrupt_stack_frame_t*) idle_task->kernel_stack;
+    isf->cs = 0x08;
+    isf->ss = 0x10;
+    isf->ds = 0x10;
+    isf->es = 0x10;
+    pm_scheduler_delete(idle_task);
+
+    // Scheduler initialisieren
     scheduler_init();
 }
 
diff --git a/src/kernel2/src/tasks/scheduler.c b/src/kernel2/src/tasks/scheduler.c
index 84c7348..7c7c4ce 100644
--- a/src/kernel2/src/tasks/scheduler.c
+++ b/src/kernel2/src/tasks/scheduler.c
@@ -53,6 +53,9 @@ static list_t* threads_scheduled;
 /// Lock
 static lock_t scheduler_lock;
 
+/// Idle-Task
+pm_thread_t* idle_task;
+
 /**
  * Scheduler initialisieren
  */
@@ -154,7 +157,7 @@ pm_thread_t* pm_scheduler_pop()
     thread = list_pop(threads_scheduled);
 
     // Falls das nicht geklappt hat, wird solange probiert, 
-    while (thread == NULL) {
+    if (thread == NULL) {
         // FIXME: Das ist so nicht wirklich geschickt, wenn der aufrufer dafür
         // sorgen muss, dass wir nicht hängen bleiben.
         unlock(&scheduler_lock);
@@ -164,9 +167,15 @@ pm_thread_t* pm_scheduler_pop()
 
         // FIXME: s.o
         lock(&scheduler_lock);
-        
+
         // Ein weiterer Versuch, einen Thread zu erhalten.
+        // Wenn dann immer noch keiner bereit ist, kommt der Idle-Task zum Zug
         thread = list_pop(threads_scheduled);
+        if (thread == NULL) {
+            unlock(&scheduler_lock);
+            idle_task->status = PM_STATUS_RUNNING;
+            return idle_task;
+        }
     }
 
     // Sobald der richtige Thread gefunden wurde, kann der Scheduler wieder
-- 
1.6.0.2