曲径通幽论坛

标题: PC_SetTickRate [打印本页]

作者: beyes    时间: 2009-4-14 01:38
标题: PC_SetTickRate
一、功能
这个函数通过设置 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




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2