|
一、功能
这个函数通过设置 PC 上的 8254 芯片,以产生所需要的溢出频率。
二、代码如下:
void PC_SetTickRate (INT16U freq)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT16U count;
if (freq == 18) { /*PC 中默认的时钟节拍默认为18HZ,即8254从0计数直到溢出*/
count = 0;
} else if (freq > 0) {
/* 需要计算出装载进 8254 的值*/
/* 需要进行四舍五入的补偿*/
count = (INT16U)(((INT32U)2386360L / freq + 1) >> 1);
} else {
count = 0;
}
OS_ENTER_CRITICAL();
outp(TICK_T0_8254_CWR, TICK_T0_8254_CTR0_MODE3); /*设置模式 */
outp(TICK_T0_8254_CTR0, count & 0xFF); /*装低字节*/
outp(TICK_T0_8254_CTR0, (count >> 8) & 0xFF); /*装高字节*/
OS_EXIT_CRITICAL();
} 三、说明:
1、装载计数值计算公式:
1193180.0 Hz
count = ------------ + 0.5
freq
因为装载进计数器的是整数,为了取得最接近的整数值,所以进行四舍五入补偿,故需加上 0.5。
2、函数 outp:
nt _inp( unsigned short port );
int _outp( unsigned short port, int databyte );
_inp原型为:
int _inp(unsigned short port);
port参数为指定的输入端口号。调用后,它从port参数指定的端口读入并返回一个字节,输入值可以是在0—255范围内的任意无符号整数值。
_outp原型为:
int _outp(unsigned short port, int databyte );
port 参数为指定的输出端口号,databyte 参数为输出的值。调用后,它将databyte参数指定的值输出到port 参数指定的端口并返回该值。databyte 可以是0—255范围内的任何整数值。
这两个函数都没有错误值返回。
所在库为bios.h
在Win98下可以直接用, 但在NT下必须要挂driver |
|