
use Time::HiRes qw( gettimeofday );
my ($seconds, $microseconds) = gettimeofday;
秒 , 微秒, 计算一下就是毫秒了, perl模块中有不少与linux函数同名同功能的函数都可以直接用的,主要搜一下在哪个模块中,在perl的模块代码中搜,或者查看perldoc去查
楼上的想让你的程序变成悲剧linux下sleep函数的参数是秒为单位的休眠200秒
睡眠小于1秒用usleep,单位是毫秒
所以,楼上的程序把sleep改成usleep就可以 了
while(1)
{
/ any thing you want to do/
usleep(200);
}
另外我觉得你要说的好像是:希望while循环执行某些 *** 作,执行时间到200毫秒之后退出while循环?
最简单是用间隔定时器
你查下这几个函数:timer_create,timer_settime等。
时间设置比较精确,可以设置一段时间间隔,过了指定的时间之后,会给当前进程发送一个SIGALRM信号,你while循环的条件,可以在SIGALRM的信号处理函数里面修改,这样,到时间之后while就可以退出了
这样写:
//
static char flag=1
int main(void)
{
signal(SIGALRM, timer_handler);
/
申请并且设置间隔定时器的间隔
/
while(flag)
{
/循环内的 *** 作/
}
return 0;
}
void timer_handler(unsigned int signal)
{
flag=0;
}
1 RTC(Real Time Clock)
所有PC都有RTC 它和CPU和其他芯片独立。它在电脑关机之后还可以正常运行。RTC可以在IRQ8上产生周期性中断 频率在2Hz--8192HZ
Linux只是把RTC用来获取时间和日期 当然它允许进程通过对/dev/rtc设备来对它进行编程。Kernel通过0x70和0x71 I/O端口来访问RTC。
2 TSC(Time Stamp Counter)
80x86上的微处理器都有CLK输入针脚 从奔腾系列开始 微处理器支持一个计数器 每当一个时钟信号来的时候 计数器加1 可以通过汇编指令rdtsc来得到计数器的值。通过calibrate_tsc可以获得CPU的频率 它是通过计算大约5毫秒里tsc寄存器里面的增加值来确认的。或者可以通过cat /proc/cpuinfo来获取cpu频率。tsc可以提供比PIT更精确的时间度量。
3 PIT(Programmable internval timer)
除了RTC和TSC IBM兼容机提供了PIT。PIT类似微波炉的闹钟机制 当时间到的时候 提供铃声 PIT不是产生铃声 而是产生一种特殊中断 叫定时器中断或者时钟中断。它用来告诉内核一个间隔过去了。这个时间间隔也叫做一个滴答数。可以通过编译内核是选择内核频率来确定。如内核频率设为1000HZ,则时间间隔或滴答为1/1000=1微秒。滴答月短 定时精度更高 但是用户模式的时间更短 也就是说用户模式下程序执行会越慢。滴答的长度以纳秒形式存在tick_nsec变量里面。PIT通过8254的0x40--0x43端口来访问。它产生中断号为IRQ 0
下面是关于pIT里面的一些宏定义:
HZ:每秒中断数。
CLOCK_TICK_RATE:值是1,193,182 它是8254芯片内部振荡器频率。
LATCH:代表CLOCK_TICK_RATE和HZ的比率 被用来编程PIT。
setup_pit_timer()如下:
spin_lock_irqsave(&i8253_lock, flags);
outb_p(0x34,0x43);
udelay(10);
outb_p(LATCH & 0xff, 0x40);
udelay(10);
outb (LATCH >> 8, 0x40);
spin_unlock_irqrestore(&i8253_lock, flags);
4 CPU Local Timer
最近的80x86架构的微处理器上的local apic提供了cpu local timer他和pit区别在于它提供了one-shot和periodic中断。它可以使中断发送到特定cpu。one-shot中断常用在实时系统里面。
以上就是关于如何在perl里取得毫秒级的时间全部的内容,包括:如何在perl里取得毫秒级的时间、在linux环境下c语言中如何让while循环执行固定的时间如200毫秒、linux下的几种时钟和定时器机制等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)