Autor Thema: Timernterrupt kommt bei Multitasking nicht  (Gelesen 2118 mal)

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« am: 11. April 2012, 17:01 »
Ich hab gehofft, das bekomme ich wenigstens selber hin....

Ja, sobald mein Kernel im ersten Task (task_a) ist, wird kein IRQ, also kein Timerinterrupt mehr ausgelöst.
#include <stdint.h>
#include "interrupt.h"
#include "cpu.h"
#include "console.h"


/* ---------- Globale Variablen ----------------------- */
static uint8_t stack_a[4096];
static uint8_t stack_b[4096];

static int current_task = -1;
static int num_tasks = 2;
static cpu_state* task_states[2];
/* --------- Tasks ------------- */
void task_a(void){
  while(1){
    setColor(0x02);
    printf("A");
  }
}
void task_b(void){
  while(1){
    setColor(0x06);
    printf("B");
  }
}
/* ---------- Task initalisieren ---------------------- */
cpu_state* init_task(uint8_t *stack, void *entry){
    cpu_state new_state = {
.eax = 0,
.ebx = 0,
.ecx = 0,
.edx = 0,
.esi = 0,
.edi = 0,
.ebp = 0,
        //.esp = Unbenutzt
.eip = (uint32_t) entry,

// Ring-0 Segmentregister
.cs = 0x08,
//.ss = unbenutzt

//IRQs einschalten
.eflags = 0x202,
    };
   
    cpu_state *state = (void*) (stack + 4096 - 56/*sizeof(new_state)*/);
    *state = new_state;
   
    return state;
}
/* ---------- Multitasking initalisieren -------------- */
void init_multitasking(void){
    task_states[0] = init_task(stack_a, task_a);
    task_states[1] = init_task(stack_b, task_b);
}
/* ---------- Scheduler ------------------------------- */
cpu_state* schedule(cpu_state *cpu){
   
    // Alten zustand des Tasks sichern
    if(current_task >= 0){
task_states[current_task] = cpu;
    }
   
    // Nächsten Task auswählen
    current_task++;
    current_task %= num_tasks;
   
    // Neuen Task aktivieren
    cpu = task_states[current_task];
   
    return cpu;
}

/* --------- ENDE -- multitasking.c ---*/

Also hab ich ersmal folgendes gemacht:
/* --------- Tasks ------------- */
void task_a(void){
  while(1){
    setColor(0x02);
    printf("A");
    asm("int $0x20");
  }
}
void task_b(void){
  while(1){
    setColor(0x06);
    printf("B");
    asm("int $0x20");
  }
}
Da funktionierts! aber das ist ja keine Lösung.

init_multitasking rufe ich auch vor cli auf.

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 11. April 2012, 20:31 »
Entschuldige, dass ich jetzt diesen Thread erstellt habe, aber immer wenn ich was im Forum frage und niemand antwortet, finde ich den Fehler schnell ( vielleicht sollte ich das öfters machen  :wink: ):
Ich habe den eoi erst nach dem herstallen der cpu gesendet! Der sollte eher kommen! Es geht! :lol: 8-)

 

Einloggen