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.