利用系统定时中断
2007-02-28 01:14
253 查看
利用系统定时中断
在PC机中采用了可编程定时/计数芯片8253,计数器0工作在方式3,用OUT0产生时钟信号。OUT0作为中断请求信号接可编程中断控制器8259A的IR0(系统中IRQ0)。由于fCLK≈1.19MHz,TCLK≈840ns,因此8253初值为65536时,大约每840ns*65536≈55ms中断一次。可以读取计数器的当前计数值,计数器值每减一,代表时间840ns,另加上计数器是否计满的判断,则可计算出时间的精确值。
8253的6种工作方式的设置是在初始化时用输出指令写控制字来实现的,其中,方式0为在结束计数时中断。
调用VC++运行库函数clock(),可以获得本次程序运行由处理器用去的ms时间,由此可判断出计数器是否计满。具体程序代码如下:
// 延时函数
void Ddelay(unsigned long n)
{
unsigned long Told;
unsigned long nn,old_Clock, new_Clock, low, high, v_8253;
unsigned long old_8253, new_8253, int_Time;
// nn单位: 840ns
nn =(unsigned long)((float)n*1000/840);
// 锁定8253计数值
_outp(0x43,0x00);
// 读取8253计数值
low = _inp(0x40);
high = _inp(0x40);
v_8253 = low + 256 * high;
old_8253 = v_8253;
old_Clock=clock();
Told=old_Clock;
int_Time=0;
while(int_Time < nn)
{
_outp(0x43,0x00);
low = _inp(0x40);
high = _inp(0x40);
v_8253 = low + 256 * high;
new_8253 = v_8253;
new_Clock=clock();
if(old_8253< new_8253 && new_Clock-Told< 55)
int_Time=(old_8253-new_8253)+((new_Clock-old_Clock)/55+1)*65536lu;
else
int_Time=(old_8253-new_8253)+((new_Clock-old_Clock)/55)*65536lu;
Told=new_Clock;
}
}
在PC机中采用了可编程定时/计数芯片8253,计数器0工作在方式3,用OUT0产生时钟信号。OUT0作为中断请求信号接可编程中断控制器8259A的IR0(系统中IRQ0)。由于fCLK≈1.19MHz,TCLK≈840ns,因此8253初值为65536时,大约每840ns*65536≈55ms中断一次。可以读取计数器的当前计数值,计数器值每减一,代表时间840ns,另加上计数器是否计满的判断,则可计算出时间的精确值。
8253的6种工作方式的设置是在初始化时用输出指令写控制字来实现的,其中,方式0为在结束计数时中断。
调用VC++运行库函数clock(),可以获得本次程序运行由处理器用去的ms时间,由此可判断出计数器是否计满。具体程序代码如下:
// 延时函数
void Ddelay(unsigned long n)
{
unsigned long Told;
unsigned long nn,old_Clock, new_Clock, low, high, v_8253;
unsigned long old_8253, new_8253, int_Time;
// nn单位: 840ns
nn =(unsigned long)((float)n*1000/840);
// 锁定8253计数值
_outp(0x43,0x00);
// 读取8253计数值
low = _inp(0x40);
high = _inp(0x40);
v_8253 = low + 256 * high;
old_8253 = v_8253;
old_Clock=clock();
Told=old_Clock;
int_Time=0;
while(int_Time < nn)
{
_outp(0x43,0x00);
low = _inp(0x40);
high = _inp(0x40);
v_8253 = low + 256 * high;
new_8253 = v_8253;
new_Clock=clock();
if(old_8253< new_8253 && new_Clock-Told< 55)
int_Time=(old_8253-new_8253)+((new_Clock-old_Clock)/55+1)*65536lu;
else
int_Time=(old_8253-new_8253)+((new_Clock-old_Clock)/55)*65536lu;
Told=new_Clock;
}
}
相关文章推荐
- 利用Centos 7内置的 crontab 进行系统的定时关机 格式: * * * * * command 分 时 日 月 周 命令 1 2 3 #编辑定时任务: crontab -e
- 利用crontab,系统每天定时备份mysql数据库
- 第七节:在主函数中利用累计定时中断的次数来实现独立按键的检测
- 利用系统外部中断做PS键盘信号接收
- Linux系统利用Crontab命令实现定时重启
- Linux系统利用Crontab命令实现定时重启
- Linux系统利用Crontab命令实现定时重启
- Linux系统利用Crontab命令实现定时重启
- 定时与中断系统
- 嵌入式Linux低功耗利用busybox制作rtcwake定时唤醒系统
- Oracle 利用系统任务计划定时备份
- 利用crontab系统每天定时备份MySQL数据库及删除指定crontab定时任务
- linux下crontab的使用及利用crontab系统定时处理事务
- linux上利用crontab定时备份postgres数据库及文件到windows系统
- C语言 计时器的实现(利用系统55ms中断计时)
- 利用crontab,系统每天定时备份mysql数据库
- Linux系统利用Crontab命令实现定时重启
- 利用crontab系统每天定时备份MySQL数据库
- 利用开源工具搭一套汉英翻译系统(二):词对齐
- Raw-OS源码分析之系统tick中断