[Geekos-devel] Finished timer code
Status: Pre-Alpha
Brought to you by:
daveho
From: Parc <ne...@ri...> - 2002-01-17 19:33:28
|
01, the perils of bochs. Attached is the code to set the 8254 for a 100Hz clock, as well as a crude sleep(). Obey the notes in sleep or it'll bite you badly. A bochs note: If you don't have ips set correctly, this code will appear to be wrong. It's not. It sets the timer correctly. I've tested it on an old toshiba laptop and it indeed works. As a side note, my macro to figure the register setting for the timer is different than, well, every other macro I've been able to find. Can anybody possible explain this? It doesn't make any sense to me. Please, if it breaks anything, let me know. -parc On Tue, Jan 15, 2002 at 10:33:36AM -0600, Parc wrote: > On Mon, Jan 14, 2002 at 12:23:27PM -0500, David Hovemeyer wrote: > > I tried your patch, and it seems to work fine, although the messages > > print out more than once per second. > > That's what I've got here. Just wanted to make sure it wasn't something > else I've got in my other addons(ne2k and DMA). > > > > > I like the idea of being able to specify the rate of the timer > > interrupts. Maybe you could explain how this works in more detail? > > Sure. All I'm doing here is setting the 8254 to interrupt 100 times/s. > The 8254 has several timing modes. The one we care about it rategen, > which will count down from the number of ticks given to 0, fire off > IRQ 0, set its counter back to our setting, rinse, and repeat. For > some reason(most likely stupidity on my part), my stupid spinlock sleep > isn't working as planned. > For more info on the 8254, you can look at intel. Sorry, I don't have > the URL handy. > > parc > > > > > -Dave > > > > > > On Fri, Jan 11, 2002 at 11:15:02PM -0600, Parc wrote: > > > I've munged together a couple lines to set the timer to 10ms jiffies, > > > and added a sleep(). Could somebody try these out for me? For some > > > reason I don't get the correct timing occasionally. This patch should > > > cause the kernel to loop saying "tick" once a second. > > > > > > Thanks > > > > > > Index: drivers/timer.c > > > =================================================================== > > > RCS file: /cvsroot/geekos/drivers/timer.c,v > > > retrieving revision 1.2 > > > diff -c -r1.2 timer.c > > > *** drivers/timer.c 2001/12/24 15:35:57 1.2 > > > --- drivers/timer.c 2002/01/12 05:10:29 > > > *************** > > > *** 11,16 **** > > > --- 11,20 ---- > > > #include "sys/geekos/kthread.h" > > > #include "sys/geekos/timer.h" > > > > > > + #define TICKRATE 1193182 > > > + //#define FIND_RATE(hz) (((TICKRATE + hz) / 2) / hz) > > > + #define FIND_RATE(hz) (((TICKRATE + hz) / 2) / hz) > > > + > > > // global tick counter > > > volatile unsigned long g_numTicks; > > > > > > *************** > > > *** 56,61 **** > > > --- 60,72 ---- > > > > > > Print( "Initializing timer...\n" ); > > > > > > + //Set the tick rate to 10ms > > > + disable_interrupts(); > > > + out_byte(0x043, 0x34); > > > + out_byte(0x040, FIND_RATE(100) & 0xff); > > > + out_byte(0x040, FIND_RATE(100) >> 8); > > > + enable_interrupts(); > > > + > > > // Install an interrupt handler for the timer IRQ > > > install_irq( TIMER_IRQ, &timer_interrupt_handler ); > > > > > > *************** > > > *** 63,66 **** > > > --- 74,83 ---- > > > irqMask = get_irq_mask(); > > > irqMask &= ~(1 << TIMER_IRQ); > > > set_irq_mask( irqMask ); > > > + } > > > + > > > + void sleep(int time) { > > > + long start = g_numTicks + time +1; > > > + Print("Sleeping from %x to %x\n",g_numTicks,start); > > > + while((g_numTicks - start) > 0) ; //spin > > > } > > > Index: include/sys/geekos/timer.h > > > =================================================================== > > > RCS file: /cvsroot/geekos/include/sys/geekos/timer.h,v > > > retrieving revision 1.2 > > > diff -c -r1.2 timer.h > > > *** include/sys/geekos/timer.h 2001/12/24 15:35:57 1.2 > > > --- include/sys/geekos/timer.h 2002/01/12 05:10:29 > > > *************** > > > *** 13,17 **** > > > --- 13,18 ---- > > > extern volatile unsigned long g_numTicks; > > > > > > void init_timer( void ); > > > + void sleep( int time ); > > > > > > #endif // TIMER_H > > > Index: kern/main.c > > > =================================================================== > > > RCS file: /cvsroot/geekos/kern/main.c,v > > > retrieving revision 1.6 > > > diff -c -r1.6 main.c > > > *** kern/main.c 2001/12/24 15:35:57 1.6 > > > --- kern/main.c 2002/01/12 05:10:30 > > > *************** > > > *** 51,56 **** > > > --- 53,62 ---- > > > // Test Join() function > > > { > > > struct kernel_thread* child; > > > + for(; ;) { > > > + sleep(100); > > > + Print("tick.\n"); > > > + } > > > Print( "Starting child...\n" ); > > > child = start_kernel_thread( &test_join, 0, PRIORITY_NORMAL, FALSE ); > > > Join( child ); > > > > > > > > _______________________________________________ > Geekos-devel mailing list > Gee...@li... > https://lists.sourceforge.net/lists/listinfo/geekos-devel > |