[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