1
OS-Design / Ordentliche ms genaue Sleep Funktion (Delay)
« am: 13. March 2014, 19:23 »
Hallo liebe Community,
ich habe mir schon einige Beispiele an Sleep Funktionen angeschaut und einiges getestet.
Von asm("nop"); Schleifen bis hin zu komplizierten Timer.
Bisher an mich nichts richtig zufrieden gestellt, aber ich bin im Moment an diesem Modell hängen geblieben:
Am Timer 1, der eigentlich das Multitasking steuert steht folgendes:
TIMER_ITR():
Wie man sieht ist diese Sleep-Funktion nur 10ms "genau". Sprich der Timer wird jede 10ms ausgelöst. (100Hz) Ich benötige allerdings für das Multitasking eine niedrige Frequenz, vielleicht 10Hz, also jede 100ms. Dann würde meine Sleepfunktion allerdings um 100ms ungenau gehen.
Das Ziel ist es aber meine Task mit 10Hz zu wechseln und meine Sleepfunktion auch nur 1ms warten zu lassen.
Ist den mein jetziges Model dafür überhaupt geeignet? Sollte ich etwas ganz anderes Verfolgen?
Wie habt ihr dieses Funktion gelöst?
Seltsam ist bei meiner Varriante von Sleep-Funktion auch, dass vor dem Multitasking (aber schon aktivem Timer IRQ) meine Sleep-Funktion die Zeit abwartet und es danach weiter im Kernel geht. Sobald das Multitasking aktiv ist, sprich auch Task laufen & ich dann z.B. mein Floppy-Laufwerk ansteuer und die Sleepfunktion aufgerufen wird kommt er nicht mehr aus der while Schleife herraus.
Ich freue mich auf eure Idee, Vorschläge und Anregungen...
L.G.
ich habe mir schon einige Beispiele an Sleep Funktionen angeschaut und einiges getestet.
Von asm("nop"); Schleifen bis hin zu komplizierten Timer.
Bisher an mich nichts richtig zufrieden gestellt, aber ich bin im Moment an diesem Modell hängen geblieben:
Code: [Auswählen]
void sleep(uint32_t ms)
{
SLEEP_ACTIV_STATE = 1;
uint64_t cur = tick_counter;
while((cur+ms) >= tick_counter);
SLEEP_ACTIV_STATE = 0;
return;
}
Am Timer 1, der eigentlich das Multitasking steuert steht folgendes:
Code: [Auswählen]
if (cpu->intr == 0x20) { //TIMER
TIMER_ITR();
new_cpu = schedule(cpu);
tss[1] = (uint32_t) (new_cpu + 1);
new_cpu = cpu;
}
TIMER_ITR():
Code: [Auswählen]
void TIMER_ITR(void)
{
tick_counter += 10;
}
Wie man sieht ist diese Sleep-Funktion nur 10ms "genau". Sprich der Timer wird jede 10ms ausgelöst. (100Hz) Ich benötige allerdings für das Multitasking eine niedrige Frequenz, vielleicht 10Hz, also jede 100ms. Dann würde meine Sleepfunktion allerdings um 100ms ungenau gehen.
Das Ziel ist es aber meine Task mit 10Hz zu wechseln und meine Sleepfunktion auch nur 1ms warten zu lassen.
Ist den mein jetziges Model dafür überhaupt geeignet? Sollte ich etwas ganz anderes Verfolgen?
Wie habt ihr dieses Funktion gelöst?
Seltsam ist bei meiner Varriante von Sleep-Funktion auch, dass vor dem Multitasking (aber schon aktivem Timer IRQ) meine Sleep-Funktion die Zeit abwartet und es danach weiter im Kernel geht. Sobald das Multitasking aktiv ist, sprich auch Task laufen & ich dann z.B. mein Floppy-Laufwerk ansteuer und die Sleepfunktion aufgerufen wird kommt er nicht mehr aus der while Schleife herraus.
Ich freue mich auf eure Idee, Vorschläge und Anregungen...
L.G.