利用系统定时中断
来源:互联网 发布:双色球参选数据准不准 编辑:程序博客网 时间:2024/05/01 18:21
利用系统定时中断
在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;
}
}
- 利用系统定时中断
- 定时与中断系统
- 中断定时
- Oracle 利用系统任务计划定时备份
- (二)单片机内部定时/计数器和中断系统
- 2440定时中断
- arduino的定时中断
- s3c2440定时器,定时中断
- stm32定时中断
- STM32_TIM定时-中断
- 单片机中断定时
- STM32F4定时器 -- 定时中断
- STM8S_003_TIM定时中断
- STM8S_003_TIM定时中断
- ARM之定时中断
- 利用系统外部中断做PS键盘信号接收
- 利用crontab,系统每天定时备份mysql数据库
- Linux系统利用Crontab命令实现定时重启
- 讨人喜欢的26条启示
- 低下脑袋做程序员
- SNMP的工作原理
- 《伤城》也看完了
- 【读网】最火网站背后的脚本语言,2007年XML十大预测,Java in 2007,Windows Vista内核揭密……
- 利用系统定时中断
- zoj 2132 The Most Frequent Number
- 用Ruby on Rails做的网站
- 计算机科学中引用最多的数学书
- 测试员的工作效率和所查毛病的数量
- ubuntu小技巧
- MySQL数据导入与导出
- 妙用磁盘配额 让黑客无从下手
- 2006年,程序员更“薪福”了吗?——中国软件开发者年度薪资调查报告