在本次实验中,我们使用以下代码对8253可编程计时器进行设置,使得8253以频率 HZ 产生时间中断信号发送给 8259A可编程中断控制器;若依照代码框架 lab2/kernel/kernel/i8259.c 中给出的配置示例对8259A 进行设置,时间中断的中断向量为 0x20。
#define TIMER_PORT 0x40
#define FREQ_8253 1193182
#define HZ 100
//#define HZ 1000
void initTimer() {
int counter = FREQ_8253 / HZ;
outByte(TIMER_PORT + 3, 0x34);
outByte(TIMER_PORT + 0, counter % 256);
outByte(TIMER_PORT + 0, counter / 256);
}
选择哪种工作模式,如何去工作......这些问题都通过配置控制字来进行。那么控制字又是什么呢?我们知道,每个端口对应于一个字节,也就是8bit,如下图。我们控制这一个字节中的每一比特即可成功设置8253。
这里中断的初始值被设置为11932,这是我们想要中断信号的频率为100Hz(每秒发生100次中断)。 即1.19318Mhz(计数器的频率)/100 = 11932。计数器往往是倒计时,也就是说,计数器每跳动11932次就会触发一次时钟中断。