PIT

Programmable Interval Timer

This is a small chip on every system that runs at a fixed frequency of 1193182Hz. This also then sends interrupts (0x20) to the kernel telling it that it has ticked.

Since 1193182Hz is a lot of interrupts, we set a divisor on the chip telling it to only send a interrupt at a frequency we can choose

This is used to create sleep functions and control the scheduling of processes.

Timer Events

A addon to the PIT is the timer events. Effectively this works using a call-back event defined with

using TimerCallback = void(*)(void*);

and so on the event call-back a simple address of data can be passed in.

The method of organising the events is by giving an event a time till finished and all events after is have the difference. So the shortest is at the front of the list (Fast list).

pendingTicks++;
if (!(acquireTestLock(&sleepQueueLock))) {
	while (sleeping.get_length() &&
		pendingTicks-- >
			0) {
		TimerEvent* cnt = sleeping.get_front();

		assert(cnt);
		cnt->ticks--;

		if (cnt->ticks <= 0) {
			sleeping.get_front()->Dispatch();

			while (sleeping.get_length() && sleeping.get_front()->ticks <= 0) {
				sleeping.get_front()->Dispatch();
			}
		}
	}
	pendingTicks = 0;

	releaseLock(&sleepQueueLock);
}

Last updated