Velkommen til et andet indlæg om hvordan man opretter vores eget operativsystem (Tidligere artikler i serien: 1, 2, 3, 4, 5 y 6). Det har været lang tid siden sidste indlæg, hovedsagelig på grund af en fejl, som jeg fandt i det, vi har i dag. Vi vil se hvordan man håndterer uret på x86-arkitekturer.
Tidligere havde vi aktiveret IRQ'erne på en generisk måde, men der var et lille problem, da vi ikke aktiverede dem korrekt, og vi sendte ekstra data. Vi ordner det endelig carlosorta og jeg og jeg kan fortsætte med at kommentere, hvordan vi fortsætter.
Uret er en IRQ, specifikt den første. For at konfigurere det bruger vi den funktion, som vi definerede ovenfor, til generelt at installere IRQ'erne, ND_IRQ_InstallHandler.
int ND_TIMER_TICKS = 0; ugyldigt ND :: Timer :: Fase (int hz) {int divisor = 1193180 / hz; ND :: Porte :: OutputB (0x43,0x36); ND :: Porte :: OutputB (0x40, divisor & 0xFF); ND :: Porte :: OutputB (0x40, divisor >> 8); } ugyldigt ND :: Timer :: Vent (int kryds) {usignerede lange eticks; eticks = ND_TIMER_TICKS + flåter; mens (ND_TIMER_TICKS <eticks) {ugyldig ND :: Timer :: Opsætning () {ND :: Skærm :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Skærm :: PutString ("\ nSetup timer ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Skærm :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Skærm :: PutString ("færdig"); } ekstern "C" ugyldig ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; hvis (ND_TIMER_TICKS% 18 == 0) {// ND :: Skærm :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Skærm :: PutString ("\ nEn sekund mere"); VI SKAL GØRE EN OPFRISKT SKÆRM}}
Koden kører som følger: initialiseringssystemet kalder op ND :: Timer :: Opsætning, der ringer ND_IRQ_InstallHandler at indsætte i den første position, IRQ0, en tilbagekaldsfunktion, når begivenheden finder sted, dvs. ND_Timer_Handler der øger flåter. Da vi har indstillet urets hastighed til 18 Hz, som vi vil se senere, hvis vi delte den med 18 og gav os et heltal, ville et sekund passere.
Funktionen ND :: Timer :: Fase Det hjælper os med at justere hastigheden på timer, det ekstravagante tal er 1.19 MHz, hvilket er en fælles værdi. Denne funktion skal kaldes, hvis vi vil ændre hastigheden på timer, som standard går det til 18,22 Hz, en ejendommelig værdi, som nogen skal have besluttet inden for IBM og det har været den dag i dag.
Funktionen ND :: Timer :: Vent det er ret simpelt, bare vent med en løkke mens indtil flåter nødvendigt for at fortsætte.
På billedet kan vi se, at hvis vi kommenterer koden inde i ND_Timer_Handler, får vi dette:
I det næste kapitel vil vi se, hvordan man læser tastaturinput og laver lidt Shell at interagere med vores system. Som altid koden er tilgængelig i GitHub under licensen GNU GPL v2.